Merge branch 'vendor/NCURSES'
[dragonfly.git] / contrib / binutils-2.25 / include / opcode / metag.h
1 /* Imagination Technologies Meta opcode table.
2    Copyright (C) 2013-2014 Free Software Foundation, Inc.
3    Contributed by Imagination Technologies Ltd.
4
5    This file is part of GDB and GAS.
6
7    GDB and GAS are free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 3, or (at
10    your option) any later version.
11
12    GDB and GAS are distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with GDB or GAS; see the file COPYING3.  If not, write to the
19    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
20    MA 02110-1301, USA.  */
21
22 enum metag_unit
23 {
24   UNIT_CT,
25   UNIT_D0,
26   UNIT_D1,
27   UNIT_A0,
28   UNIT_A1,
29   UNIT_PC,
30   UNIT_RD,
31   UNIT_TR,
32   UNIT_TT,
33   UNIT_FX,
34   UNIT_DT,                      /* DSP Template Table */
35   UNIT_ACC_D0,
36   UNIT_ACC_D1,
37   UNIT_RAM_D0,
38   UNIT_RAM_D1,
39 };
40
41 typedef struct
42 {
43   const char *     name;
44   enum metag_unit  unit;
45   unsigned int     no;
46 } metag_reg;
47
48 static const metag_reg metag_regtab[] =
49   {
50     { "TXENABLE",   UNIT_CT,  0 },
51     { "CT.0",       UNIT_CT,  0 },
52     { "TXMODE",     UNIT_CT,  1 },
53     { "CT.1",       UNIT_CT,  1 },
54     { "TXSTATUS",   UNIT_CT,  2 },
55     { "CT.2",       UNIT_CT,  2 },
56     { "TXRPT",      UNIT_CT,  3 },
57     { "CT.3",       UNIT_CT,  3 },
58     { "TXTIMER",    UNIT_CT,  4 },
59     { "CT.4",       UNIT_CT,  4 },
60     { "TXL1START",  UNIT_CT,  5 },
61     { "CT.5",       UNIT_CT,  5 },
62     { "TXL1END",    UNIT_CT,  6 },
63     { "CT.6",       UNIT_CT,  6 },
64     { "TXL1COUNT",  UNIT_CT,  7 },
65     { "CT.7",       UNIT_CT,  7 },
66     { "TXL2START",  UNIT_CT,  8 },
67     { "CT.8",       UNIT_CT,  8 },
68     { "TXL2END",    UNIT_CT,  9 },
69     { "CT.9",       UNIT_CT,  9 },
70     { "TXL2COUNT",  UNIT_CT, 10 },
71     { "CT.10",      UNIT_CT, 10 },
72     { "TXBPOBITS",  UNIT_CT, 11 },
73     { "CT.11",      UNIT_CT, 11 },
74     { "TXMRSIZE",   UNIT_CT, 12 },
75     { "CT.12",      UNIT_CT, 12 },
76     { "TXTIMERI",   UNIT_CT, 13 },
77     { "CT.13",      UNIT_CT, 13 },
78     { "TXDRCTRL",   UNIT_CT, 14 },
79     { "CT.14",      UNIT_CT, 14 },
80     { "TXDRSIZE",   UNIT_CT, 15 },
81     { "CT.15",      UNIT_CT, 15 },
82     { "TXCATCH0",   UNIT_CT, 16 },
83     { "CT.16",      UNIT_CT, 16 },
84     { "TXCATCH1",   UNIT_CT, 17 },
85     { "CT.17",      UNIT_CT, 17 },
86     { "TXCATCH2",   UNIT_CT, 18 },
87     { "CT.18",      UNIT_CT, 18 },
88     { "TXCATCH3",   UNIT_CT, 19 },
89     { "CT.19",      UNIT_CT, 19 },
90     { "TXDEFR",     UNIT_CT, 20 },
91     { "CT.20",      UNIT_CT, 20 },
92     { "TXCPRS",     UNIT_CT, 21 },
93     { "CT.21",      UNIT_CT, 21 },
94     { "TXCLKCTRL",  UNIT_CT, 22 },
95     { "CT.22",      UNIT_CT, 22 },
96     { "TXINTERN0",  UNIT_CT, 23 },
97     { "TXSTATE",    UNIT_CT, 23 },
98     { "CT.23",      UNIT_CT, 23 },
99     { "TXAMAREG0",  UNIT_CT, 24 },
100     { "CT.24",      UNIT_CT, 24 },
101     { "TXAMAREG1",  UNIT_CT, 25 },
102     { "CT.25",      UNIT_CT, 25 },
103     { "TXAMAREG2",  UNIT_CT, 26 },
104     { "CT.26",      UNIT_CT, 26 },
105     { "TXAMAREG3",  UNIT_CT, 27 },
106     { "CT.27",      UNIT_CT, 27 },
107     { "TXDIVTIME",  UNIT_CT, 28 },
108     { "CT.28",      UNIT_CT, 28 },
109     { "TXPRIVEXT",  UNIT_CT, 29 },
110     { "CT.29",      UNIT_CT, 29 },
111     { "TXTACTCYC",  UNIT_CT, 30 },
112     { "TXACTCYC",   UNIT_CT, 30 },
113     { "CT.30",      UNIT_CT, 30 },
114     { "TXIDLECYC",  UNIT_CT, 31 },
115     { "CT.31",      UNIT_CT, 31 },
116
117     { "D0Re0",      UNIT_D0,  0 },
118     { "D0.0",       UNIT_D0,  0 },
119     { "D0Ar6",      UNIT_D0,  1 },
120     { "D0.1",       UNIT_D0,  1 },
121     { "D0Ar4",      UNIT_D0,  2 },
122     { "D0.2",       UNIT_D0,  2 },
123     { "D0Ar2",      UNIT_D0,  3 },
124     { "D0.3",       UNIT_D0,  3 },
125     { "D0FrT",      UNIT_D0,  4 },
126     { "D0.4",       UNIT_D0,  4 },
127     { "D0.5",       UNIT_D0,  5 },
128     { "D0.6",       UNIT_D0,  6 },
129     { "D0.7",       UNIT_D0,  7 },
130     { "D0.8",       UNIT_D0,  8 },
131     { "D0.9",       UNIT_D0,  9 },
132     { "D0.10",      UNIT_D0, 10 },
133     { "D0.11",      UNIT_D0, 11 },
134     { "D0.12",      UNIT_D0, 12 },
135     { "D0.13",      UNIT_D0, 13 },
136     { "D0.14",      UNIT_D0, 14 },
137     { "D0.15",      UNIT_D0, 15 },
138     { "D0.16",      UNIT_D0, 16 },
139     { "D0.17",      UNIT_D0, 17 },
140     { "D0.18",      UNIT_D0, 18 },
141     { "D0.19",      UNIT_D0, 19 },
142     { "D0.20",      UNIT_D0, 20 },
143     { "D0.21",      UNIT_D0, 21 },
144     { "D0.22",      UNIT_D0, 22 },
145     { "D0.23",      UNIT_D0, 23 },
146     { "D0.24",      UNIT_D0, 24 },
147     { "D0.25",      UNIT_D0, 25 },
148     { "D0.26",      UNIT_D0, 26 },
149     { "D0.27",      UNIT_D0, 27 },
150     { "D0.28",      UNIT_D0, 28 },
151     { "D0.29",      UNIT_D0, 29 },
152     { "D0.30",      UNIT_D0, 30 },
153     { "D0.31",      UNIT_D0, 31 },
154
155     { "D1Re0",      UNIT_D1,  0 },
156     { "D1.0",       UNIT_D1,  0 },
157     { "D1Ar5",      UNIT_D1,  1 },
158     { "D1.1",       UNIT_D1,  1 },
159     { "D1Ar3",      UNIT_D1,  2 },
160     { "D1.2",       UNIT_D1,  2 },
161     { "D1Ar1",      UNIT_D1,  3 },
162     { "D1.3",       UNIT_D1,  3 },
163     { "D1RtP",      UNIT_D1,  4 },
164     { "D1.4",       UNIT_D1,  4 },
165     { "D1.5",       UNIT_D1,  5 },
166     { "D1.6",       UNIT_D1,  6 },
167     { "D1.7",       UNIT_D1,  7 },
168     { "D1.8",       UNIT_D1,  8 },
169     { "D1.9",       UNIT_D1,  9 },
170     { "D1.10",      UNIT_D1, 10 },
171     { "D1.11",      UNIT_D1, 11 },
172     { "D1.12",      UNIT_D1, 12 },
173     { "D1.13",      UNIT_D1, 13 },
174     { "D1.14",      UNIT_D1, 14 },
175     { "D1.15",      UNIT_D1, 15 },
176     { "D1.16",      UNIT_D1, 16 },
177     { "D1.17",      UNIT_D1, 17 },
178     { "D1.18",      UNIT_D1, 18 },
179     { "D1.19",      UNIT_D1, 19 },
180     { "D1.20",      UNIT_D1, 20 },
181     { "D1.21",      UNIT_D1, 21 },
182     { "D1.22",      UNIT_D1, 22 },
183     { "D1.23",      UNIT_D1, 23 },
184     { "D1.24",      UNIT_D1, 24 },
185     { "D1.25",      UNIT_D1, 25 },
186     { "D1.26",      UNIT_D1, 26 },
187     { "D1.27",      UNIT_D1, 27 },
188     { "D1.28",      UNIT_D1, 28 },
189     { "D1.29",      UNIT_D1, 29 },
190     { "D1.30",      UNIT_D1, 30 },
191     { "D1.31",      UNIT_D1, 31 },
192
193     { "A0StP",      UNIT_A0,  0 },
194     { "A0.0",       UNIT_A0,  0 },
195     { "A0FrP",      UNIT_A0,  1 },
196     { "A0.1",       UNIT_A0,  1 },
197     { "A0.2",       UNIT_A0,  2 },
198     { "A0.3",       UNIT_A0,  3 },
199     { "A0.4",       UNIT_A0,  4 },
200     { "A0.5",       UNIT_A0,  5 },
201     { "A0.6",       UNIT_A0,  6 },
202     { "A0.7",       UNIT_A0,  7 },
203     { "A0.8",       UNIT_A0,  8 },
204     { "A0.9",       UNIT_A0,  9 },
205     { "A0.10",      UNIT_A0, 10 },
206     { "A0.11",      UNIT_A0, 11 },
207     { "A0.12",      UNIT_A0, 12 },
208     { "A0.13",      UNIT_A0, 13 },
209     { "A0.14",      UNIT_A0, 14 },
210     { "A0.15",      UNIT_A0, 15 },
211     { "CPC0",       UNIT_A0, 16 },
212
213     { "A1GbP",      UNIT_A1,  0 },
214     { "A1.0",       UNIT_A1,  0 },
215     { "A1LbP",      UNIT_A1,  1 },
216     { "A1.1",       UNIT_A1,  1 },
217     { "A1.2",       UNIT_A1,  2 },
218     { "A1.3",       UNIT_A1,  3 },
219     { "A1.4",       UNIT_A1,  4 },
220     { "A1.5",       UNIT_A1,  5 },
221     { "A1.6",       UNIT_A1,  6 },
222     { "A1.7",       UNIT_A1,  7 },
223     { "A1.8",       UNIT_A1,  8 },
224     { "A1.9",       UNIT_A1,  9 },
225     { "A1.10",      UNIT_A1, 10 },
226     { "A1.11",      UNIT_A1, 11 },
227     { "A1.12",      UNIT_A1, 12 },
228     { "A1.13",      UNIT_A1, 13 },
229     { "A1.14",      UNIT_A1, 14 },
230     { "A1.15",      UNIT_A1, 15 },
231     { "CPC1",       UNIT_A1, 16 },
232
233     { "PC",         UNIT_PC,  0 },
234     { "PCX",        UNIT_PC,  1 },
235
236     { "RD",         UNIT_RD,  0 },
237     { "RA",         UNIT_RD, 16 },
238     { "RD",         UNIT_RD, 16 },
239     { "RAPF",       UNIT_RD, 17 },
240     { "RAM8X32",    UNIT_RD, 22 },
241     { "RAM8X",      UNIT_RD, 23 },
242     { "RABZ",       UNIT_RD, 24 },
243     { "RAWZ",       UNIT_RD, 25 },
244     { "RADZ",       UNIT_RD, 26 },
245     { "RABX",       UNIT_RD, 28 },
246     { "RAWX",       UNIT_RD, 29 },
247     { "RADX",       UNIT_RD, 30 },
248     { "RAMX",       UNIT_RD, 31 },
249     { "RAM16X",     UNIT_RD, 31 },
250
251     { "TXSTAT",     UNIT_TR,  0 },
252     { "TR.0",       UNIT_TR,  0 },
253     { "TXMASK",     UNIT_TR,  1 },
254     { "TR.1",       UNIT_TR,  1 },
255     { "TXSTATI",    UNIT_TR,  2 },
256     { "TR.2",       UNIT_TR,  2 },
257     { "TXMASKI",    UNIT_TR,  3 },
258     { "TR.3",       UNIT_TR,  3 },
259     { "TXPOLL",     UNIT_TR,  4 },
260     { "TR.4",       UNIT_TR,  4 },
261     { "TXGPIOI",    UNIT_TR,  5 },
262     { "TR.5",       UNIT_TR,  5 },
263     { "TXPOLLI",    UNIT_TR,  6 },
264     { "TR.6",       UNIT_TR,  6 },
265     { "TXGPIOO",    UNIT_TR,  7 },
266     { "TR.7",       UNIT_TR,  7 },
267
268     { "TTEXEC",     UNIT_TT,  0 },
269     { "TT.0",       UNIT_TT,  0 },
270     { "TTCTRL",     UNIT_TT,  1 },
271     { "TT.1",       UNIT_TT,  1 },
272     { "TTMARK",     UNIT_TT,  2 },
273     { "TT.2",       UNIT_TT,  2 },
274     { "TTREC",      UNIT_TT,  3 },
275     { "TT.3",       UNIT_TT,  3 },
276     { "GTEXEC",     UNIT_TT,  4 },
277     { "TT.4",       UNIT_TT,  4 },
278
279     { "FX.0",       UNIT_FX,  0 },
280     { "FX.1",       UNIT_FX,  1 },
281     { "FX.2",       UNIT_FX,  2 },
282     { "FX.3",       UNIT_FX,  3 },
283     { "FX.4",       UNIT_FX,  4 },
284     { "FX.5",       UNIT_FX,  5 },
285     { "FX.6",       UNIT_FX,  6 },
286     { "FX.7",       UNIT_FX,  7 },
287     { "FX.8",       UNIT_FX,  8 },
288     { "FX.9",       UNIT_FX,  9 },
289     { "FX.10",      UNIT_FX, 10 },
290     { "FX.11",      UNIT_FX, 11 },
291     { "FX.12",      UNIT_FX, 12 },
292     { "FX.13",      UNIT_FX, 13 },
293     { "FX.14",      UNIT_FX, 14 },
294     { "FX.15",      UNIT_FX, 15 },
295   };
296
297 static const metag_reg metag_dsp_regtab[] =
298   {
299     { "D0AR.0",   UNIT_RAM_D0,  0 },
300     { "D0AR.1",   UNIT_RAM_D0,  1 },
301     { "D0AW.0",   UNIT_RAM_D0,  2 },
302     { "D0AW.1",   UNIT_RAM_D0,  3 },
303     { "D0BR.0",   UNIT_RAM_D0,  4 },
304     { "D0BR.1",   UNIT_RAM_D0,  5 },
305     { "D0BW.0",   UNIT_RAM_D0,  6 },
306     { "D0BW.1",   UNIT_RAM_D0,  7 },
307     { "D0ARI.0",  UNIT_RAM_D0,  8 },
308     { "D0ARI.1",  UNIT_RAM_D0,  9 },
309     { "D0AWI.0",  UNIT_RAM_D0, 10 },
310     { "D0AWI.1",  UNIT_RAM_D0, 11 },
311     { "D0BRI.0",  UNIT_RAM_D0, 12 },
312     { "D0BRI.1",  UNIT_RAM_D0, 13 },
313     { "D0BWI.0",  UNIT_RAM_D0, 14 },
314     { "D0BWI.1",  UNIT_RAM_D0, 15 },
315
316     { "AC0.0",    UNIT_ACC_D0, 16 },
317     { "AC0.1",    UNIT_ACC_D0, 17 },
318     { "AC0.2",    UNIT_ACC_D0, 18 },
319     { "AC0.3",    UNIT_ACC_D0, 19 },
320
321     { "D1AR.0",   UNIT_RAM_D1,  0 },
322     { "D1AR.1",   UNIT_RAM_D1,  1 },
323     { "D1AW.0",   UNIT_RAM_D1,  2 },
324     { "D1AW.1",   UNIT_RAM_D1,  3 },
325     { "D1BR.0",   UNIT_RAM_D1,  4 },
326     { "D1BR.1",   UNIT_RAM_D1,  5 },
327     { "D1BW.0",   UNIT_RAM_D1,  6 },
328     { "D1BW.1",   UNIT_RAM_D1,  7 },
329     { "D1ARI.0",  UNIT_RAM_D1,  8 },
330     { "D1ARI.1",  UNIT_RAM_D1,  9 },
331     { "D1AWI.0",  UNIT_RAM_D1, 10 },
332     { "D1AWI.1",  UNIT_RAM_D1, 11 },
333     { "D1BRI.0",  UNIT_RAM_D1, 12 },
334     { "D1BRI.1",  UNIT_RAM_D1, 13 },
335     { "D1BWI.0",  UNIT_RAM_D1, 14 },
336     { "D1BWI.1",  UNIT_RAM_D1, 15 },
337
338     { "AC1.0",    UNIT_ACC_D1, 16 },
339     { "AC1.1",    UNIT_ACC_D1, 17 },
340     { "AC1.2",    UNIT_ACC_D1, 18 },
341     { "AC1.3",    UNIT_ACC_D1, 19 },
342
343     { "T0",       UNIT_DT,  0 },
344     { "T1",       UNIT_DT,  1 },
345     { "T2",       UNIT_DT,  2 },
346     { "T3",       UNIT_DT,  3 },
347     { "T4",       UNIT_DT,  4 },
348     { "T5",       UNIT_DT,  5 },
349     { "T6",       UNIT_DT,  6 },
350     { "T7",       UNIT_DT,  7 },
351     { "T8",       UNIT_DT,  8 },
352     { "T9",       UNIT_DT,  9 },
353     { "TA",       UNIT_DT, 10 },
354     { "TB",       UNIT_DT, 11 },
355     { "TC",       UNIT_DT, 12 },
356     { "TD",       UNIT_DT, 13 },
357     { "TE",       UNIT_DT, 14 },
358     { "TF",       UNIT_DT, 15 },
359   };
360
361 /* This table differs from 'metag_dsp_regtab' in that the number
362    fields in this table are suitable for insertion into DSPRAM
363    template definition instruction encodings.
364
365    The table is indexed by "load". The main benefit of this is that we
366    can implicitly check that the correct DSPRAM register has been used
367    when parsing, e.g. the read pointer only appears in the load table
368    and the write pointer only exists in the store table.
369
370    The ordering of the table entries might look a bit weird but it is
371    based on matching the longest register string. */
372 static const metag_reg metag_dsp_tmpl_regtab[2][56] =
373   {
374     {
375       { "D0AW.0+D0AWI.0++", UNIT_RAM_D0, 18 },
376       { "D0AW.0+D0AWI.0",   UNIT_RAM_D0, 18 },
377       { "D0AW.0+D0AWI.1++", UNIT_RAM_D0, 19 },
378       { "D0AW.0+D0AWI.1",   UNIT_RAM_D0, 19 },
379       { "D0AW.0++",         UNIT_RAM_D0, 17 },
380       { "D0AW.0",           UNIT_RAM_D0, 16 },
381       { "D0AWI.0",          UNIT_RAM_D0, 18 },
382       { "D0AWI.1",          UNIT_RAM_D0, 19 },
383       { "D0AW.1+D0AWI.0++", UNIT_RAM_D0, 22 },
384       { "D0AW.1+D0AWI.0",   UNIT_RAM_D0, 22 },
385       { "D0AW.1+D0AWI.1++", UNIT_RAM_D0, 23 },
386       { "D0AW.1+D0AWI.1",   UNIT_RAM_D0, 23 },
387       { "D0AW.1++",         UNIT_RAM_D0, 21 },
388       { "D0AW.1",           UNIT_RAM_D0, 20 },
389       { "D0BW.0+D0BWI.0++", UNIT_RAM_D0, 26 },
390       { "D0BW.0+D0BWI.0",   UNIT_RAM_D0, 26 },
391       { "D0BW.0+D0BWI.1++", UNIT_RAM_D0, 27 },
392       { "D0BW.0+D0BWI.1",   UNIT_RAM_D0, 27 },
393       { "D0BW.0++",         UNIT_RAM_D0, 25 },
394       { "D0BW.0",           UNIT_RAM_D0, 24 },
395       { "D0BWI.0",          UNIT_RAM_D0, 18 },
396       { "D0BWI.1",          UNIT_RAM_D0, 19 },
397       { "D0BW.1+D0BWI.0++", UNIT_RAM_D0, 30 },
398       { "D0BW.1+D0BWI.0",   UNIT_RAM_D0, 30 },
399       { "D0BW.1+D0BWI.1++", UNIT_RAM_D0, 31 },
400       { "D0BW.1+D0BWI.1",   UNIT_RAM_D0, 31 },
401       { "D0BW.1++",         UNIT_RAM_D0, 29 },
402       { "D0BW.1",           UNIT_RAM_D0, 28 },
403
404       { "D1AW.0+D1AWI.0++", UNIT_RAM_D1, 18 },
405       { "D1AW.0+D1AWI.0",   UNIT_RAM_D1, 18 },
406       { "D1AW.0+D1AWI.1++", UNIT_RAM_D1, 19 },
407       { "D1AW.0+D1AWI.1",   UNIT_RAM_D1, 19 },
408       { "D1AW.0++",         UNIT_RAM_D1, 17 },
409       { "D1AW.0",           UNIT_RAM_D1, 16 },
410       { "D1AWI.0",          UNIT_RAM_D1, 18 },
411       { "D1AWI.1",          UNIT_RAM_D1, 19 },
412       { "D1AW.1+D1AWI.0++", UNIT_RAM_D1, 22 },
413       { "D1AW.1+D1AWI.0",   UNIT_RAM_D1, 22 },
414       { "D1AW.1+D1AWI.1++", UNIT_RAM_D1, 23 },
415       { "D1AW.1+D1AWI.1",   UNIT_RAM_D1, 23 },
416       { "D1AW.1++",         UNIT_RAM_D1, 21 },
417       { "D1AW.1",           UNIT_RAM_D1, 20 },
418       { "D1BW.0+D1BWI.0++", UNIT_RAM_D1, 26 },
419       { "D1BW.0+D1BWI.0",   UNIT_RAM_D1, 26 },
420       { "D1BW.0+D1BWI.1++", UNIT_RAM_D1, 27 },
421       { "D1BW.0+D1BWI.1",   UNIT_RAM_D1, 27 },
422       { "D1BW.0++",         UNIT_RAM_D1, 25 },
423       { "D1BW.0",           UNIT_RAM_D1, 24 },
424       { "D1BWI.0",          UNIT_RAM_D1, 18 },
425       { "D1BWI.1",          UNIT_RAM_D1, 19 },
426       { "D1BW.1+D1BWI.0++", UNIT_RAM_D1, 30 },
427       { "D1BW.1+D1BWI.0",   UNIT_RAM_D1, 30 },
428       { "D1BW.1+D1BWI.1++", UNIT_RAM_D1, 31 },
429       { "D1BW.1+D1BWI.1",   UNIT_RAM_D1, 31 },
430       { "D1BW.1++",         UNIT_RAM_D1, 29 },
431       { "D1BW.1",           UNIT_RAM_D1, 28 },
432     },
433
434     {
435       { "D0AR.0+D0ARI.0++", UNIT_RAM_D0, 18 },
436       { "D0AR.0+D0ARI.0",   UNIT_RAM_D0, 18 },
437       { "D0AR.0+D0ARI.1++", UNIT_RAM_D0, 19 },
438       { "D0AR.0+D0ARI.1",   UNIT_RAM_D0, 19 },
439       { "D0AR.0++",         UNIT_RAM_D0, 17 },
440       { "D0AR.0",           UNIT_RAM_D0, 16 },
441       { "D0ARI.0",          UNIT_RAM_D0, 18 },
442       { "D0ARI.1",          UNIT_RAM_D0, 19 },
443       { "D0AR.1+D0ARI.0++", UNIT_RAM_D0, 22 },
444       { "D0AR.1+D0ARI.0",   UNIT_RAM_D0, 22 },
445       { "D0AR.1+D0ARI.1++", UNIT_RAM_D0, 23 },
446       { "D0AR.1+D0ARI.1",   UNIT_RAM_D0, 23 },
447       { "D0AR.1++",         UNIT_RAM_D0, 21 },
448       { "D0AR.1",           UNIT_RAM_D0, 20 },
449       { "D0BR.0+D0BRI.0++", UNIT_RAM_D0, 26 },
450       { "D0BR.0+D0BRI.0",   UNIT_RAM_D0, 26 },
451       { "D0BR.0+D0BRI.1++", UNIT_RAM_D0, 27 },
452       { "D0BR.0+D0BRI.1",   UNIT_RAM_D0, 27 },
453       { "D0BR.0++",         UNIT_RAM_D0, 25 },
454       { "D0BR.0",           UNIT_RAM_D0, 24 },
455       { "D0BRI.0",          UNIT_RAM_D0, 18 },
456       { "D0BRI.1",          UNIT_RAM_D0, 19 },
457       { "D0BR.1+D0BRI.0++", UNIT_RAM_D0, 30 },
458       { "D0BR.1+D0BRI.0",   UNIT_RAM_D0, 30 },
459       { "D0BR.1+D0BRI.1++", UNIT_RAM_D0, 31 },
460       { "D0BR.1+D0BRI.1",   UNIT_RAM_D0, 31 },
461       { "D0BR.1++",         UNIT_RAM_D0, 29 },
462       { "D0BR.1",           UNIT_RAM_D0, 28 },
463
464       { "D1AR.0+D1ARI.0++", UNIT_RAM_D1, 18 },
465       { "D1AR.0+D1ARI.0",   UNIT_RAM_D1, 18 },
466       { "D1AR.0+D1ARI.1++", UNIT_RAM_D1, 19 },
467       { "D1AR.0+D1ARI.1",   UNIT_RAM_D1, 19 },
468       { "D1AR.0++",         UNIT_RAM_D1, 17 },
469       { "D1AR.0",           UNIT_RAM_D1, 16 },
470       { "D1ARI.0",          UNIT_RAM_D1, 18 },
471       { "D1ARI.1",          UNIT_RAM_D1, 19 },
472       { "D1AR.1+D1ARI.0++", UNIT_RAM_D1, 22 },
473       { "D1AR.1+D1ARI.0",   UNIT_RAM_D1, 22 },
474       { "D1AR.1+D1ARI.1++", UNIT_RAM_D1, 23 },
475       { "D1AR.1+D1ARI.1",   UNIT_RAM_D1, 23 },
476       { "D1AR.1++",         UNIT_RAM_D1, 21 },
477       { "D1AR.1",           UNIT_RAM_D1, 20 },
478       { "D1BR.0+D1BRI.0++", UNIT_RAM_D1, 26 },
479       { "D1BR.0+D1BRI.0",   UNIT_RAM_D1, 26 },
480       { "D1BR.0+D1BRI.1++", UNIT_RAM_D1, 27 },
481       { "D1BR.0+D1BRI.1",   UNIT_RAM_D1, 27 },
482       { "D1BR.0++",         UNIT_RAM_D1, 25 },
483       { "D1BR.0",           UNIT_RAM_D1, 24 },
484       { "D1BR.1+D1BRI.0++", UNIT_RAM_D1, 30 },
485       { "D1BR.1+D1BRI.0",   UNIT_RAM_D1, 30 },
486       { "D1BR.1+D1BRI.1++", UNIT_RAM_D1, 31 },
487       { "D1BR.1+D1BRI.1",   UNIT_RAM_D1, 31 },
488       { "D1BR.1++",         UNIT_RAM_D1, 29 },
489       { "D1BR.1",           UNIT_RAM_D1, 28 },
490       { "D1BRI.0",          UNIT_RAM_D1, 18 },
491       { "D1BRI.1",          UNIT_RAM_D1, 19 },
492     },
493   };
494
495 typedef struct
496 {
497   const char *  name;
498   unsigned int  part;
499 } metag_acf;
500
501 static const metag_acf metag_acftab[] =
502   {
503     { "ACF.0", 0},
504     { "ACF.1", 1},
505     { "ACF.2", 2},
506     { "ACF.3", 3},
507   };
508
509 enum insn_encoding
510 {
511   ENC_NONE,
512   ENC_MOV_U2U,
513   ENC_MOV_PORT,
514   ENC_MMOV,
515   ENC_MDRD,
516   ENC_MOVL_TTREC,
517   ENC_GET_SET,
518   ENC_GET_SET_EXT,
519   ENC_MGET_MSET,
520   ENC_COND_SET,
521   ENC_XFR,
522   ENC_MOV_CT,
523   ENC_SWAP,
524   ENC_JUMP,
525   ENC_CALLR,
526   ENC_ALU,
527   ENC_SHIFT,
528   ENC_MIN_MAX,
529   ENC_BITOP,
530   ENC_CMP,
531   ENC_BRANCH,
532   ENC_KICK,
533   ENC_SWITCH,
534   ENC_CACHER,
535   ENC_CACHEW,
536   ENC_ICACHE,
537   ENC_LNKGET,
538   ENC_FMOV,
539   ENC_FMMOV,
540   ENC_FMOV_DATA,
541   ENC_FMOV_I,
542   ENC_FPACK,
543   ENC_FSWAP,
544   ENC_FCMP,
545   ENC_FMINMAX,
546   ENC_FCONV,
547   ENC_FCONVX,
548   ENC_FBARITH,
549   ENC_FEARITH,
550   ENC_FREC,
551   ENC_FSIMD,
552   ENC_FGET_SET_ACF,
553   ENC_DGET_SET,
554   ENC_DTEMPLATE,
555   ENC_DALU,
556   ENC_MAX,
557 };
558
559 enum insn_type
560 {
561   INSN_GP,
562   INSN_FPU,
563   INSN_DSP,
564   INSN_DSP_FPU,
565 };
566
567 typedef struct
568 {
569   const char *name;
570
571   unsigned int core_flags;
572 #define CoreMeta11             0x1 /* The earliest Meta core we support */
573 #define CoreMeta12             0x2
574 #define CoreMeta21             0x4
575
576 #define FpuMeta21             0x21
577
578 #define DspMeta21             0x100
579
580   unsigned int meta_opcode;
581   unsigned int meta_mask;
582
583   enum insn_type insn_type;
584
585   enum insn_encoding encoding;
586
587 #define DSP_ARGS_1    0x0000001 /* De.r,Dx.r,De.r (3 register operands) */
588 #define DSP_ARGS_ACC2 0x0000002 /* Accumulator source operand 2 */
589 #define DSP_ARGS_QR   0x0000004 /* QUICKRoT */
590 #define DSP_ARGS_XACC 0x0000008 /* Cross-unit accumulator op */
591 #define DSP_ARGS_DACC 0x0000010 /* Target accumulator as destination */
592 #define DSP_ARGS_SRD  0x0000020 /* Source the RD port */
593 #define DSP_ARGS_2    0x0000040 /* De.r,Dx.r (2 register operands) */
594 #define DSP_ARGS_DSP_SRC1   0x0000080 /* Source a DSP register */
595 #define DSP_ARGS_DSP_SRC2   0x0000100 /* Source a DSP register */
596 #define DSP_ARGS_IMM 0x0000200 /* Immediate value for src 2 */
597 #define DSP_ARGS_SPLIT8  0x0000400 /* Data unit split 8 operations */
598 #define DSP_ARGS_12  0x0000800 /* De.r,Dx.r */
599 #define DSP_ARGS_13  0x0001000 /* Dx.r,Rx.r */
600 #define DSP_ARGS_14  0x0002000 /* DSPe.r,Dx.r */
601 #define DSP_ARGS_15  0x0004000 /* DSPx.r,#I16 */
602 #define DSP_ARGS_16  0x0008000 /* De.r,DSPx.r */
603 #define DSP_ARGS_17  0x0010000 /* De.r|ACe.r,Dx.r,Rx.r|RD */
604 #define DSP_ARGS_18  0x0020000 /* De.r,Dx.r|ACx.r */
605 #define DSP_ARGS_20  0x0080000 /* De.r,Dx.r|ACx.r,De.r */
606 #define DSP_ARGS_21  0x0100000 /* De.r,Dx.r|ACx.r,#I5 */
607 #define DSP_ARGS_22  0x0200000 /* De.r,Dx.r|ACx.r,De.r|#I5 */
608 #define DSP_ARGS_23  0x0400000 /* Ux.r,Dx.r|ACx.r,De.r|#I5 */
609 #define GP_ARGS_QR   0x0000001 /* QUICKRoT */
610   unsigned int arg_type;
611 } insn_template;
612
613 enum major_opcode
614 {
615   OPC_ADD,
616   OPC_SUB,
617   OPC_AND,
618   OPC_OR,
619   OPC_XOR,
620   OPC_SHIFT,
621   OPC_MUL,
622   OPC_CMP,
623   OPC_ADDR,
624   OPC_9,
625   OPC_MISC,
626   OPC_SET,
627   OPC_GET,
628   OPC_XFR,
629   OPC_CPR,
630   OPC_FPU,
631 };
632
633 #define GET_EXT_MINOR        0x7
634 #define MOV_EXT_MINOR        0x6
635 #define MOVL_MINOR           0x2
636
637 #define MAJOR_OPCODE(opcode) (((opcode) >> 28) & 0xf)
638 #define MINOR_OPCODE(opcode) (((opcode) >> 24) & 0xf)
639
640 enum cond_code
641 {
642   COND_A,
643   COND_EQ,
644   COND_NE,
645   COND_CS,
646   COND_CC,
647   COND_MI,
648   COND_PL,
649   COND_VS,
650   COND_VC,
651   COND_HI,
652   COND_LS,
653   COND_GE,
654   COND_LT,
655   COND_GT,
656   COND_LE,
657   COND_NV,
658 };
659
660 enum scond_code
661 {
662   SCOND_A,
663   SCOND_LEQ,
664   SCOND_LNE,
665   SCOND_LLO,
666   SCOND_LHS,
667   SCOND_HEQ,
668   SCOND_HNE,
669   SCOND_HLO,
670   SCOND_HHS,
671   SCOND_LGR,
672   SCOND_LLE,
673   SCOND_HGR,
674   SCOND_HLE,
675   SCOND_EEQ,
676   SCOND_ELO,
677   SCOND_NV,
678 };
679
680 typedef struct
681 {
682   const char *name;
683   enum scond_code code;
684 } split_condition;
685
686 static const split_condition metag_scondtab[] =
687   {
688     { "LEQ",   SCOND_LEQ },
689     { "LEZ",   SCOND_LEQ },
690     { "LNE",   SCOND_LNE },
691     { "LNZ",   SCOND_LNE },
692     { "LLO",   SCOND_LLO },
693     { "LCS",   SCOND_LLO },
694     { "LHS",   SCOND_LHS },
695     { "LCC",   SCOND_LHS },
696     { "HEQ",   SCOND_HEQ },
697     { "HEZ",   SCOND_HEQ },
698     { "HNE",   SCOND_HNE },
699     { "HNZ",   SCOND_HNE },
700     { "HLO",   SCOND_HLO },
701     { "HCS",   SCOND_HLO },
702     { "HHS",   SCOND_HHS },
703     { "HCC",   SCOND_HHS },
704     { "LGR",   SCOND_LGR },
705     { "LHI",   SCOND_LGR },
706     { "LLE",   SCOND_LLE },
707     { "LLS",   SCOND_LLE },
708     { "HGR",   SCOND_HGR },
709     { "HHI",   SCOND_HGR },
710     { "HLE",   SCOND_HLE },
711     { "HLS",   SCOND_HLE },
712     { "EEQ",   SCOND_EEQ },
713     { "EEZ",   SCOND_EEQ },
714     { "ELO",   SCOND_ELO },
715     { "ECS",   SCOND_ELO },
716   };
717
718 static const split_condition metag_dsp_scondtab[] =
719   {
720     { "LEQ",   SCOND_LEQ },
721     { "LEZ",   SCOND_LEQ },
722     { "LNE",   SCOND_LNE },
723     { "LNZ",   SCOND_LNE },
724     { "LCS",   SCOND_LLO },
725     { "LLO",   SCOND_LLO },
726     { "LCC",   SCOND_LHS },
727     { "LHS",   SCOND_LHS },
728     { "HEQ",   SCOND_HEQ },
729     { "HEZ",   SCOND_HEQ },
730     { "HNE",   SCOND_HNE },
731     { "HNZ",   SCOND_HNE },
732     { "HCS",   SCOND_HLO },
733     { "HLO",   SCOND_HLO },
734     { "HCC",   SCOND_HHS },
735     { "HHS",   SCOND_HHS },
736     { "LHI",   SCOND_LGR },
737     { "LGR",   SCOND_LGR },
738     { "LLS",   SCOND_LLE },
739     { "LLE",   SCOND_LLE },
740     { "HHI",   SCOND_HGR },
741     { "HGR",   SCOND_HGR },
742     { "HLS",   SCOND_HLE },
743     { "HLE",   SCOND_HLE },
744     { "EEQ",   SCOND_EEQ },
745     { "EEZ",   SCOND_EEQ },
746     { "ECS",   SCOND_ELO },
747     { "ELO",   SCOND_ELO },
748   };
749
750 static const split_condition metag_fpu_scondtab[] =
751   {
752     { "LEQ",   SCOND_LEQ },
753     { "LEZ",   SCOND_LEQ },
754     { "LNE",   SCOND_LNE },
755     { "LNZ",   SCOND_LNE },
756     { "LLO",   SCOND_LLO },
757     { "LCS",   SCOND_LLO },
758     { "LHS",   SCOND_LHS },
759     { "LCC",   SCOND_LHS },
760     { "HEQ",   SCOND_HEQ },
761     { "HEZ",   SCOND_HEQ },
762     { "HNE",   SCOND_HNE },
763     { "HNZ",   SCOND_HNE },
764     { "HLO",   SCOND_HLO },
765     { "HCS",   SCOND_HLO },
766     { "HHS",   SCOND_HHS },
767     { "HCC",   SCOND_HHS },
768     { "LGR",   SCOND_LGR },
769     { "LHI",   SCOND_LGR },
770     { "LLE",   SCOND_LLE },
771     { "LLS",   SCOND_LLE },
772     { "HGR",   SCOND_HGR },
773     { "HHI",   SCOND_HGR },
774     { "HLE",   SCOND_HLE },
775     { "HLS",   SCOND_HLE },
776     { "EEQ",   SCOND_EEQ },
777     { "EEZ",   SCOND_EEQ },
778     { "ELO",   SCOND_ELO },
779     { "ECS",   SCOND_ELO },
780   };
781
782 enum fcond_code
783 {
784   FCOND_A,
785   FCOND_FEQ,
786   FCOND_UNE,
787   FCOND_FLT,
788   FCOND_UGE,
789
790   FCOND_UVS = 7,
791   FCOND_FVC,
792   FCOND_UGT,
793   FCOND_FLE,
794   FCOND_FGE,
795   FCOND_ULT,
796   FCOND_FGT,
797   FCOND_ULE,
798   FCOND_NV,
799 };
800
801 #define COND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode,    \
802                   meta_mask, insn_type, encoding, args)                 \
803   { mnemonic suffix, flags, meta_opcode, meta_mask,                     \
804       insn_type, encoding, args },                                      \
805   { mnemonic "A" suffix, flags, meta_opcode, meta_mask,                 \
806       insn_type, encoding, args },                                      \
807   { mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \
808       meta_mask, insn_type, encoding, args },                           \
809   { mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \
810       meta_mask, insn_type, encoding, args },                           \
811   { mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \
812       meta_mask, insn_type, encoding, args },                           \
813   { mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \
814       meta_mask, insn_type, encoding, args },                           \
815   { mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \
816       meta_mask, insn_type, encoding, args },                           \
817   { mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \
818       meta_mask, insn_type, encoding, args },                           \
819   { mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \
820       meta_mask, insn_type, encoding, args },                           \
821   { mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \
822       meta_mask, insn_type, encoding, args },                           \
823   { mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \
824       meta_mask, insn_type, encoding, args },                           \
825   { mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \
826       meta_mask, insn_type, encoding, args },                           \
827   { mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \
828       meta_mask, insn_type, encoding, args },                           \
829   { mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \
830       meta_mask, insn_type, encoding, args },                           \
831   { mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \
832       meta_mask, insn_type, encoding, args },                           \
833   { mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \
834       meta_mask, insn_type, encoding, args },                           \
835   { mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \
836       meta_mask, insn_type, encoding, args },                           \
837   { mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \
838       meta_mask, insn_type, encoding, args },                           \
839   { mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \
840       meta_mask, insn_type, encoding, args },                           \
841   { mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \
842       meta_mask, insn_type, encoding, args },                           \
843   { mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \
844       meta_mask, insn_type, encoding, args },                           \
845   { mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \
846       meta_mask, insn_type, encoding, args },                           \
847   { mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \
848       meta_mask, insn_type, encoding, args },                           \
849   { mnemonic "FEQ" suffix, flags, meta_opcode |                         \
850       (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \
851   { mnemonic "FZ" suffix, flags, meta_opcode |                          \
852       (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \
853   { mnemonic "UNE" suffix, flags, meta_opcode |                         \
854       (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
855   { mnemonic "UNZ" suffix, flags, meta_opcode |                         \
856       (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
857   { mnemonic "FLT" suffix, flags, meta_opcode |                         \
858       (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
859   { mnemonic "FLO" suffix, flags, meta_opcode |                         \
860       (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
861   { mnemonic "UGE" suffix, flags, meta_opcode |                         \
862       (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
863   { mnemonic "UHS" suffix, flags, meta_opcode |                         \
864       (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
865   { mnemonic "UVS" suffix, flags, meta_opcode |                         \
866       (FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \
867   { mnemonic "FVC" suffix, flags, meta_opcode |                         \
868       (FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \
869   { mnemonic "UGT" suffix, flags, meta_opcode |                         \
870       (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
871   { mnemonic "UHI" suffix, flags, meta_opcode |                         \
872       (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
873   { mnemonic "FLE" suffix, flags, meta_opcode |                         \
874       (FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
875   { mnemonic "FGE" suffix, flags, meta_opcode |                         \
876       (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
877   { mnemonic "FHS" suffix, flags, meta_opcode |                         \
878       (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
879   { mnemonic "ULT" suffix, flags, meta_opcode |                         \
880       (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
881   { mnemonic "ULO" suffix, flags, meta_opcode |                         \
882       (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
883   { mnemonic "FGT" suffix, flags, meta_opcode |                         \
884       (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
885   { mnemonic "FHI" suffix, flags, meta_opcode |                         \
886       (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
887   { mnemonic "ULE" suffix, flags, meta_opcode |                         \
888       (FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
889   { mnemonic "NV" suffix, flags, meta_opcode |                          \
890       (FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args }
891
892 #define FCOND_INSN(mnemonic, suffix, field_shift, flags, meta_opcode,   \
893                   meta_mask, insn_type, encoding, args)                 \
894   { mnemonic suffix, flags, meta_opcode, meta_mask,                     \
895       insn_type, encoding, args },                                      \
896   { mnemonic "A" suffix, flags, meta_opcode, meta_mask,                 \
897       insn_type, encoding, args },                                      \
898   { mnemonic "FEQ" suffix, flags, meta_opcode |                         \
899       (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \
900   { mnemonic "FZ" suffix, flags, meta_opcode |                          \
901       (FCOND_FEQ << field_shift), meta_mask, INSN_FPU, encoding, args }, \
902   { mnemonic "UNE" suffix, flags, meta_opcode |                         \
903       (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
904   { mnemonic "UNZ" suffix, flags, meta_opcode |                         \
905       (FCOND_UNE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
906   { mnemonic "FLO" suffix, flags, meta_opcode |                         \
907       (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
908   { mnemonic "FLT" suffix, flags, meta_opcode |                         \
909       (FCOND_FLT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
910   { mnemonic "UHS" suffix, flags, meta_opcode |                         \
911       (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
912   { mnemonic "UGE" suffix, flags, meta_opcode |                         \
913       (FCOND_UGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
914   { mnemonic "UVS" suffix, flags, meta_opcode |                         \
915       (FCOND_UVS << field_shift), meta_mask, INSN_FPU, encoding, args }, \
916   { mnemonic "FVC" suffix, flags, meta_opcode |                         \
917       (FCOND_FVC << field_shift), meta_mask, INSN_FPU, encoding, args }, \
918   { mnemonic "UHI" suffix, flags, meta_opcode |                         \
919       (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
920   { mnemonic "UGT" suffix, flags, meta_opcode |                         \
921       (FCOND_UGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
922   { mnemonic "FLE" suffix, flags, meta_opcode |                         \
923       (FCOND_FLE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
924   { mnemonic "FGE" suffix, flags, meta_opcode |                         \
925       (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
926   { mnemonic "FHS" suffix, flags, meta_opcode |                         \
927       (FCOND_FGE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
928   { mnemonic "ULT" suffix, flags, meta_opcode |                         \
929       (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
930   { mnemonic "ULO" suffix, flags, meta_opcode |                         \
931       (FCOND_ULT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
932   { mnemonic "FGT" suffix, flags, meta_opcode |                         \
933       (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
934   { mnemonic "FHI" suffix, flags, meta_opcode |                         \
935       (FCOND_FGT << field_shift), meta_mask, INSN_FPU, encoding, args }, \
936   { mnemonic "ULE" suffix, flags, meta_opcode |                         \
937       (FCOND_ULE << field_shift), meta_mask, INSN_FPU, encoding, args }, \
938   { mnemonic "NV" suffix, flags, meta_opcode |                          \
939       (FCOND_NV << field_shift), meta_mask, INSN_FPU, encoding, args }, \
940   { mnemonic "EQ" suffix, flags, meta_opcode | (COND_EQ << field_shift), \
941       meta_mask, insn_type, encoding, args },                           \
942   { mnemonic "Z" suffix, flags, meta_opcode | (COND_EQ << field_shift), \
943       meta_mask, insn_type, encoding, args },                           \
944   { mnemonic "NE" suffix, flags, meta_opcode | (COND_NE << field_shift), \
945       meta_mask, insn_type, encoding, args },                           \
946   { mnemonic "NZ" suffix, flags, meta_opcode | (COND_NE << field_shift), \
947       meta_mask, insn_type, encoding, args },                           \
948   { mnemonic "CS" suffix, flags, meta_opcode | (COND_CS << field_shift), \
949       meta_mask, insn_type, encoding, args },                           \
950   { mnemonic "LO" suffix, flags, meta_opcode | (COND_CS << field_shift), \
951       meta_mask, insn_type, encoding, args },                           \
952   { mnemonic "CC" suffix, flags, meta_opcode | (COND_CC << field_shift), \
953       meta_mask, insn_type, encoding, args },                           \
954   { mnemonic "HS" suffix, flags, meta_opcode | (COND_CC << field_shift), \
955       meta_mask, insn_type, encoding, args },                           \
956   { mnemonic "MI" suffix, flags, meta_opcode | (COND_MI << field_shift), \
957       meta_mask, insn_type, encoding, args },                           \
958   { mnemonic "N" suffix, flags, meta_opcode | (COND_MI << field_shift), \
959       meta_mask, insn_type, encoding, args },                           \
960   { mnemonic "PL" suffix, flags, meta_opcode | (COND_PL << field_shift), \
961       meta_mask, insn_type, encoding, args },                           \
962   { mnemonic "NC" suffix, flags, meta_opcode | (COND_PL << field_shift), \
963       meta_mask, insn_type, encoding, args },                           \
964   { mnemonic "VS" suffix, flags, meta_opcode | (COND_VS << field_shift), \
965       meta_mask, insn_type, encoding, args },                           \
966   { mnemonic "VC" suffix, flags, meta_opcode | (COND_VC << field_shift), \
967       meta_mask, insn_type, encoding, args },                           \
968   { mnemonic "HI" suffix, flags, meta_opcode | (COND_HI << field_shift), \
969       meta_mask, insn_type, encoding, args },                           \
970   { mnemonic "LS" suffix, flags, meta_opcode | (COND_LS << field_shift), \
971       meta_mask, insn_type, encoding, args },                           \
972   { mnemonic "GE" suffix, flags, meta_opcode | (COND_GE << field_shift), \
973       meta_mask, insn_type, encoding, args },                           \
974   { mnemonic "LT" suffix, flags, meta_opcode | (COND_LT << field_shift), \
975       meta_mask, insn_type, encoding, args },                           \
976   { mnemonic "GT" suffix, flags, meta_opcode | (COND_GT << field_shift), \
977       meta_mask, insn_type, encoding, args },                           \
978   { mnemonic "LE" suffix, flags, meta_opcode | (COND_LE << field_shift), \
979       meta_mask, insn_type, encoding, args },                           \
980   { mnemonic "NV" suffix, flags, meta_opcode | (COND_NV << field_shift), \
981       meta_mask, insn_type, encoding, args }
982
983 #define TEMPLATE_INSN(flags, meta_opcode, meta_mask, insn_type)         \
984   { "T0", flags, meta_opcode | 0x0, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
985   { "T1", flags, meta_opcode | 0x1, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
986   { "T2", flags, meta_opcode | 0x2, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
987   { "T3", flags, meta_opcode | 0x3, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
988   { "T4", flags, meta_opcode | 0x4, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
989   { "T5", flags, meta_opcode | 0x5, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
990   { "T6", flags, meta_opcode | 0x6, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
991   { "T7", flags, meta_opcode | 0x7, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
992   { "T8", flags, meta_opcode | 0x8, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
993   { "T9", flags, meta_opcode | 0x9, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
994   { "TA", flags, meta_opcode | 0xa, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
995   { "TB", flags, meta_opcode | 0xb, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
996   { "TC", flags, meta_opcode | 0xc, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
997   { "TD", flags, meta_opcode | 0xd, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
998   { "TE", flags, meta_opcode | 0xe, meta_mask, insn_type, ENC_DTEMPLATE, 0 }, \
999   { "TF", flags, meta_opcode | 0xf, meta_mask, insn_type, ENC_DTEMPLATE, 0 }
1000
1001
1002 /* Unimplemented GP instructions:
1003      CPR - coprocessor read
1004      CPW - coprocessor write
1005      MORT - morton order operation
1006      VPACK, VADD, VSUB - vector instructions
1007   
1008    The order of the entries in this table is extremely important. DO
1009    NOT modify it unless you know what you're doing. If you do modify
1010    it, be sure to run the entire testsuite to make sure you haven't
1011    caused a regression.  */
1012
1013 static const insn_template metag_optab[] =
1014   {
1015     /* Port-to-unit MOV */
1016     COND_INSN ("MOVB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1017                0xa1800000, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0),
1018     COND_INSN ("MOVW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1019                0xa1800001, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0),
1020     COND_INSN ("MOVD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1021                0xa1800200, 0xfff83e1f, INSN_GP, ENC_MOV_PORT, 0),
1022     COND_INSN ("MOVL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1023                0xa2800000, 0xfff8019f, INSN_GP, ENC_MOV_PORT, 0),
1024
1025     /* Read pipeline prime/drain */
1026     { "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21,
1027       0xca000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 },
1028     { "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21,
1029       0xcb000000, 0xff00001f, INSN_GP, ENC_MMOV, 0 },
1030     { "MMOVD", CoreMeta11|CoreMeta12|CoreMeta21,
1031       0xcc000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 },
1032     { "MMOVL", CoreMeta11|CoreMeta12|CoreMeta21,
1033       0xcd000000, 0xff07c067, INSN_GP, ENC_MMOV, 0 },
1034
1035     /* Read pipeline flush */
1036     { "MDRD", CoreMeta11|CoreMeta12|CoreMeta21,
1037       0xcc000002, 0xffffc07f, INSN_GP, ENC_MDRD, 0 },
1038
1039     /* Unit-to-TTREC MOVL */
1040     COND_INSN ("MOVL", "", 1, CoreMeta12|CoreMeta21,
1041                0xa2002001, 0xff003e7f, INSN_GP, ENC_MOVL_TTREC, 0),
1042
1043     /* MOV to RA (extended) */
1044     { "MOVB", CoreMeta11|CoreMeta12|CoreMeta21,
1045       0xa6000000, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 },
1046     { "MOVW", CoreMeta11|CoreMeta12|CoreMeta21,
1047       0xa6000002, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 },
1048     { "MOVD", CoreMeta11|CoreMeta12|CoreMeta21,
1049       0xa6000004, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 },
1050     { "MOVL", CoreMeta11|CoreMeta12|CoreMeta21,
1051       0xa6000006, 0xff00001e, INSN_GP, ENC_GET_SET_EXT, 0 },
1052
1053     /* Extended GET */
1054     { "GETB", CoreMeta11|CoreMeta12|CoreMeta21,
1055       0xa7000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1056     { "GETW", CoreMeta11|CoreMeta12|CoreMeta21,
1057       0xa7000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1058     { "GETD", CoreMeta11|CoreMeta12|CoreMeta21,
1059       0xa7000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1060     { "GETL", CoreMeta11|CoreMeta12|CoreMeta21,
1061       0xa7000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1062
1063     /* Extended SET */
1064     { "SETB", CoreMeta11|CoreMeta12|CoreMeta21,
1065       0xa5000000, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1066     { "SETW", CoreMeta11|CoreMeta12|CoreMeta21,
1067       0xa5000002, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1068     { "SETD", CoreMeta11|CoreMeta12|CoreMeta21,
1069       0xa5000004, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1070     { "SETL", CoreMeta11|CoreMeta12|CoreMeta21,
1071       0xa5000006, 0xff000006, INSN_GP, ENC_GET_SET_EXT, 0 },
1072
1073     /* MOV to RA */
1074     { "MOVB", CoreMeta11|CoreMeta12|CoreMeta21,
1075       0xc000000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 },
1076     { "MOVW", CoreMeta11|CoreMeta12|CoreMeta21,
1077       0xc100000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 },
1078     { "MOVD", CoreMeta11|CoreMeta12|CoreMeta21,
1079       0xc400000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 },
1080     { "MOVL", CoreMeta11|CoreMeta12|CoreMeta21,
1081       0xc500000c, 0xfd00001e, INSN_GP, ENC_GET_SET, 0 },
1082
1083     /* Standard GET */
1084     { "GETB", CoreMeta11|CoreMeta12|CoreMeta21,
1085       0xc0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1086     { "GETW", CoreMeta11|CoreMeta12|CoreMeta21,
1087       0xc1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1088     { "GETD", CoreMeta11|CoreMeta12|CoreMeta21,
1089       0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1090     /* GET is a synonym for GETD. */
1091     { "GET", CoreMeta11|CoreMeta12|CoreMeta21,
1092       0xc4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1093     { "GETL", CoreMeta11|CoreMeta12|CoreMeta21,
1094       0xc5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1095
1096     /* Standard SET */
1097     { "SETB", CoreMeta11|CoreMeta12|CoreMeta21,
1098       0xb0000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1099     { "SETW", CoreMeta11|CoreMeta12|CoreMeta21,
1100       0xb1000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1101     { "SETD", CoreMeta11|CoreMeta12|CoreMeta21,
1102       0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1103     /* SET is a synonym for SETD. */
1104     { "SET", CoreMeta11|CoreMeta12|CoreMeta21,
1105       0xb4000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1106     { "SETL", CoreMeta11|CoreMeta12|CoreMeta21,
1107       0xb5000000, 0xfd000000, INSN_GP, ENC_GET_SET, 0 },
1108
1109     /* Multiple GET */
1110     { "MGETD", CoreMeta11|CoreMeta12|CoreMeta21,
1111       0xc8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 },
1112     { "MGETL", CoreMeta11|CoreMeta12|CoreMeta21,
1113       0xc9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 },
1114
1115     /* Multiple SET */
1116     { "MSETD", CoreMeta11|CoreMeta12|CoreMeta21,
1117       0xb8000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 },
1118     { "MSETL", CoreMeta11|CoreMeta12|CoreMeta21,
1119       0xb9000000, 0xff000007, INSN_GP, ENC_MGET_MSET, 0 },
1120
1121     /* Conditional SET */
1122     COND_INSN ("SETB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1123                0xa4000000, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1124     COND_INSN ("SETW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1125                0xa4000001, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1126     COND_INSN ("SETD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1127                0xa4000200, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1128     COND_INSN ("SETL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1129                0xa4000201, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1130     { "XFRD", CoreMeta11|CoreMeta12|CoreMeta21,
1131       0xd0000000, 0xf2000000, INSN_GP, ENC_XFR, 0 },
1132     { "XFRL", CoreMeta11|CoreMeta12|CoreMeta21,
1133       0xd2000000, 0xf2000000, INSN_GP, ENC_XFR, 0 },
1134
1135     /* Fast control register setup */
1136     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1137       0xa9000000, 0xff000005, INSN_GP, ENC_MOV_CT, 0 },
1138     { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21,
1139       0xa9000001, 0xff000005, INSN_GP, ENC_MOV_CT, 0 },
1140     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1141       0xa9000004, 0xff000005, INSN_GP, ENC_MOV_CT, 0 },
1142     { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21,
1143       0xa9000005, 0xff000005, INSN_GP, ENC_MOV_CT, 0 },
1144
1145     /* Internal transfer operations */
1146     { "JUMP", CoreMeta11|CoreMeta12|CoreMeta21,
1147       0xac000000, 0xff000004, INSN_GP, ENC_JUMP, 0 },
1148     { "CALL", CoreMeta11|CoreMeta12|CoreMeta21,
1149       0xac000004, 0xff000004, INSN_GP, ENC_JUMP, 0 },
1150     { "CALLR", CoreMeta11|CoreMeta12|CoreMeta21,
1151       0xab000000, 0xff000000, INSN_GP, ENC_CALLR, 0 },
1152
1153     /* Address unit ALU operations */
1154     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1155       0x80000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1156     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1157       0x82000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1158     { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21,
1159       0x82000005, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1160     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1161       0x80000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1162     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1163       0x82000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1164     { "ADDT", CoreMeta11|CoreMeta12|CoreMeta21,
1165       0x82000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1166     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1167       0x86000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1168     COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1169                0x84000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1170     COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1171                0x86000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1172     { "NEG", CoreMeta11|CoreMeta12|CoreMeta21,
1173       0x88000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1174     { "NEG", CoreMeta11|CoreMeta12|CoreMeta21,
1175       0x8a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1176     { "NEGT", CoreMeta11|CoreMeta12|CoreMeta21,
1177       0x8a000005, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1178     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1179       0x88000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1180     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1181       0x8a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1182     { "SUBT", CoreMeta11|CoreMeta12|CoreMeta21,
1183       0x8a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1184     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1185       0x8e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1186     COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1187                0x8c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1188     COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1189                0x8e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1190
1191     /* Data unit ALU operations */
1192     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1193       0x00000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1194     { "MOVS", CoreMeta11|CoreMeta12|CoreMeta21,
1195       0x08000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1196     { "MOV", CoreMeta11|CoreMeta12|CoreMeta21,
1197       0x02000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1198     { "MOVS", CoreMeta11|CoreMeta12|CoreMeta21,
1199       0x0a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1200     { "MOVT", CoreMeta11|CoreMeta12|CoreMeta21,
1201       0x02000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1202     { "MOVST", CoreMeta11|CoreMeta12|CoreMeta21,
1203       0x0a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1204     { "ADD", DspMeta21,
1205       0x00000100, 0xfe000104, INSN_DSP, ENC_DALU,
1206       DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC|DSP_ARGS_IMM },
1207     { "ADD", DspMeta21,
1208       0x02000003, 0xfe000003, INSN_DSP, ENC_DALU,
1209       DSP_ARGS_1|DSP_ARGS_IMM },
1210     COND_INSN ("ADD", "", 1, DspMeta21,
1211                0x040001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1),
1212     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1213       0x00000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1214     { "ADDS", DspMeta21,
1215       0x08000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 },
1216     { "ADDS", DspMeta21,
1217       0x0a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1218     { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21,
1219       0x08000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1220     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1221       0x02000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1222     { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21,
1223       0x0a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1224     { "ADDT", CoreMeta11|CoreMeta12|CoreMeta21,
1225       0x02000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1226     { "ADDST", CoreMeta11|CoreMeta12|CoreMeta21,
1227       0x0a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1228     { "ADD", CoreMeta11|CoreMeta12|CoreMeta21,
1229       0x06000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1230     COND_INSN ("ADDS", "", 1, DspMeta21,
1231                0x0c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1),
1232     { "ADDS", CoreMeta11|CoreMeta12|CoreMeta21,
1233       0x0e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1234     COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1235                0x04000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1236     COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1237                0x0c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1238     COND_INSN ("ADD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1239                0x06000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1240     COND_INSN ("ADDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1241                0x0e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1242     { "NEG", CoreMeta11|CoreMeta12|CoreMeta21,
1243       0x10000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1244     { "NEGS", CoreMeta11|CoreMeta12|CoreMeta21,
1245       0x18000004, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1246     { "NEG", CoreMeta11|CoreMeta12|CoreMeta21,
1247       0x12000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1248     { "NEGS", CoreMeta11|CoreMeta12|CoreMeta21,
1249       0x1a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1250     { "NEGT", CoreMeta11|CoreMeta12|CoreMeta21,
1251       0x12000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1252     { "NEGST", CoreMeta11|CoreMeta12|CoreMeta21,
1253       0x1a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1254     { "SUB", DspMeta21,
1255       0x10000100, 0xfe000104, INSN_DSP, ENC_DALU,
1256       DSP_ARGS_1|DSP_ARGS_ACC2|DSP_ARGS_XACC },
1257     { "SUB", DspMeta21,
1258       0x12000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1259     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1260       0x10000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1261     { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21,
1262       0x18000000, 0xfe0001fc, INSN_GP, ENC_ALU, 0 },
1263     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1264       0x12000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1265     { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21,
1266       0x1a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1267     { "SUBT", CoreMeta11|CoreMeta12|CoreMeta21,
1268       0x12000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1269     { "SUBS", DspMeta21,
1270       0x18000100, 0xfe000104, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_ACC2 },
1271     { "SUBS", DspMeta21,
1272       0x1a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1273     { "SUBST", CoreMeta11|CoreMeta12|CoreMeta21,
1274       0x1a000001, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1275     { "SUB", CoreMeta11|CoreMeta12|CoreMeta21,
1276       0x16000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1277     { "SUBS", CoreMeta11|CoreMeta12|CoreMeta21,
1278       0x1e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1279     COND_INSN ("SUBS", "", 1, DspMeta21,
1280                0x1c0001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1),
1281     COND_INSN ("SUB", "", 1, DspMeta21,
1282                0x140001e0, 0xfe0001fe, INSN_DSP, ENC_DALU, DSP_ARGS_1),
1283     COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1284                0x14000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1285     COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1286                0x1c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1287     COND_INSN ("SUB", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1288                0x16000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1289     COND_INSN ("SUBS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1290                0x1e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1291     { "AND", CoreMeta11|CoreMeta12|CoreMeta21,
1292       0x20000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1293     { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21,
1294       0x28000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1295     { "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21,
1296       0x20000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1297     { "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1298       0x28000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1299     { "AND", CoreMeta11|CoreMeta12|CoreMeta21,
1300       0x22000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1301     { "ANDMB", CoreMeta11|CoreMeta12|CoreMeta21,
1302       0x22000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1303     { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21,
1304       0x2a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1305     { "ANDSMB", CoreMeta11|CoreMeta12|CoreMeta21,
1306       0x2a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1307     { "ANDT", CoreMeta11|CoreMeta12|CoreMeta21,
1308       0x22000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1309     { "ANDMT", CoreMeta11|CoreMeta12|CoreMeta21,
1310       0x22000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1311     { "ANDST", CoreMeta11|CoreMeta12|CoreMeta21,
1312       0x2a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1313     { "ANDSMT", CoreMeta11|CoreMeta12|CoreMeta21,
1314       0x2a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1315     { "AND", DspMeta21,
1316       0x20000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1317     { "AND", CoreMeta11|CoreMeta12|CoreMeta21,
1318       0x26000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1319     { "ANDS", CoreMeta11|CoreMeta12|CoreMeta21,
1320       0x2e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1321     { "ANDQ", CoreMeta11|CoreMeta12|CoreMeta21,
1322       0x26000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1323     { "ANDSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1324       0x2e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1325     { "ANDQ", DspMeta21,
1326       0x20000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1327     COND_INSN ("ANDQ", "", 1, DspMeta21,
1328                0x240001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1329                DSP_ARGS_1|DSP_ARGS_QR),
1330     COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1331                0x24000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1332     { "ANDSQ", DspMeta21,
1333       0x28000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1334     COND_INSN ("ANDSQ", "", 1, DspMeta21,
1335                0x2c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1336                DSP_ARGS_1|DSP_ARGS_QR),
1337     COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1338                0x2c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1339     COND_INSN ("AND", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1340                0x26000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1341     COND_INSN ("ANDS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1342                0x2e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1343     COND_INSN ("ANDQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1344                0x26000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1345     COND_INSN ("ANDSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1346                0x2e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1347     { "OR", CoreMeta11|CoreMeta12|CoreMeta21,
1348       0x30000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1349     { "ORS", CoreMeta11|CoreMeta12|CoreMeta21,
1350       0x38000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1351     { "ORQ", CoreMeta11|CoreMeta12|CoreMeta21,
1352       0x30000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1353     { "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1354       0x38000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1355     { "OR", CoreMeta11|CoreMeta12|CoreMeta21,
1356       0x32000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1357     { "ORMB", CoreMeta11|CoreMeta12|CoreMeta21,
1358       0x32000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1359     { "ORS", CoreMeta11|CoreMeta12|CoreMeta21,
1360       0x3a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1361     { "ORSMB", CoreMeta11|CoreMeta12|CoreMeta21,
1362       0x3a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1363     { "ORT", CoreMeta11|CoreMeta12|CoreMeta21,
1364       0x32000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1365     { "ORMT", CoreMeta11|CoreMeta12|CoreMeta21,
1366       0x32000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1367     { "ORST", CoreMeta11|CoreMeta12|CoreMeta21,
1368       0x3a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1369     { "ORSMT", CoreMeta11|CoreMeta12|CoreMeta21,
1370       0x3a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1371     { "OR", CoreMeta11|CoreMeta12|CoreMeta21,
1372       0x36000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1373     { "ORS", CoreMeta11|CoreMeta12|CoreMeta21,
1374       0x3e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1375     { "ORQ", CoreMeta11|CoreMeta12|CoreMeta21,
1376       0x36000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1377     { "ORSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1378       0x3e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1379     { "ORQ", DspMeta21,
1380       0x30000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1381     COND_INSN ("ORQ", "", 1, DspMeta21,
1382                0x340001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1383                DSP_ARGS_1|DSP_ARGS_QR),
1384     COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1385                0x34000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1386     { "ORSQ", DspMeta21,
1387       0x38000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1388     COND_INSN ("ORSQ", "", 1, DspMeta21,
1389                0x3c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1390                DSP_ARGS_1|DSP_ARGS_QR),
1391     COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1392                0x3c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1393     COND_INSN ("OR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1394                0x36000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1395     COND_INSN ("ORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1396                0x3e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1397     COND_INSN ("ORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1398                0x36000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1399     COND_INSN ("ORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1400                0x3e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1401     { "XOR", CoreMeta11|CoreMeta12|CoreMeta21,
1402       0x40000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1403     { "XORS", CoreMeta11|CoreMeta12|CoreMeta21,
1404       0x48000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1405     { "XORQ", CoreMeta11|CoreMeta12|CoreMeta21,
1406       0x40000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1407     { "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1408       0x48000040, 0xfe00017e, INSN_GP, ENC_ALU, GP_ARGS_QR },
1409     { "XOR", CoreMeta11|CoreMeta12|CoreMeta21,
1410       0x42000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1411     { "XORMB", CoreMeta11|CoreMeta12|CoreMeta21,
1412       0x42000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1413     { "XORS", CoreMeta11|CoreMeta12|CoreMeta21,
1414       0x4a000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1415     { "XORSMB", CoreMeta11|CoreMeta12|CoreMeta21,
1416       0x4a000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1417     { "XORT", CoreMeta11|CoreMeta12|CoreMeta21,
1418       0x42000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1419     { "XORMT", CoreMeta11|CoreMeta12|CoreMeta21,
1420       0x42000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1421     { "XORST", CoreMeta11|CoreMeta12|CoreMeta21,
1422       0x4a000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1423     { "XORSMT", CoreMeta11|CoreMeta12|CoreMeta21,
1424       0x4a000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1425     { "XOR", CoreMeta11|CoreMeta12|CoreMeta21,
1426       0x46000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1427     { "XORS", CoreMeta11|CoreMeta12|CoreMeta21,
1428       0x4e000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1429     { "XORQ", CoreMeta11|CoreMeta12|CoreMeta21,
1430       0x46000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1431     { "XORSQ", CoreMeta11|CoreMeta12|CoreMeta21,
1432       0x4e000021, 0xfe000021, INSN_GP, ENC_ALU, GP_ARGS_QR },
1433     { "XORQ", DspMeta21,
1434       0x40000140, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1435     COND_INSN ("XORQ", "", 1, DspMeta21,
1436                0x440001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1437                DSP_ARGS_1|DSP_ARGS_QR),
1438     COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1439                0x44000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1440     { "XORSQ", DspMeta21,
1441       0x48000140, 0xfe000140, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_QR },
1442     COND_INSN ("XORSQ", "", 1, DspMeta21,
1443                0x4c0001c0, 0xfe0001de, INSN_DSP, ENC_DALU,
1444                DSP_ARGS_1|DSP_ARGS_QR),
1445     COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1446                0x4c000000, 0xfe00001e, INSN_GP, ENC_ALU, 0),
1447     COND_INSN ("XOR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1448                0x46000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1449     COND_INSN ("XORS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1450                0x4e000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1451     COND_INSN ("XORQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1452                0x46000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1453     COND_INSN ("XORSQ", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1454                0x4e000001, 0xfe00003f, INSN_GP, ENC_ALU, GP_ARGS_QR),
1455     { "LSL", CoreMeta11|CoreMeta12|CoreMeta21,
1456       0x50000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1457     { "LSL", CoreMeta11|CoreMeta12|CoreMeta21,
1458       0x54000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1459     COND_INSN ("LSL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1460                0x54000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1461     { "LSLS", CoreMeta11|CoreMeta12|CoreMeta21,
1462       0x58000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1463     { "LSLS", CoreMeta11|CoreMeta12|CoreMeta21,
1464       0x5c000020, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1465     COND_INSN ("LSLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1466                0x5c000000, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1467     { "LSR", CoreMeta11|CoreMeta12|CoreMeta21,
1468       0x50000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1469     { "LSR", CoreMeta11|CoreMeta12|CoreMeta21,
1470       0x54000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1471     COND_INSN ("LSR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1472                0x54000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1473     { "LSRS", CoreMeta11|CoreMeta12|CoreMeta21,
1474       0x58000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1475     { "LSRS", CoreMeta11|CoreMeta12|CoreMeta21,
1476       0x5c000060, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1477     COND_INSN ("LSRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1478                0x5c000040, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1479     { "ASL", CoreMeta11|CoreMeta12|CoreMeta21,
1480       0x50000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1481     { "ASL", CoreMeta11|CoreMeta12|CoreMeta21,
1482       0x540000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1483     COND_INSN ("ASL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1484                0x54000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1485     { "ASLS", CoreMeta11|CoreMeta12|CoreMeta21,
1486       0x58000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1487     { "ASLS", CoreMeta11|CoreMeta12|CoreMeta21,
1488       0x5c0000a0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1489     COND_INSN ("ASLS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1490                0x5c000080, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1491     { "ASR", CoreMeta11|CoreMeta12|CoreMeta21,
1492       0x500000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1493     { "ASR", CoreMeta11|CoreMeta12|CoreMeta21,
1494       0x540000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1495     COND_INSN ("ASR", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1496                0x540000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1497     { "ASRS", CoreMeta11|CoreMeta12|CoreMeta21,
1498       0x580000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0 },
1499     { "ASRS", CoreMeta11|CoreMeta12|CoreMeta21,
1500       0x5c0000e0, 0xfc0001e0, INSN_GP, ENC_SHIFT, 0 },
1501     COND_INSN ("ASRS", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1502                0x5c0000c0, 0xfc0001ff, INSN_GP, ENC_SHIFT, 0),
1503     { "MULW", CoreMeta11|CoreMeta12|CoreMeta21,
1504       0x60000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1505     { "MULD", CoreMeta11|CoreMeta12|CoreMeta21,
1506       0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1507     /* MUL is a synonym from MULD. */
1508     { "MUL", CoreMeta11|CoreMeta12|CoreMeta21,
1509       0x60000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0 },
1510     { "MULW", CoreMeta11|CoreMeta12|CoreMeta21,
1511       0x62000000, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1512     { "MULD", CoreMeta11|CoreMeta12|CoreMeta21,
1513       0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1514     { "MUL", CoreMeta11|CoreMeta12|CoreMeta21,
1515       0x62000004, 0xfe000005, INSN_GP, ENC_ALU, 0 },
1516     { "MULWT", CoreMeta11|CoreMeta12|CoreMeta21,
1517       0x62000001, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1518     { "MULDT", CoreMeta11|CoreMeta12|CoreMeta21,
1519       0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1520     { "MULT", CoreMeta11|CoreMeta12|CoreMeta21,
1521       0x62000005, 0xfe000007, INSN_GP, ENC_ALU, 0 },
1522     { "MULW", CoreMeta11|CoreMeta12|CoreMeta21,
1523       0x64000020, 0xfe0001e0, INSN_GP, ENC_ALU, 0 },
1524     { "MULD", CoreMeta11|CoreMeta12|CoreMeta21,
1525       0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 },
1526     { "MUL", CoreMeta11|CoreMeta12|CoreMeta21,
1527       0x64000060, 0xfe0001e0, INSN_GP, ENC_ALU, 0 },
1528     { "MULW", CoreMeta11|CoreMeta12|CoreMeta21,
1529       0x66000020, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1530     { "MULD", CoreMeta11|CoreMeta12|CoreMeta21,
1531       0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1532     { "MUL", CoreMeta11|CoreMeta12|CoreMeta21,
1533       0x66000021, 0xfe000021, INSN_GP, ENC_ALU, 0 },
1534     COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1535                0x64000000, 0xfe0001fe, INSN_GP, ENC_ALU, 0),
1536     COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1537                0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0),
1538     COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1539                0x64000040, 0xfe0001fe, INSN_GP, ENC_ALU, 0),
1540     COND_INSN ("MULW", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1541                0x66000000, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1542     COND_INSN ("MULD", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1543                0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1544     COND_INSN ("MUL", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1545                0x66000001, 0xfe00003f, INSN_GP, ENC_ALU, 0),
1546     { "MIN", CoreMeta11|CoreMeta12|CoreMeta21,
1547       0x70000020, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 },
1548     { "MAX", CoreMeta11|CoreMeta12|CoreMeta21,
1549       0x70000024, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 },
1550     { "FFB", CoreMeta11|CoreMeta12|CoreMeta21,
1551       0x70000004, 0xfe003fff, INSN_GP, ENC_BITOP, 0 },
1552     { "NORM", CoreMeta11|CoreMeta12|CoreMeta21,
1553       0x70000008, 0xfe003fff, INSN_GP, ENC_BITOP, 0 },
1554     { "ABS", CoreMeta11|CoreMeta12|CoreMeta21,
1555       0x70000028, 0xfe003fff, INSN_GP, ENC_BITOP, 0 },
1556     { "XSDB", CoreMeta11|CoreMeta12|CoreMeta21,
1557       0xaa000000, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1558     { "XSDSB", CoreMeta11|CoreMeta12|CoreMeta21,
1559       0xaa000008, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1560     { "XSDW", CoreMeta11|CoreMeta12|CoreMeta21,
1561       0xaa000002, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1562     { "XSDSW", CoreMeta11|CoreMeta12|CoreMeta21,
1563       0xaa00000a, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1564     { "RTDW", CoreMeta11|CoreMeta12|CoreMeta21,
1565       0xaa000006, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1566     { "RTDSW", CoreMeta11|CoreMeta12|CoreMeta21,
1567       0xaa00000e, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1568     { "NMIN", CoreMeta11|CoreMeta12|CoreMeta21,
1569       0x7000002c, 0xfe0001ff, INSN_GP, ENC_MIN_MAX, 0 },
1570
1571     /* Condition setting operations */
1572     { "CMP", CoreMeta11|CoreMeta12|CoreMeta21,
1573       0x70000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 },
1574     { "TST", CoreMeta11|CoreMeta12|CoreMeta21,
1575       0x78000000, 0xfef801fe, INSN_GP, ENC_CMP, 0 },
1576     { "CMP", CoreMeta11|CoreMeta12|CoreMeta21,
1577       0x72000000, 0xfe000005, INSN_GP, ENC_CMP, 0 },
1578     { "CMPMB", CoreMeta11|CoreMeta12|CoreMeta21,
1579       0x72000004, 0xfe000005, INSN_GP, ENC_CMP, 0 },
1580     { "TST", CoreMeta11|CoreMeta12|CoreMeta21,
1581       0x7a000000, 0xfe000005, INSN_GP, ENC_CMP, 0 },
1582     { "TSTMB", CoreMeta11|CoreMeta12|CoreMeta21,
1583       0x7a000004, 0xfe000005, INSN_GP, ENC_CMP, 0 },
1584     { "CMPT", CoreMeta11|CoreMeta12|CoreMeta21,
1585       0x72000001, 0xfe000007, INSN_GP, ENC_CMP, 0 },
1586     { "CMPMT", CoreMeta11|CoreMeta12|CoreMeta21,
1587       0x72000005, 0xfe000007, INSN_GP, ENC_CMP, 0 },
1588     { "TSTT", CoreMeta11|CoreMeta12|CoreMeta21,
1589       0x7a000001, 0xfe000007, INSN_GP, ENC_CMP, 0 },
1590     { "TSTMT", CoreMeta11|CoreMeta12|CoreMeta21,
1591       0x7a000005, 0xfe000007, INSN_GP, ENC_CMP, 0 },
1592     COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1593                0x74000000, 0xfef801fe, INSN_GP, ENC_CMP, 0),
1594     COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1595                0x7c000000, 0xfef801fe, INSN_GP, ENC_CMP, 0),
1596     COND_INSN ("CMP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1597                0x76000000, 0xfef8003e, INSN_GP, ENC_CMP, 0),
1598     COND_INSN ("TST", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1599                0x7e000000, 0xfef8003e, INSN_GP, ENC_CMP, 0),
1600
1601     /* No-op (BNV) */
1602     { "NOP", CoreMeta11|CoreMeta12|CoreMeta21,
1603       0xa0fffffe, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1604
1605     /* Branch */
1606     COND_INSN ("B", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1607                0xa0000000, 0xff00001f, INSN_GP, ENC_BRANCH, 0),
1608     COND_INSN ("B", "R", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1609                0xa0000001, 0xff00001f, INSN_GP, ENC_BRANCH, 0),
1610
1611     /* System operations */
1612     { "LOCK0", CoreMeta11|CoreMeta12|CoreMeta21,
1613       0xa8000000, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1614     { "LOCK1", CoreMeta11|CoreMeta12|CoreMeta21,
1615       0xa8000001, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1616     { "LOCK2", CoreMeta11|CoreMeta12|CoreMeta21,
1617       0xa8000003, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1618     { "RTI", CoreMeta11|CoreMeta12|CoreMeta21,
1619       0xa3ffffff, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1620     { "RTH", CoreMeta11|CoreMeta12|CoreMeta21,
1621       0xa37fffff, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1622     COND_INSN ("KICK", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1623                0xa3000001, 0xff003e1f, INSN_GP, ENC_KICK, 0),
1624     { "SWITCH", CoreMeta11|CoreMeta12|CoreMeta21,
1625       0xaf000000, 0xff000000, INSN_GP, ENC_SWITCH, 0 },
1626     { "DCACHE", CoreMeta11|CoreMeta12|CoreMeta21,
1627       0xad000000, 0xff000087, INSN_GP, ENC_CACHEW, 0 },
1628     { "ICACHEEXIT", CoreMeta12|CoreMeta21,
1629       0xae000000, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1630     { "ICACHEEXITR", CoreMeta12|CoreMeta21,
1631       0xae000001, 0xffffffff, INSN_GP, ENC_NONE, 0 },
1632     { "ICACHE", CoreMeta12|CoreMeta21,
1633       0xae000000, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 },
1634     { "ICACHER", CoreMeta12|CoreMeta21,
1635       0xae000001, 0xff0001e1, INSN_GP, ENC_ICACHE, 0 },
1636
1637     /* Meta 2 instructions */
1638     { "CACHERD", CoreMeta21,
1639       0xad000081, 0xff000087, INSN_GP, ENC_CACHER, 0 },
1640     { "CACHERL", CoreMeta21,
1641       0xad000083, 0xff000087, INSN_GP, ENC_CACHER, 0 },
1642     { "CACHEWD", CoreMeta21,
1643       0xad000001, 0xff000087, INSN_GP, ENC_CACHEW, 0 },
1644     { "CACHEWL", CoreMeta21,
1645       0xad000003, 0xff000087, INSN_GP, ENC_CACHEW, 0 },
1646     COND_INSN ("DEFR", "", 1, CoreMeta21,
1647                0xa3002001, 0xff003e1f, INSN_GP, ENC_KICK, 0),
1648     { "BEXD", CoreMeta21,
1649       0xaa000004, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1650     { "BEXSD", CoreMeta21,
1651       0xaa00000c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1652     { "BEXL", CoreMeta21,
1653       0xaa000014, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1654     { "BEXSL", CoreMeta21,
1655       0xaa00001c, 0xff003ffe, INSN_GP, ENC_BITOP, 0 },
1656     { "LNKGETB", CoreMeta21,
1657       0xad000080, 0xff000087, INSN_GP, ENC_LNKGET, 0 },
1658     { "LNKGETW", CoreMeta21,
1659       0xad000082, 0xff000087, INSN_GP, ENC_LNKGET, 0 },
1660     { "LNKGETD", CoreMeta21,
1661       0xad000084, 0xff000087, INSN_GP, ENC_LNKGET, 0 },
1662     { "LNKGETL", CoreMeta21,
1663       0xad000086, 0xff000087, INSN_GP, ENC_LNKGET, 0 },
1664     COND_INSN ("LNKSETB", "", 1, CoreMeta21,
1665                0xa4000080, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1666     COND_INSN ("LNKSETW", "", 1, CoreMeta21,
1667                0xa4000081, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1668     COND_INSN ("LNKSETD", "", 1, CoreMeta21,
1669                0xa4000280, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1670     COND_INSN ("LNKSETL", "", 1, CoreMeta21,
1671                0xa4000281, 0xff00039f, INSN_GP, ENC_COND_SET, 0),
1672
1673     /* Meta 2 FPU instructions */
1674
1675     /* Port-to-unit MOV */
1676     COND_INSN ("MOVL", "", 1, FpuMeta21,
1677                0xa1800201, 0xfff83e1f, INSN_FPU, ENC_MOV_PORT, 0),
1678
1679     /* Read pipeline drain */
1680     { "MMOVD", FpuMeta21,
1681       0xce000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 },
1682     { "MMOVL", FpuMeta21,
1683       0xcf000006, 0xfffc007f, INSN_FPU, ENC_MMOV, 0 },
1684
1685     /* FP data movement instructions */
1686     FCOND_INSN ("ABS", "", 1, FpuMeta21,
1687                 0xf0000080, 0xff843f9f, INSN_FPU, ENC_FMOV, 0),
1688     { "MMOVD", FpuMeta21,
1689       0xbe000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 },
1690     { "MMOVL", FpuMeta21,
1691       0xbf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 },
1692     { "MMOVD", FpuMeta21,
1693       0xce000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 },
1694     { "MMOVL", FpuMeta21,
1695       0xcf000002, 0xff84007e, INSN_FPU, ENC_FMMOV, 0 },
1696     { "MOVD", FpuMeta21,
1697       0x08000144, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 },
1698     { "MOVD", FpuMeta21,
1699       0x080001c4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 },
1700     { "MOVL", FpuMeta21,
1701       0x08000154, 0xfe03e1ff, INSN_FPU, ENC_FMOV_DATA, 0 },
1702     { "MOVL", FpuMeta21,
1703       0x080001d4, 0xfe83c1ff, INSN_FPU, ENC_FMOV_DATA, 0 },
1704     FCOND_INSN ("MOV", "", 1, FpuMeta21,
1705                 0xf0000000, 0xff843f9f, INSN_FPU, ENC_FMOV, 0),
1706     { "MOV", FpuMeta21,
1707       0xf0000001, 0xff800001, INSN_FPU, ENC_FMOV_I, 0 },
1708     FCOND_INSN ("NEG", "", 1, FpuMeta21,
1709                 0xf0000100, 0xff843f9f, INSN_FPU, ENC_FMOV, 0),
1710     { "PACK", FpuMeta21,
1711       0xf0000180, 0xff8c21ff, INSN_FPU, ENC_FPACK, 0 },
1712     { "SWAP", FpuMeta21,
1713       0xf00001c0, 0xff8c7fff, INSN_FPU, ENC_FSWAP, 0 },
1714
1715     /* FP comparison instructions */
1716     FCOND_INSN ("CMP", "", 1, FpuMeta21,
1717                 0xf3000000, 0xfff4201f, INSN_FPU, ENC_FCMP, 0),
1718     FCOND_INSN ("MAX", "", 1, FpuMeta21,
1719                 0xf3000081, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0),
1720     FCOND_INSN ("MIN", "", 1, FpuMeta21,
1721                 0xf3000001, 0xff84219f, INSN_FPU, ENC_FMINMAX, 0),
1722
1723     /* FP data conversion instructions */
1724     FCOND_INSN ("DTOF", "", 1, FpuMeta21,
1725                 0xf2000121, 0xff843fff, INSN_FPU, ENC_FCONV, 0),
1726     FCOND_INSN ("FTOD", "", 1, FpuMeta21,
1727                 0xf2000101, 0xff843fff, INSN_FPU, ENC_FCONV, 0),
1728     FCOND_INSN ("DTOH", "", 1, FpuMeta21,
1729                 0xf2000320, 0xff843fff, INSN_FPU, ENC_FCONV, 0),
1730     FCOND_INSN ("FTOH", "", 1, FpuMeta21,
1731                 0xf2000300, 0xff843fbf, INSN_FPU, ENC_FCONV, 0),
1732     FCOND_INSN ("DTOI", "", 1, FpuMeta21,
1733                 0xf2002120, 0xff842fff, INSN_FPU, ENC_FCONV, 0),
1734     FCOND_INSN ("FTOI", "", 1, FpuMeta21,
1735                 0xf2002100, 0xff842fbf, INSN_FPU, ENC_FCONV, 0),
1736     FCOND_INSN ("DTOL", "", 1, FpuMeta21,
1737                 0xf2002320, 0xff8c6fff, INSN_FPU, ENC_FCONV, 0),
1738
1739     FCOND_INSN ("DTOX", "", 1, FpuMeta21,
1740                 0xf2000020, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0),
1741     FCOND_INSN ("FTOX", "", 1, FpuMeta21,
1742                 0xf2000000, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0),
1743     FCOND_INSN ("DTOXL", "", 1, FpuMeta21,
1744                 0xf20000a0, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0),
1745
1746     FCOND_INSN ("HTOD", "", 1, FpuMeta21,
1747                 0xf2000321, 0xff843fff, INSN_FPU, ENC_FCONV, 0),
1748     FCOND_INSN ("HTOF", "", 1, FpuMeta21,
1749                 0xf2000301, 0xff843fbf, INSN_FPU, ENC_FCONV, 0),
1750     FCOND_INSN ("ITOD", "", 1, FpuMeta21,
1751                 0xf2002121, 0xff843fff, INSN_FPU, ENC_FCONV, 0),
1752     FCOND_INSN ("ITOF", "", 1, FpuMeta21,
1753                 0xf2002101, 0xff843fbf, INSN_FPU, ENC_FCONV, 0),
1754     FCOND_INSN ("LTOD", "", 1, FpuMeta21,
1755                 0xf2002321, 0xff8c7fff, INSN_FPU, ENC_FCONV, 0),
1756
1757     FCOND_INSN ("XTOD", "", 1, FpuMeta21,
1758                 0xf2000021, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0),
1759     FCOND_INSN ("XTOF", "", 1, FpuMeta21,
1760                 0xf2000001, 0xff8401bf, INSN_FPU, ENC_FCONVX, 0),
1761     FCOND_INSN ("XLTOD", "", 1, FpuMeta21,
1762                 0xf20000a1, 0xff8c40ff, INSN_FPU, ENC_FCONVX, 0),
1763
1764     /* FP basic arithmetic instructions */
1765     FCOND_INSN ("ADD", "", 1, FpuMeta21,
1766                 0xf1000001, 0xff84211f, INSN_FPU, ENC_FBARITH, 0),
1767     FCOND_INSN ("MUL", "", 1, FpuMeta21,
1768                 0xf1000100, 0xff84211f, INSN_FPU, ENC_FBARITH, 0),
1769     FCOND_INSN ("SUB", "", 1, FpuMeta21,
1770                 0xf1000101, 0xff84211f, INSN_FPU, ENC_FBARITH, 0),
1771
1772     /* FP extended arithmetic instructions */
1773     { "MAC", FpuMeta21,
1774       0xf6000000, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 },
1775     { "MACS", FpuMeta21,
1776       0xf6000100, 0xfffc219f, INSN_FPU, ENC_FEARITH, 0 },
1777
1778     { "MAR", FpuMeta21,
1779       0xf6000004, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 },
1780     { "MARS", FpuMeta21,
1781       0xf6000104, 0xff84211f, INSN_FPU, ENC_FEARITH, 0 },
1782
1783     { "MAW", FpuMeta21,
1784       0xf6000008, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 },
1785     { "MAWS", FpuMeta21,
1786       0xf6000108, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 },
1787     { "MAW1", FpuMeta21,
1788       0xf6000009, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 },
1789     { "MAWS1", FpuMeta21,
1790       0xf6000109, 0xff84219f, INSN_FPU, ENC_FEARITH, 0 },
1791
1792     FCOND_INSN ("MXA", "", 1, FpuMeta21,
1793                 0xf5000000, 0xff84211f, INSN_FPU, ENC_FEARITH, 0),
1794     FCOND_INSN ("MXAS", "", 1, FpuMeta21,
1795                 0xf5000100, 0xff84211f, INSN_FPU, ENC_FEARITH, 0),
1796     FCOND_INSN ("MXA1", "", 1, FpuMeta21,
1797                 0xf5000001, 0xff84211f, INSN_FPU, ENC_FEARITH, 0),
1798     FCOND_INSN ("MXAS1", "", 1, FpuMeta21,
1799                 0xf5000101, 0xff84211f, INSN_FPU, ENC_FEARITH, 0),
1800
1801     { "MUZ", FpuMeta21,
1802       0xf6000010, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 },
1803     { "MUZS", FpuMeta21,
1804       0xf6000110, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 },
1805     { "MUZ1", FpuMeta21,
1806       0xf6000011, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 },
1807     { "MUZS1", FpuMeta21,
1808       0xf6000111, 0xff84211d, INSN_FPU, ENC_FEARITH, 0 },
1809
1810     { "RCP", FpuMeta21,
1811       0xf7000000, 0xff84391f, INSN_FPU, ENC_FREC, 0 },
1812     { "RSQ", FpuMeta21,
1813       0xf7000100, 0xff84391f, INSN_FPU, ENC_FREC, 0 },
1814
1815     /* FP SIMD arithmetic instructions */
1816     { "ADDRE", FpuMeta21,
1817       0xf4000000, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 },
1818     { "MULRE", FpuMeta21,
1819       0xf4000001, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 },
1820     { "SUBRE", FpuMeta21,
1821       0xf4000100, 0xff8c637f, INSN_FPU, ENC_FSIMD, 0 },
1822
1823     /* FP memory instructions */
1824     { "MGETD", FpuMeta21,
1825       0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1826     { "MGET", FpuMeta21,
1827       0xce000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1828     { "MGETL", FpuMeta21,
1829       0xcf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1830
1831     { "MSETD", FpuMeta21,
1832       0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1833     { "MSET", FpuMeta21,
1834       0xbe000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1835     { "MSETL", FpuMeta21,
1836       0xbf000000, 0xff00001f, INSN_FPU, ENC_MGET_MSET, 0 },
1837
1838     /* FP accumulator memory instructions */
1839     { "GETL", FpuMeta21,
1840       0xcf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 },
1841     { "SETL", FpuMeta21,
1842       0xbf000004, 0xffe03f9f, INSN_FPU, ENC_FGET_SET_ACF, 0 },
1843
1844     /* DSP FPU data movement */
1845     { "MOV", DspMeta21|FpuMeta21,
1846       0x08000146, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU,
1847       DSP_ARGS_2|DSP_ARGS_DSP_SRC1 },
1848     { "MOV", DspMeta21|FpuMeta21,
1849       0x080001c6, 0xfe0001ee, INSN_DSP_FPU, ENC_DALU,
1850       DSP_ARGS_2|DSP_ARGS_DSP_SRC2 },
1851
1852     /* Unit-to-unit MOV */
1853     COND_INSN ("MOV", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1854                0xa3000000, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0),
1855     COND_INSN ("TTMOV", "", 1, CoreMeta12|CoreMeta21,
1856                0xa3000201, 0xff00021f, INSN_GP, ENC_MOV_U2U, 0),
1857     COND_INSN ("SWAP", "", 1, CoreMeta11|CoreMeta12|CoreMeta21,
1858                0xa3000200, 0xff00021f, INSN_GP, ENC_SWAP, 0),
1859
1860     /* DSP memory instructions */
1861     { "GETD", DspMeta21,
1862       0x94000100, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 },
1863     { "SETD", DspMeta21,
1864       0x94000000, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 },
1865     { "GETL", DspMeta21,
1866       0x94000104, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 },
1867     { "SETL", DspMeta21,
1868       0x94000004, 0xff0001fc, INSN_DSP, ENC_DGET_SET, 0 },
1869
1870     /* DSP read pipeline prime/drain */
1871     { "MMOVD", DspMeta21,
1872       0xca000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 },
1873     { "MMOVL", DspMeta21,
1874       0xcb000001, 0xff00001f, INSN_DSP, ENC_MMOV, 0 },
1875     { "MMOVD", DspMeta21,
1876       0xcc000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 },
1877     { "MMOVL", DspMeta21,
1878       0xcd000001, 0xff07c067, INSN_DSP, ENC_MMOV, 0 },
1879
1880     /* DSP Template instantiation */
1881     TEMPLATE_INSN (DspMeta21, 0x90000000, 0xff00000f, INSN_DSP),
1882     TEMPLATE_INSN (DspMeta21, 0x93000000, 0xff0001ff, INSN_DSP),
1883     TEMPLATE_INSN (DspMeta21, 0x95000000, 0xff00000f, INSN_DSP),
1884
1885     { "AND", DspMeta21,
1886       0x22000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1887     { "ANDS", DspMeta21,
1888       0x28000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1889     { "ANDS", DspMeta21,
1890       0x2a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1891     { "MAX", DspMeta21,
1892       0x70000124, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1893     { "MIN", DspMeta21,
1894       0x70000120, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1895     { "NMIN", DspMeta21,
1896       0x7000012c, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1897     { "OR", DspMeta21,
1898       0x30000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1899     { "OR", DspMeta21,
1900       0x32000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1901     { "ORS", DspMeta21,
1902       0x38000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1903     { "ORS", DspMeta21,
1904       0x3a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1905     { "XOR", DspMeta21,
1906       0x40000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1907     { "XOR", DspMeta21,
1908       0x42000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1909     { "XORS", DspMeta21,
1910       0x48000100, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1 },
1911     { "XORS", DspMeta21,
1912       0x4a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1913     { "ADDB8", DspMeta21,
1914       0x20000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1915     { "ADDT8", DspMeta21,
1916       0x2000010c, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1917     { "ADDSB8", DspMeta21,
1918       0x28000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1919     { "ADDST8", DspMeta21,
1920       0x2800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1921     { "MULB8", DspMeta21,
1922       0x40000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1923     { "MULT8", DspMeta21,
1924       0x4000010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1925     { "MULSB8", DspMeta21,
1926       0x48000108, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1927     { "MULST8", DspMeta21,
1928       0x4800010c, 0xfe00012c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1929     { "SUBB8", DspMeta21,
1930       0x30000108, 0xfe00010c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1931     { "SUBT8", DspMeta21,
1932       0x3000010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1933     { "SUBSB8", DspMeta21,
1934       0x38000108, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1935     { "SUBST8", DspMeta21,
1936       0x3800010c, 0xfe00014c, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_SPLIT8 },
1937     { "MUL", DspMeta21,
1938       0x60000100, 0xfe000100, INSN_DSP, ENC_DALU,
1939       DSP_ARGS_1|DSP_ARGS_DACC },
1940     { "MUL", DspMeta21,
1941       0x62000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_1|DSP_ARGS_IMM },
1942     { "ABS", DspMeta21,
1943       0x70000128, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1944     { "FFB", DspMeta21,
1945       0x70000104, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1946     { "NORM", DspMeta21,
1947       0x70000108, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1948     { "CMP", DspMeta21,
1949       0x70000000, 0xfe0000ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM },
1950     { "CMP", DspMeta21,
1951       0x72000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM },
1952     { "TST", DspMeta21,
1953       0x78000100, 0xfe0001ec, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM },
1954     { "TST", DspMeta21,
1955       0x7a000003, 0xfe000003, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_IMM },
1956     { "MOV", DspMeta21,
1957       0x00000104, 0xfe078146, INSN_DSP, ENC_DALU,
1958       DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_DSP_SRC2|DSP_ARGS_IMM },
1959     { "MOVS", DspMeta21,
1960       0x08000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 },
1961     { "MOV", DspMeta21,
1962       0x91000000, 0xff000000, INSN_DSP, ENC_DALU,
1963       DSP_ARGS_2|DSP_ARGS_DSP_SRC1|DSP_ARGS_IMM },
1964     { "MOV", DspMeta21,
1965       0x92000000, 0xff000000, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 },
1966     { "NEG", DspMeta21,
1967       0x10000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 },
1968     { "NEGS", DspMeta21,
1969       0x18000104, 0xfe000146, INSN_DSP, ENC_DALU, DSP_ARGS_2|DSP_ARGS_DSP_SRC2 },
1970     { "XSDB", DspMeta21,
1971       0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1972     { "XSD", DspMeta21,
1973       0xaa000100, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1974     { "XSDW", DspMeta21,
1975       0xaa000102, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1976     { "XSDSB", DspMeta21,
1977       0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1978     { "XSDS", DspMeta21,
1979       0xaa000108, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1980     { "XSDSW", DspMeta21,
1981       0xaa00010a, 0xff0001ee, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
1982     { "LSL", DspMeta21,
1983       0x50000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
1984     { "LSR", DspMeta21,
1985       0x50000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
1986     { "ASL", DspMeta21,
1987       0x50000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
1988     { "ASR", DspMeta21,
1989       0x500001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
1990     { "LSL", DspMeta21,
1991       0x54000120, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM },
1992     { "LSR", DspMeta21,
1993       0x54000160, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM },
1994     { "ASL", DspMeta21,
1995       0x540001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM },
1996     { "ASR", DspMeta21,
1997       0x540001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, DSP_ARGS_IMM },
1998     COND_INSN ("LSL", "", 1, DspMeta21,
1999                0x54000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2000     COND_INSN ("LSR", "", 1, DspMeta21,
2001                0x54000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2002     COND_INSN ("ASL", "", 1, DspMeta21,
2003                0x54000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2004     COND_INSN ("ASR", "", 1, DspMeta21,
2005                0x540001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2006     { "LSLS", DspMeta21,
2007       0x58000100, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
2008     { "LSRS", DspMeta21,
2009       0x58000140, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
2010     { "ASLS", DspMeta21,
2011       0x58000180, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
2012     { "ASRS", DspMeta21,
2013       0x580001c0, 0xfc0001c0, INSN_DSP, ENC_DALU, 0 },
2014     COND_INSN ("LSLS", "", 1, DspMeta21,
2015                0x5c000100, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2016     COND_INSN ("LSRS", "", 1, DspMeta21,
2017                0x5c000140, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2018     COND_INSN ("ASLS", "", 1, DspMeta21,
2019                0x5c000180, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2020     COND_INSN ("ASRS", "", 1, DspMeta21,
2021                0x5c0001c0, 0xfc0001fe, INSN_DSP, ENC_DALU, 0),
2022     { "LSLS", DspMeta21,
2023       0x5c000120, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 },
2024     { "LSRS", DspMeta21,
2025       0x5c000160, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 },
2026     { "ASLS", DspMeta21,
2027       0x5c0001a0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 },
2028     { "ASRS", DspMeta21,
2029       0x5c0001e0, 0xfc0001e0, INSN_DSP, ENC_DALU, 0 },
2030     { "RTDW", DspMeta21,
2031       0xaa000106, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
2032     { "RTDSW", DspMeta21,
2033       0xaa00010e, 0xff00010e, INSN_DSP, ENC_DALU, DSP_ARGS_2 },
2034   };
2035
2036 #define UNIT_MASK                  0xf
2037 #define SHORT_UNIT_MASK            0x3
2038 #define EXT_BASE_REG_MASK          0x1
2039 #define REG_MASK                  0x1f
2040 #define CC_MASK                    0xf
2041 #define RMASK_MASK                0x7f
2042 #define GET_SET_IMM_MASK          0x3f
2043 #define GET_SET_IMM_BITS             6
2044 #define GET_SET_EXT_IMM_MASK     0xfff
2045 #define GET_SET_EXT_IMM_BITS        12
2046 #define DGET_SET_IMM_MASK          0x3
2047 #define DGET_SET_IMM_BITS            2
2048 #define MGET_MSET_MAX_REGS           8
2049 #define MMOV_MAX_REGS                8
2050 #define IMM16_MASK              0xffff
2051 #define IMM16_BITS                  16
2052 #define IMM19_MASK             0x7ffff
2053 #define IMM19_BITS                  19
2054 #define IMM8_MASK                 0xff
2055 #define IMM8_BITS                    8
2056 #define IMM24_MASK            0xffffff
2057 #define IMM24_BITS                  24
2058 #define IMM5_MASK                 0x1f
2059 #define IMM5_BITS                    5
2060 #define IMM6_MASK                 0x3f
2061 #define IMM6_BITS                    6
2062 #define IMM15_MASK              0x7fff
2063 #define IMM15_BITS                  15
2064 #define IMM4_MASK                 0x1f
2065 #define IMM4_BITS                    4
2066 #define CALLR_REG_MASK             0x7
2067 #define CPC_REG_MASK               0xf
2068 #define O2R_REG_MASK               0x7
2069 #define ACF_PART_MASK              0x3
2070 #define DSP_REG_MASK               0xf
2071 #define DSP_PART_MASK             0x17
2072 #define TEMPLATE_NUM_REGS            4
2073 #define TEMPLATE_REGS_MASK         0xf
2074
2075 #define IS_TEMPLATE_DEF(insn) (insn->dsp_daoppame_flags & DSP_DAOPPAME_TEMP)
2076
2077 unsigned int metag_get_set_size_bytes (unsigned int opcode);
2078 unsigned int metag_get_set_ext_size_bytes (unsigned int opcode);
2079 unsigned int metag_cond_set_size_bytes (unsigned int opcode);