1/*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21
22/*
23 * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
24 * Use is subject to license terms.
25 */
26
27/*
28 * Copyright 2009 Jason King.  All rights reserved.
29 * Use is subject to license terms.
30 */
31
32#include "libdisasm.h"
33#include "libdisasm_impl.h"
34#include "dis_sparc.h"
35#include "dis_sparc_fmt.h"
36
37#define	INVALID                \
38{                              \
39	.in_type = INST_NONE,  \
40	.in_arch = 0,          \
41	.in_data = {           \
42		.in_tbl = NULL \
43	}                      \
44}
45
46#define	INVALIDA(_arch)        \
47{                              \
48	.in_type = INST_NONE,  \
49	.in_arch = _arch,      \
50	.in_data = {           \
51		.in_tbl = NULL \
52	}                      \
53}
54
55#define	INST(_name, _arch, _flags)           \
56{                                            \
57	.in_type = INST_DEF,	             \
58	.in_arch = _arch,		     \
59	.in_data = {			     \
60		.in_def = {		     \
61			.in_name   = _name,  \
62			.in_flags  = _flags  \
63		}			     \
64	}				     \
65}
66
67#define	TABLE(_name, _arch)      \
68{                                \
69	.in_type = INST_TBL,     \
70	.in_arch = _arch,        \
71	.in_data = {             \
72		.in_tbl = &_name \
73	}                       \
74}
75
76#define	OVERLAY(_idx, _inst) \
77{                            \
78	.ov_idx  = _idx,     \
79	.ov_inst = _inst     \
80}
81
82#define	OVERLAY_END { .ov_idx = -1, .ov_inst = INVALID }
83
84#define	V8	DIS_SPARC_V8
85#define	V9	DIS_SPARC_V9
86#define	V9S	DIS_SPARC_V9_SGI
87#define	V9O	DIS_SPARC_V9_OPL
88#define	VALL	V8|V9|V9S|V9O
89
90/* branches */
91static const inst_t BPcc_table_def[16] = {
92	INST("bn",   V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
93	INST("be",   V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
94	INST("ble",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
95	INST("bl",   V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
96
97	INST("bleu", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
98	INST("bcs",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
99	INST("bneg", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
100	INST("bvs",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
101
102	INST("ba",   V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
103	INST("bne",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
104	INST("bg",   V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
105	INST("bge",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
106
107	INST("bgu",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
108	INST("bcc",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
109	INST("bpos", V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19)),
110	INST("bvc",  V9|V9S, FLG_PRED|FLG_RS1(REG_ICC)|FLG_DISP(DISP19))
111};
112
113
114static const table_t BPcc_table = {
115	.tbl_field = 28,
116	.tbl_len   = 4,
117	.tbl_ovp   = NULL,
118	.tbl_fmt   = fmt_branch,
119	.tbl_inp   = BPcc_table_def
120};
121
122static const inst_t Bicc_table_def[16] = {
123	INST("bn",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
124	INST("be",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
125	INST("ble",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
126	INST("bl",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
127
128	INST("bleu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
129	/* docs say it's 'bcs' but disassembler calles it synonym 'blu' */
130	INST("blu",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
131	INST("bneg", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
132	INST("bvs",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
133
134	INST("ba",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
135	INST("bne",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
136	INST("bg",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
137	INST("bge",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
138
139	INST("bgu",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
140	/*
141	 * while the docs say it's officially 'bcc', existing disassembler
142	 * uses the synonym bgeu
143	 */
144	INST("bgeu", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
145	INST("bpos", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
146	INST("bvc",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE))
147};
148
149static const table_t Bicc_table = {
150	.tbl_field = 28,
151	.tbl_len   = 4,
152	.tbl_ovp   = NULL,
153	.tbl_fmt   = fmt_branch,
154	.tbl_inp   = Bicc_table_def
155};
156
157static const inst_t BPr_table_def[16] = {
158	INVALID,
159	INST("brz",   V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
160	INST("brlez", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
161	INST("brlz",  V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
162
163	INVALID,
164	INST("brnz",  V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
165	INST("brgz",  V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
166	INST("brgez", V9|V9S, FLG_PRED|FLG_DISP(DISP16)|FLG_RS1(REG_INT)),
167
168	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
169};
170
171static const table_t BPr_table = {
172	.tbl_field = 28,
173	.tbl_len   = 4,
174	.tbl_ovp   = NULL,
175	.tbl_fmt   = fmt_branch,
176	.tbl_inp   = BPr_table_def
177};
178
179static const inst_t FBPfcc_table_def[16] = {
180	INST("fbn",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
181	INST("fbne",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
182	INST("fblg",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
183	INST("fbul",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
184
185	INST("fbl",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
186	INST("fbug",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
187	INST("fbg",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
188	INST("fbu",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
189
190	INST("fba",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
191	INST("fbe",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
192	INST("fbue",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
193	INST("fbge",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
194
195	INST("fbuge", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
196	INST("fble",  V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
197	INST("fbule", V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC)),
198	INST("fbo",   V9|V9S, FLG_PRED|FLG_DISP(DISP19)|FLG_RS1(REG_FCC))
199};
200
201static const table_t FBPfcc_table = {
202	.tbl_field = 28,
203	.tbl_len   = 4,
204	.tbl_ovp   = NULL,
205	.tbl_fmt   = fmt_branch,
206	.tbl_inp   = FBPfcc_table_def
207};
208
209static const inst_t FBfcc_table_def[16] = {
210	INST("fbn",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
211	INST("fbne",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
212	INST("fblg",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
213	INST("fbul",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
214
215	INST("fbl",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
216	INST("fbug",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
217	INST("fbg",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
218	INST("fbu",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
219
220	INST("fba",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
221	INST("fbe",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
222	INST("fbue",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
223	INST("fbge",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
224
225	INST("fbuge", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
226	INST("fble",  VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
227	INST("fbule", VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
228	INST("fbo",   VALL, FLG_DISP(DISP22)|FLG_RS1(REG_NONE))
229};
230
231static const table_t FBfcc_table = {
232	.tbl_field = 28,
233	.tbl_len   = 4,
234	.tbl_ovp   = NULL,
235	.tbl_fmt   = fmt_branch,
236	.tbl_inp   = FBfcc_table_def
237};
238
239static const inst_t CBccc_table_def[16] = {
240	INST("cbn",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
241	INST("cb123", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
242	INST("cb12",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
243	INST("cb13",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
244	INST("cb1",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
245	INST("cb23",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
246	INST("cb2",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
247	INST("cb3",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
248	INST("cba",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
249	INST("cb0",   V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
250	INST("cb03",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
251	INST("cb02",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
252	INST("cb023", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
253	INST("cb01",  V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
254	INST("cb013", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE)),
255	INST("cb012", V8, FLG_DISP(DISP22)|FLG_RS1(REG_NONE))
256};
257
258static const table_t CBccc_table = {
259	.tbl_field = 28,
260	.tbl_len   = 4,
261	.tbl_ovp   = NULL,
262	.tbl_fmt   = fmt_branch,
263	.tbl_inp   = CBccc_table_def
264};
265
266static const inst_t branch_table_def[8] = {
267	INST("unimp",		VALL,  0),
268	TABLE(BPcc_table,	V9|V9S),
269	TABLE(Bicc_table,	VALL),
270	TABLE(BPr_table,	V9|V9S),
271
272	INST("sethi",		VALL,  0),
273	TABLE(FBPfcc_table,	V9|V9S),
274	TABLE(FBfcc_table,	VALL),
275	TABLE(CBccc_table,	V8)
276};
277
278static const overlay_t branch_ov_table[] = {
279	OVERLAY(0x00, INST("illtrap", V9|V9S, 0)),
280	OVERLAY_END
281};
282
283static const table_t branch_table = {
284	.tbl_field = 24,
285	.tbl_len   = 3,
286	.tbl_ovp   = branch_ov_table,
287	.tbl_fmt   = fmt_sethi,
288	.tbl_inp   = branch_table_def
289};
290
291/* load/stores */
292static const inst_t ls_table_def[64] = {
293	/* 0x00 */
294	INST("ld",		VALL,   0),
295	INST("ldub",		VALL,   0),
296	INST("lduh",		VALL,   0),
297	INST("ldd",		VALL,   0),
298
299	INST("st",		VALL,   FLG_STORE),
300	INST("stb",		VALL,   FLG_STORE),
301	INST("sth",		VALL,   FLG_STORE),
302	INST("std",		VALL,   FLG_STORE),
303
304	/* 0x08 */
305	INST("ldsw",		V9|V9S, 0),
306	INST("ldsb",		VALL,   0),
307	INST("ldsh",		VALL,   0),
308	INST("ldx",		V9|V9S, 0),
309
310	INVALID,
311	INST("ldstub",		VALL,   0),
312	INST("stx",		V9|V9S, FLG_STORE),
313	INST("swap",		VALL,   0),
314
315	/* 0x10 */
316	INST("lda",		VALL,   FLG_ASI),
317	INST("lduba",		VALL,   FLG_ASI),
318	INST("lduha",		VALL,   FLG_ASI),
319	INST("ldda",		VALL,   FLG_ASI),
320
321	INST("sta",		VALL,   FLG_STORE|FLG_ASI),
322	INST("stba",		VALL,   FLG_STORE|FLG_ASI),
323	INST("stha",		VALL,   FLG_STORE|FLG_ASI),
324	INST("stda",		VALL,   FLG_STORE|FLG_ASI),
325
326	/* 0x18 */
327	INST("ldswa",		V9|V9S, FLG_ASI),
328	INST("ldsba",		VALL,   FLG_ASI),
329	INST("ldsha",		VALL,   FLG_ASI),
330	INST("ldxa",		V9|V9S, FLG_ASI),
331
332	INVALID,
333	INST("ldstuba",		VALL,   FLG_ASI),
334	INST("stxa",		V9|V9S, FLG_STORE|FLG_ASI),
335	INST("swapa",		VALL,   FLG_ASI),
336
337	/* 0x20 */
338	INST("ld",		VALL,   FLG_RD(REG_FP)),
339	/* ldx on v9 */
340	INST("ld",		VALL,   FLG_RD(REG_FSR)),
341	INST("ldq",		V9|V9S, FLG_RD(REG_FPQ)),
342	INST("ldd",		VALL,   FLG_RD(REG_FPD)),
343
344	INST("st",		VALL,   FLG_STORE|FLG_RD(REG_FP)),
345	/* stx on v9 */
346	INST("st",		VALL,   FLG_STORE|FLG_RD(REG_FSR)),
347	INST("stq",		VALL,   FLG_STORE|FLG_RD(REG_FPQ)),
348	INST("std",		VALL,   FLG_STORE|FLG_RD(REG_FPD)),
349
350	/* 0x28 */
351	INVALID,
352	INVALID,
353	INVALID,
354	INVALID,
355
356	INVALID,
357	INST("prefetch",		V9|V9S, 0),
358	INVALID,
359	INVALID,
360
361	/* 0x30 */
362	INST("ld",		V8,	FLG_RD(REG_CP)),
363	INST("ld",		V8,	FLG_RD(REG_CSR)),
364	INST("ldqa",		V9|V9S,	FLG_ASI|FLG_RD(REG_FPQ)),
365	INST("ldd",		V8,	FLG_RD(REG_CP)),
366
367	INST("st",		V8,	FLG_STORE|FLG_RD(REG_CP)),
368	INST("st",		V8,	FLG_STORE|FLG_RD(REG_CSR)),
369	INST("std",		V8,	FLG_STORE|FLG_RD(REG_CQ)),
370	INST("std",		V8,	FLG_STORE|FLG_RD(REG_CP)),
371
372	/* 0x38 */
373	INVALID,
374	INVALID,
375	INVALID,
376	INVALID,
377
378	INST("casa",		V9|V9S, 0),
379	INST("prefetcha",	V9|V9S, FLG_STORE|FLG_ASI),
380	INST("casxa",		V9|V9S, 0),
381	INVALID
382};
383
384static const overlay_t ld_ov_table[] = {
385	OVERLAY(0x10, INST("lduwa", V9|V9S, FLG_ASI|FLG_RD(REG_INT))),
386	OVERLAY(0x14, INST("stwa",  V9|V9S,
387		    FLG_STORE|FLG_ASI|FLG_RD(REG_INT))),
388	OVERLAY(0x30, INST("lda",   V9|V9S, FLG_ASI|FLG_RD(REG_FP))),
389	OVERLAY(0x33, INST("ldda",  V9|V9S, FLG_ASI|FLG_RD(REG_FPD))),
390
391	OVERLAY(0x34, INST("sta",   V9|V9S, FLG_STORE|FLG_ASI|FLG_RD(REG_FP))),
392	OVERLAY(0x36, INST("stqa",  V9|V9S,
393		    FLG_STORE|FLG_ASI|FLG_RD(REG_FPQ))),
394	OVERLAY(0x37, INST("stda",  V9|V9S,
395		    FLG_STORE|FLG_ASI|FLG_RD(REG_FPD))),
396
397	OVERLAY_END
398};
399
400static const table_t ls_table = {
401	.tbl_field = 24,
402	.tbl_len   = 6,
403	.tbl_ovp   = ld_ov_table,
404	.tbl_fmt   = fmt_ls,
405	.tbl_inp   = ls_table_def
406};
407
408
409/* ALU operations */
410static const inst_t Tcc_table_def[16] = {
411	INST("tn",   VALL, 0),
412	INST("te",   VALL, 0),
413	INST("tle",  VALL, 0),
414	INST("tl",   VALL, 0),
415
416	INST("tleu", VALL, 0),
417	INST("tcs",  VALL, 0),
418	INST("tneg", VALL, 0),
419	INST("tvs",  VALL, 0),
420
421	INST("ta",   VALL, 0),
422	INST("tne",  VALL, 0),
423	INST("tg",   VALL, 0),
424	INST("tge",  VALL, 0),
425
426	INST("tgu",  VALL, 0),
427	INST("tcc",  VALL, 0),
428	INST("tpos", VALL, 0),
429	INST("tvc",  VALL, 0)
430};
431
432static const table_t Tcc_table = {
433	.tbl_field = 28,
434	.tbl_len   = 4,
435	.tbl_ovp   = NULL,
436	.tbl_fmt   = fmt_trap,
437	.tbl_inp   = Tcc_table_def
438};
439
440static const inst_t rwin_table_def[32] = {
441	/* 0x00 */
442	INST("saved",    V9|V9S, 0),
443	INST("restored", V9|V9S, 0),
444	INST("allclean", V9|V9S, 0),
445	INST("otherw",   V9|V9S, 0),
446
447	INST("normalw",  V9|V9S, 0),
448	INST("invalw",   V9|V9S, 0),
449	INVALID,
450	INVALID,
451
452	/* 0x08 */
453	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
454
455	/* 0x10 */
456	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
457	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
458};
459
460static const table_t rwin_table = {
461	.tbl_field = 29,
462	.tbl_len   = 5,
463	.tbl_ovp   = NULL,
464	.tbl_fmt   = fmt_regwin,
465	.tbl_inp   = rwin_table_def
466};
467
468static const inst_t tr_table_def[32] = {
469	/* 0x00 */
470	INST("done",  V9|V9S, 0),
471	INST("retry", V9|V9S, 0),
472	INVALID,
473	INVALID,
474
475	INVALID,
476	INVALID,
477	INVALID,
478	INVALID,
479
480	/* 0x08 */
481	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
482	INST("jpriv", V9, FLG_DISP(DISP19)),
483
484	/* 0x10 */
485	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
486	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
487};
488
489static const table_t tr_table = {
490	.tbl_field = 29,
491	.tbl_len   = 5,
492	.tbl_ovp   = NULL,
493	.tbl_fmt   = fmt_trap_ret,
494	.tbl_inp   = tr_table_def
495};
496
497static const inst_t movicc_table_def[16] = {
498	INST("movn",   V9|V9S, 0),
499	INST("move",   V9|V9S, 0),
500	INST("movle",  V9|V9S, 0),
501	INST("movl",   V9|V9S, 0),
502
503	INST("movleu", V9|V9S, 0),
504	INST("movcs",  V9|V9S, 0),
505	INST("movneg", V9|V9S, 0),
506	INST("movvs",  V9|V9S, 0),
507
508	INST("mova",   V9|V9S, 0),
509	INST("movne",  V9|V9S, 0),
510	INST("movg",   V9|V9S, 0),
511	INST("movge",  V9|V9S, 0),
512
513	INST("movgu",  V9|V9S, 0),
514	INST("movcc",  V9|V9S, 0),
515	INST("movpos", V9|V9S, 0),
516	INST("movvc",  V9|V9S, 0)
517};
518
519static const inst_t movfcc_table_def[16] = {
520	INST("movn",   V9|V9S, 0),
521	INST("movne",  V9|V9S, 0),
522	INST("movlg",  V9|V9S, 0),
523	INST("movul",  V9|V9S, 0),
524
525	INST("movl",   V9|V9S, 0),
526	INST("movug",  V9|V9S, 0),
527	INST("movg",   V9|V9S, 0),
528	INST("movu",   V9|V9S, 0),
529
530	INST("mova",   V9|V9S, 0),
531	INST("move",   V9|V9S, 0),
532	INST("movue",  V9|V9S, 0),
533	INST("movge",  V9|V9S, 0),
534
535	INST("movuge", V9|V9S, 0),
536	INST("movle",  V9|V9S, 0),
537	INST("movule", V9|V9S, 0),
538	INST("movo",   V9|V9S, 0)
539};
540
541static const table_t movfcc_table = {
542	.tbl_field = 17,
543	.tbl_len   = 4,
544	.tbl_ovp   = NULL,
545	.tbl_fmt   = fmt_movcc,
546	.tbl_inp   = movfcc_table_def
547};
548
549static const table_t movicc_table = {
550	.tbl_field = 17,
551	.tbl_len   = 4,
552	.tbl_ovp   = NULL,
553	.tbl_fmt   = fmt_movcc,
554	.tbl_inp   = movicc_table_def
555};
556
557static const inst_t movcc_table_def[2] = {
558	TABLE(movfcc_table, V9|V9S),
559	TABLE(movicc_table, V9|V9S)
560};
561
562static const table_t movcc_table = {
563	.tbl_field = 18,
564	.tbl_len   = 1,
565	.tbl_ovp   = NULL,
566	.tbl_fmt   = NULL,
567	.tbl_inp   = movcc_table_def
568};
569
570static const inst_t movr_table_def[8] = {
571	INVALID,
572	/* aka movrz */
573	INST("movre",   V9|V9S, 0),
574	INST("movrlez", V9|V9S, 0),
575	INST("movrlz",  V9|V9S, 0),
576
577	INVALID,
578	/* aka movrnz */
579	INST("movrne",  V9|V9S, 0),
580	INST("movrgz",  V9|V9S, 0),
581	INST("movrgez", V9|V9S, 0)
582};
583
584static const table_t movr_table = {
585	.tbl_field = 12,
586	.tbl_len   = 3,
587	.tbl_ovp   = NULL,
588	.tbl_fmt   = fmt_movr,
589	.tbl_inp   = movr_table_def
590};
591
592static const inst_t FPop1_table_def[512] = {
593	/* 0x000 */
594	INVALID,
595	INST("fmovs", VALL,
596		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
597	INST("fmovd", V9|V9S,
598		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
599	INST("fmovq", V9|V9S,
600		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
601
602	INVALID,
603	INST("fnegs", VALL,
604		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
605	INST("fnegd", V9|V9S,
606		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
607	INST("fnegq", V9|V9S,
608		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
609
610	/* 0x008 */
611	INVALID,
612	INST("fabss", VALL,
613		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
614	INST("fabsd", V9|V9S,
615		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
616	INST("fabsq", V9|V9S,
617		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
618
619	INVALID, INVALID, INVALID, INVALID,
620
621	/* 0x010 */
622	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
623	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
624
625	/* 0x020 */
626	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
627
628	/* 0x028 */
629	INVALID,
630	INST("fsqrts", VALL,
631		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
632	INST("fsqrtd", VALL,
633		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
634	INST("fsqrtq", VALL,
635		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
636
637	INVALID, INVALID, INVALID, INVALID,
638
639	/* 0x30 */
640	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
641	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
642
643	/* 0x40 */
644	INVALID,
645	INST("fadds", VALL,
646		FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
647	INST("faddd", VALL,
648		FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
649	INST("faddq", VALL,
650		FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
651
652	INVALID,
653	INST("fsubs", VALL,
654		FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
655	INST("fsubd", VALL,
656		FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
657	INST("fsubq", VALL,
658		FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
659
660	/* 0x048 */
661	INVALID,
662	INST("fmuls", VALL,
663		FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
664	INST("fmuld", VALL,
665		FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
666	INST("fmulq", VALL,
667		FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
668
669	INVALID,
670	INST("fdivs", VALL,
671		FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
672	INST("fdivd", VALL,
673		FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
674	INST("fdivq", VALL,
675		FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
676
677	/* 0x050 */
678	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
679	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
680
681	/* 0x060 */
682	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
683
684	/* 0x068 */
685	INVALID,
686	INST("fsmuld", VALL,
687		FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)),
688	INVALID,
689	INVALID,
690
691	INVALID,
692	INVALID,
693	INST("fdmulq", VALL,
694		FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)),
695	INVALID,
696
697	/* 0x070 */
698	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
699	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
700
701	/* 0x080 */
702	INVALID,
703	INST("fstox", V9|V9S,
704		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)),
705	INST("fdtox", V9|V9S,
706		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
707	INST("fqtox", V9|V9S,
708		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPD)),
709
710	INST("fxtos", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|
711		FLG_P3(REG_FP)),
712	INVALID,
713	INVALID,
714	INVALID,
715
716	/* 0x088 */
717	INST("fxtod", V9|V9S,
718		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
719	INVALID,
720	INVALID,
721	INVALID,
722
723	INST("fxtoq", V9|V9S,
724		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)),
725	INVALID,
726	INVALID,
727	INVALID,
728
729	/* 0x090 */
730	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
731	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
732
733	/* 0x0a0 */
734	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
735	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
736
737	/* 0x0b0 */
738	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
739	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
740
741	/* 0x0c0 */
742	INVALID, INVALID, INVALID, INVALID,
743
744	INST("fitos", VALL,
745		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
746	INVALID,
747	INST("fdtos", VALL,
748		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FP)),
749	INST("fqtos", VALL,
750		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FP)),
751
752	/* 0x0c8 */
753	INST("fitod", VALL,
754		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)),
755	INST("fstod", VALL,
756		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPD)),
757	INVALID,
758	INST("fqtod", VALL,
759		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPD)),
760
761	INST("fitoq", VALL,
762		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPQ)),
763	INST("fstoq", VALL,
764		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FPQ)),
765	INST("fdtoq", VALL,
766		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPQ)),
767	INVALID,
768
769	/* 0x0d0 */
770	INVALID,
771	INST("fstoi", VALL,
772	    FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
773	INST("fdtoi", VALL,
774	    FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FP)),
775	INST("fqtoi", VALL,
776	    FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FP)),
777	INVALID, INVALID, INVALID, INVALID,
778
779	/* 0x0d8 */
780	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
781
782	/* 0x0e0 */
783	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
784	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
785
786	/* 0x0f0 */
787	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
788	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
789
790	/* 0x100 */
791	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
792	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
793
794	/* 0x110 */
795	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
796	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
797
798	/* 0x120 */
799	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
800	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
801
802	/* 0x130 */
803	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
804	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
805
806	/* 0x140 */
807	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
808	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
809
810	/* 0x150 */
811	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
812	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
813
814	/* 0x160 */
815	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
816	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
817
818	/* 0x170 */
819	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
820	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
821
822	/* 0x180 */
823	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
824	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
825
826	/* 0x190 */
827	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
828	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
829
830	/* 0x1a0 */
831	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
832	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
833
834	/* 0x1b0 */
835	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
836	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
837
838	/* 0x1c0 */
839	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
840	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
841
842	/* 0x1d0 */
843	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
844	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
845
846	/* 0x1e0 */
847	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
848	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
849
850	/* 0x1f0 */
851	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
852	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
853};
854
855static const table_t FPop1_table = {
856	.tbl_field = 13,
857	.tbl_len   = 9,
858	.tbl_ovp   = NULL,
859	.tbl_fmt   = fmt_fpop1,
860	.tbl_inp   = FPop1_table_def
861};
862
863static const inst_t FPop2_table_def[512] = {
864	/* 0x000 */
865	INVALID,
866	INST("fmovs", V9|V9S,
867		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
868	INST("fmovd", V9|V9S,
869		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
870	INST("fmovq", V9|V9S,
871		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
872
873	INVALID, INVALID, INVALID, INVALID,
874
875	/* 0x008 */
876	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
877
878	/* 0x010 */
879	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
880	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
881
882	/* 0x020 */
883	INVALID, INVALID, INVALID, INVALID,
884
885	INST("fmovrsz", V9|V9S,
886		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)),
887	INST("fmovrdz", V9|V9S,
888		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
889	INST("fmovrqz", V9|V9S,
890		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
891	INVALID,
892
893	/* 0x028 */
894	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
895
896	/* 0x030 */
897	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
898	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
899
900	/* 0x040 */
901	INVALID,
902	INST("fmovs", V9|V9S,
903		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
904	INST("fmovd", V9|V9S,
905		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
906	INST("fmovq", V9|V9S,
907		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
908
909	INST("fmovrslez", V9|V9S,
910		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)),
911	INST("fmovrdlez", V9|V9S,
912		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
913	INST("fmovrqlez", V9|V9S,
914		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
915	INVALID,
916
917	/* 0x048 */
918	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
919
920	/* 0x050 */
921	INVALID,
922	INST("fcmps", VALL, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_NONE)
923	    |FLG_NOIMM),
924	INST("fcmpd", VALL, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_NONE)
925	    |FLG_NOIMM),
926	INST("fcmpq", VALL, FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_P3(REG_NONE)
927	    |FLG_NOIMM),
928
929	INVALID,
930	INST("fcmpes", VALL, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_NONE)
931	    |FLG_NOIMM),
932	INST("fcmped", VALL, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_NONE)
933	    |FLG_NOIMM),
934	INST("fcmpeq", VALL, FLG_P1(REG_FPQ)|FLG_P2(REG_FPQ)|FLG_P3(REG_NONE)
935	    |FLG_NOIMM),
936
937	/* 0x058 */
938	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
939
940	/* 0x060 */
941	INVALID, INVALID, INVALID, INVALID,
942
943	INVALID,
944	INST("fmovrslz", V9|V9S,
945		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)),
946	INST("fmovrdlz", V9|V9S,
947		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
948	INST("fmovrqlz", V9|V9S,
949		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
950
951	/* 0x068 */
952	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
953
954	/* 0x070 */
955	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
956	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
957
958	/* 0x080 */
959	INVALID,
960	INST("fmovs", V9|V9S,
961		FLG_P1(REG_NONE)|FLG_P2(REG_FP)|FLG_NOIMM|FLG_P3(REG_FP)),
962	INST("fmovd", V9|V9S,
963		FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|FLG_NOIMM|FLG_P3(REG_FPD)),
964	INST("fmovq", V9|V9S,
965		FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|FLG_NOIMM|FLG_P3(REG_FPQ)),
966
967	INVALID, INVALID, INVALID, INVALID,
968
969	/* 0x088 */
970	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
971
972	/* 0x090 */
973	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
974	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
975
976	/* 0x0a0 */
977	INVALID, INVALID, INVALID, INVALID,
978
979	INVALID,
980	INST("fmovrsnz", V9|V9S,
981		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FP)|FLG_P3(REG_FP)),
982	INST("fmovrdnz", V9|V9S,
983		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
984	INST("fmovrqnz", V9|V9S,
985		FLG_P1(REG_INT)|FLG_NOIMM|FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
986
987	/* 0x0a8 */
988	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
989
990	/* 0x0b0 */
991	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
992	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
993
994	/* 0x0c0 */
995	INVALID,
996	INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)|
997		FLG_NOIMM|FLG_P3(REG_FP)),
998	INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|
999		FLG_NOIMM|FLG_P3(REG_FPD)),
1000	INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|
1001		FLG_NOIMM|FLG_P3(REG_FPQ)),
1002
1003	INVALID,
1004	INST("fmovrsgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1005		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1006	INST("fmovrdgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1007		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1008	INST("fmovrqgz", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1009		FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
1010
1011	/* 0x0c8 */
1012	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1013
1014	/* 0x0d0 */
1015	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1016	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1017
1018	/* 0x0e0 */
1019	INVALID, INVALID, INVALID, INVALID,
1020
1021	INVALID,
1022	INST("fmovrsgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1023		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1024	INST("fmovrdgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1025		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1026	INST("fmovrqgez", V9|V9S, FLG_P1(REG_INT)|FLG_NOIMM|
1027		FLG_P2(REG_FPQ)|FLG_P3(REG_FPQ)),
1028
1029	/* 0x0e8 */
1030	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1031
1032	/* 0x0f0 */
1033	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1034	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1035
1036	/* 0x100 */
1037	INVALID,
1038	INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)|
1039		FLG_NOIMM|FLG_P3(REG_FP)),
1040	INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|
1041		FLG_NOIMM|FLG_P3(REG_FPD)),
1042	INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|
1043		FLG_NOIMM|FLG_P3(REG_FPQ)),
1044
1045	INVALID, INVALID, INVALID, INVALID,
1046
1047	/* 0x108 */
1048	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1049
1050	/* 0x110 */
1051	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1052	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1053
1054	/* 0x120 */
1055	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1056	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1057
1058	/* 0x130 */
1059	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1060	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1061
1062	/* 0x140 */
1063	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1064	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1065
1066	/* 0x150 */
1067	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1068	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1069
1070	/* 0x160 */
1071	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1072	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1073
1074	/* 0x170 */
1075	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1076	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1077
1078	/* 0x180 */
1079	INVALID,
1080	INST("fmovs", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)|
1081		FLG_NOIMM|FLG_P3(REG_FP)),
1082	INST("fmovd", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|
1083		FLG_NOIMM|FLG_P3(REG_FPD)),
1084	INST("fmovq", V9|V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPQ)|
1085		FLG_NOIMM|FLG_P3(REG_FPQ)),
1086
1087	INVALID, INVALID, INVALID, INVALID,
1088
1089	/* 0x188 */
1090	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1091
1092	/* 0x190 */
1093	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1094	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1095
1096	/* 0x1a0 */
1097	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1098	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1099
1100	/* 0x1b0 */
1101	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1102	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1103
1104	/* 0x1c0 */
1105	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1106	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1107
1108	/* 0x1d0 */
1109	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1110	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1111
1112	/* 0x1e0 */
1113	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1114	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1115
1116	/* 0x1f0 */
1117	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1118	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
1119};
1120
1121static const table_t FPop2_table = {
1122	.tbl_field = 13,
1123	.tbl_len   = 9,
1124	.tbl_ovp   = NULL,
1125	.tbl_fmt   = fmt_fpop2,
1126	.tbl_inp   = FPop2_table_def
1127};
1128
1129static const inst_t vis_table_def[512] = {
1130	/* 0x000 */
1131	INST("edge8cc", V9S, FLG_NOIMM),
1132	INST("edge8n", V9S, FLG_NOIMM),
1133	INST("edge8lcc", V9S, FLG_NOIMM),
1134	INST("edge8ln", V9S, FLG_NOIMM),
1135
1136	INST("edge16cc", V9S, FLG_NOIMM),
1137	INST("edge16n", V9S, FLG_NOIMM),
1138	INST("edge16lcc", V9S, FLG_NOIMM),
1139	INST("edge16ln", V9S, FLG_NOIMM),
1140
1141	/* 0x008 */
1142	INST("edge32cc", V9S, FLG_NOIMM),
1143	INST("edge32n", V9S, FLG_NOIMM),
1144	INST("edge32lcc", V9S, FLG_NOIMM),
1145	INST("edge32ln", V9S, FLG_NOIMM),
1146
1147	INVALID, INVALID, INVALID, INVALID,
1148
1149	/* 0x010 */
1150	INST("array8", V9S, FLG_NOIMM),
1151	INST("addxc", V9, 0),
1152	INST("array16", V9S, FLG_NOIMM),
1153	INST("addxccc", V9, 0),
1154
1155	INST("array32", V9S, FLG_NOIMM),
1156	INST("random", V9, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)|
1157		FLG_RD(REG_FPD)|FLG_NOIMM),
1158	INST("umulxhi", V9, FLG_P1(REG_INT)|FLG_NOIMM|
1159		FLG_P2(REG_INT)|FLG_P3(REG_INT)),
1160	INST("lzd", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1161		FLG_P2(REG_INT)|FLG_RD(REG_INT)),
1162
1163	/* 0x018 */
1164	INST("alignaddr", V9S, FLG_NOIMM),
1165	INST("bmask", V9S, FLG_P1(REG_INT)|FLG_P2(REG_INT)|FLG_RD(REG_INT)),
1166	INST("alignaddrl", V9S, FLG_NOIMM),
1167	INST("cmask8", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1168		FLG_P2(REG_INT)|FLG_P3(REG_NONE)),
1169	INVALID,
1170	INST("cmask16", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1171		FLG_P2(REG_INT)|FLG_P3(REG_NONE)),
1172	INVALID,
1173	INST("cmask32", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1174		FLG_P2(REG_INT)|FLG_P3(REG_NONE)),
1175
1176	/* 0x020 */
1177	INST("fcmple16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1178		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1179	INST("fsll16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1180		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1181	INST("fcmpne16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1182		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1183	INST("fsrl16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1184		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1185
1186	INST("fcmple32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1187		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1188	INST("fsll32", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1189		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1190	INST("fcmpne32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1191		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1192	INST("fsrl32", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1193		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1194
1195	/* 0x028 */
1196	INST("fcmpgt16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1197		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1198	INST("fslas16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1199		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1200	INST("fcmpeq16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1201		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1202	INST("fsra16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1203		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1204
1205	INST("fcmpgt32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1206		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1207	INST("fslas32", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1208		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1209	INST("fcmpeq32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1210		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1211	INST("fsra32", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1212		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1213
1214	/* 0x030 */
1215	INVALID,
1216	INST("fmul8x16", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1217		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1218	INVALID,
1219	INST("fmul8x16au", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1220		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1221
1222	INVALID,
1223	INST("fmul8x16al", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1224		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1225	INST("fmul8sux16", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1226		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1227	INST("fmul8ulx16", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1228		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1229
1230	/* 0x038 */
1231	INST("fmuld8sux16", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1232		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1233	INST("fmuld8ulx16", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1234		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1235	INST("fpack32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1236		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1237	INST("fpack16", V9S, FLG_P1(REG_NONE)|FLG_NOIMM|
1238		FLG_P2(REG_FPD)|FLG_P3(REG_FP)),
1239
1240	INVALID,
1241	INST("fpackfix", V9S, FLG_P1(REG_NONE)|FLG_NOIMM|
1242		FLG_P2(REG_FPD)|FLG_P3(REG_FP)),
1243	INST("pdist", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1244		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1245	INST("pdistn", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1246		FLG_P2(REG_FPD)|FLG_P3(REG_INT)),
1247
1248	/* 0x040 */
1249	INST("fmean16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1250		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1251	INVALID,
1252	INST("fpadd64", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1253		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1254	INVALID,
1255	INST("fchksm16", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1256		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1257	INVALID,
1258	INST("fpsub64", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1259		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1260	INVALID,
1261
1262	/* 0x048 */
1263	INST("faligndata", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1264		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1265	INVALID,
1266	INVALID,
1267	INST("fpmerge", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1268		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1269
1270	INST("bshuffle", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1271		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1272	INST("fexpand", V9S, FLG_P1(REG_NONE)|FLG_NOIMM|
1273		FLG_P2(REG_FP)|FLG_P3(REG_FPD)),
1274	INVALID,
1275	INVALID,
1276
1277	/* 0x050 */
1278	INST("fpadd16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1279		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1280	INST("fpadd16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1281		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1282	INST("fpadd32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1283		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1284	INST("fpadd32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1285		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1286
1287	INST("fpsub16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1288		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1289	INST("fpsub16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1290		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1291	INST("fpsub32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1292		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1293	INST("fpsub32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1294		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1295
1296	/* 0x058 */
1297	INST("fpadds16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1298		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1299	INST("fpadds16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1300		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1301	INST("fpadds32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1302		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1303	INST("fpadds32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1304		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1305	INST("fpsubs16", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1306		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1307	INST("fpsubs16s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1308		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1309	INST("fpsubs32", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1310		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1311	INST("fpsubs32s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1312		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1313
1314	/* 0x060 */
1315	INST("fzero", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)|
1316		FLG_P3(REG_FPD)),
1317	INST("fzeros", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)|
1318		FLG_P3(REG_FP)),
1319	INST("fnor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1320		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1321	INST("fnors", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1322		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1323
1324	INST("fandnot2", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1325		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1326	INST("fandnot2s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1327		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1328	INST("fnot2", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|
1329		FLG_P3(REG_FPD)),
1330	INST("fnot2s", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)|
1331		FLG_P3(REG_FP)),
1332
1333	/* 0x068 */
1334	INST("fandnot1", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1335		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1336	INST("fandnot1s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1337		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1338	INST("fnot1", V9S, FLG_P1(REG_FPD)|FLG_P2(REG_NONE)|
1339		FLG_P3(REG_FPD)),
1340	INST("fnot1s", V9S, FLG_P1(REG_FP)|FLG_P2(REG_NONE)|
1341		FLG_P3(REG_FP)),
1342
1343	INST("fxor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1344		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1345	INST("fxors", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1346		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1347	INST("fnand", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1348		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1349	INST("fnands", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1350		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1351
1352	/* 0x070 */
1353	INST("fand", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1354		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1355	INST("fands", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1356		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1357	INST("fxnor", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1358		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1359	INST("fxnors", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1360		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1361
1362	INST("fsrc1", V9S, FLG_P1(REG_FPD)|FLG_P2(REG_NONE)|
1363		FLG_P3(REG_FPD)),
1364	INST("fsrc1s", V9S, FLG_P1(REG_FP)|FLG_P2(REG_NONE)|
1365		FLG_P3(REG_FP)),
1366	INST("fornot2", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1367		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1368	INST("fornot2s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1369		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1370
1371	/* 0x078 */
1372	INST("fsrc2", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FPD)|
1373		FLG_P3(REG_FPD)),
1374	INST("fsrc2s", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_FP)|
1375		FLG_P3(REG_FP)),
1376	INST("fornot1", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1377		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1378	INST("fornot1s", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1379		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1380
1381	INST("for", V9S, FLG_P1(REG_FPD)|FLG_NOIMM|
1382		FLG_P2(REG_FPD)|FLG_P3(REG_FPD)),
1383	INST("fors", V9S, FLG_P1(REG_FP)|FLG_NOIMM|
1384		FLG_P2(REG_FP)|FLG_P3(REG_FP)),
1385	INST("fone", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)|
1386		FLG_P3(REG_FPD)),
1387	INST("fones", V9S, FLG_P1(REG_NONE)|FLG_P2(REG_NONE)|
1388		FLG_P3(REG_FP)),
1389
1390	/* 0x080 */
1391	INST("shutdown", V9S, 0),
1392	INST("siam", V9S, 0),
1393	INVALID,
1394	INVALID,
1395
1396	INVALID, INVALID, INVALID, INVALID,
1397
1398	/* 0x088 */
1399	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1400
1401	/* 0x090 */
1402	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1403	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1404
1405	/* 0x0a0 */
1406	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1407	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1408
1409	/* 0x0b0 */
1410	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1411	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1412
1413	/* 0x0c0 */
1414	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1415	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1416
1417	/* 0x0d0 */
1418	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1419	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1420
1421	/* 0x0e0 */
1422	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1423	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1424
1425	/* 0x0f0 */
1426	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1427	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1428
1429	/* 0x100 */
1430	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1431	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1432
1433	/* 0x110 */
1434	INST("movdtox", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1435		FLG_P2(REG_FPD)|FLG_RD(REG_INT)),
1436	INST("movstouw", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1437		FLG_P2(REG_FP)|FLG_RD(REG_INT)),
1438	INVALID,
1439	INST("movstosw", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1440		FLG_P2(REG_FP)|FLG_RD(REG_INT)),
1441	INVALID,
1442	INST("xmulx", V9, FLG_P1(REG_INT)|FLG_NOIMM|
1443		FLG_P2(REG_INT)|FLG_P3(REG_INT)),
1444	INST("xmulxhi", V9, FLG_P1(REG_INT)|FLG_NOIMM|
1445		FLG_P2(REG_INT)|FLG_P3(REG_INT)),
1446	INVALID,
1447	INST("movxtod", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1448		FLG_P2(REG_INT)|FLG_RD(REG_FPD)),
1449	INST("movwtos", V9, FLG_P1(REG_NONE)|FLG_NOIMM|
1450		FLG_P2(REG_INT)|FLG_RD(REG_FP)),
1451	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1452
1453	/* 0x120 */
1454	INST("fucmple8", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1455		FLG_P2(REG_FPD)|FLG_RD(REG_INT)),
1456	INVALID,
1457	INST("fucmpne8", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1458		FLG_P2(REG_FPD)|FLG_RD(REG_INT)),
1459	INVALID, INVALID, INVALID, INVALID, INVALID,
1460	INST("fucmpgt8", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1461		FLG_P2(REG_FPD)|FLG_RD(REG_INT)),
1462	INVALID,
1463	INST("fucmpeq8", V9, FLG_P1(REG_FPD)|FLG_NOIMM|
1464		FLG_P2(REG_FPD)|FLG_RD(REG_INT)),
1465	INVALID, INVALID, INVALID, INVALID, INVALID,
1466
1467	/* 0x130 */
1468	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1469	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1470
1471	/* 0x140 */
1472	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1473	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1474
1475	/* 0x150 */
1476	INVALID,
1477	INST("flcmps", V9, FLG_P1(REG_FP)|FLG_P2(REG_FP)|FLG_P3(REG_FCC)
1478		|FLG_NOIMM),
1479	INST("flcmpd", V9, FLG_P1(REG_FPD)|FLG_P2(REG_FPD)|FLG_P3(REG_FCC)
1480		|FLG_NOIMM),
1481	INVALID, INVALID, INVALID, INVALID, INVALID,
1482	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1483
1484	/* 0x160 */
1485	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1486	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1487
1488	/* 0x170 */
1489	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1490	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1491
1492	/* 0x180 */
1493	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1494	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1495
1496	/* 0x190 */
1497	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1498	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1499
1500	/* 0x1a0 */
1501	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1502	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1503
1504	/* 0x1b0 */
1505	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1506	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1507
1508	/* 0x1c0 */
1509	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1510	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1511
1512	/* 0x1d0 */
1513	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1514	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1515
1516	/* 0x1e0 */
1517	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1518	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1519
1520	/* 0x1f0 */
1521	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID,
1522	INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID, INVALID
1523};
1524
1525static const table_t vis_table = {
1526	.tbl_field = 13,
1527	.tbl_len   = 9,
1528	.tbl_ovp   = NULL,
1529	.tbl_fmt   = fmt_vis,
1530	.tbl_inp   = vis_table_def
1531};
1532
1533static const inst_t fused_table_def[16] = {
1534	/* 0x0 */
1535	INVALID,
1536	INST("fmadds", V9, FLG_P1(REG_FP)),
1537	INST("fmaddd", V9, FLG_P1(REG_FPD)),
1538	INVALID,
1539
1540	/* 0x4 */
1541	INVALID,
1542	INST("fmsubs", V9, FLG_P1(REG_FP)),
1543	INST("fmsubd", V9, FLG_P1(REG_FPD)),
1544	INVALID,
1545
1546	/* 0x8 */
1547	INVALID,
1548	INST("fnmsubs", V9, FLG_P1(REG_FP)),
1549	INST("fnmsubd", V9, FLG_P1(REG_FPD)),
1550	INVALID,
1551
1552	/* 0xc */
1553	INVALID,
1554	INST("fnmadds", V9, FLG_P1(REG_FP)),
1555	INST("fnmaddd", V9, FLG_P1(REG_FPD)),
1556	INVALID
1557};
1558
1559static const table_t fused_table = {
1560	.tbl_field = 8,
1561	.tbl_len   = 4,
1562	.tbl_ovp   = NULL,
1563	.tbl_fmt   = fmt_fused,
1564	.tbl_inp   = fused_table_def
1565};
1566
1567static const inst_t alu_table_def[64] = {
1568	/* 0x00 */
1569	INST("add",		VALL,	0),
1570	INST("and",		VALL,	0),
1571	INST("or",		VALL,	0),
1572	INST("xor",		VALL,	0),
1573
1574	INST("sub",		VALL,	0),
1575	INST("andn",		VALL,	0),
1576	INST("orn",		VALL,	0),
1577	INST("xnor",		VALL,	0),
1578
1579	/* 0x08 */
1580	INST("addx",		VALL,	0),
1581	INST("mulx",		V9|V9S,	0),
1582	INST("umul",		VALL,	0),
1583	INST("smul",		VALL,	0),
1584
1585	INST("subx",		VALL,	0),
1586	INST("udivx",		V9|V9S,	0),
1587	INST("udiv",		VALL,	0),
1588	INST("sdiv",		VALL,	0),
1589
1590	/* 0x10 */
1591	INST("addcc",		VALL,	0),
1592	INST("andcc",		VALL,	0),
1593	INST("orcc",		VALL,	0),
1594	INST("xorcc",		VALL,	0),
1595
1596	INST("subcc",		VALL,	0),
1597	INST("andncc",		VALL,	0),
1598	INST("orncc",		VALL,	0),
1599	INST("xnorcc",		VALL,	0),
1600
1601	/* 0x18 */
1602	INST("addxcc",		VALL,	0),
1603	INVALID,
1604	INST("umulcc",		VALL,	0),
1605	INST("smulcc",		VALL,	0),
1606
1607	INST("subxcc",		VALL,	0),
1608	INVALID,
1609	INST("udivcc",		VALL,	0),
1610	INST("sdivcc",		VALL,	0),
1611
1612	/* 0x20 */
1613	INST("taddcc",		VALL,	0),
1614	INST("tsubcc",		VALL,	0),
1615	INST("taddcctv",	VALL,	0),
1616	INST("tsubcctv",	VALL,	0),
1617
1618	INST("mulscc",		VALL,	0),
1619	INST("sll",		VALL,	0),
1620	INST("srl",		VALL,	0),
1621	INST("sra",		VALL,	0),
1622
1623	/* 0x28 */
1624	INST("rd",		VALL,	0),
1625	INST("rd",		V8,	0),
1626	INST("rd",		V8,	0),
1627	INST("rd",		V8,	0),
1628
1629	TABLE(movcc_table,	V9|V9S),
1630	INST("sdivx",		V9|V9S,	0),
1631	INST("popc",		V9|V9S,
1632		FLG_P1(REG_NONE)|FLG_P2(REG_INT)|FLG_P3(REG_INT)),
1633	TABLE(movr_table,	V9|V9S),
1634
1635	/* 0x30 */
1636	INST("wr",		VALL,	0),
1637	INST("wr",		V8,	0),
1638	INST("wr",		V8,	0),
1639	INST("wr",		V8,	0),
1640
1641	TABLE(FPop1_table,	VALL),
1642	TABLE(FPop2_table,	VALL),
1643	INST("cpop1",		V8,	0),
1644	INST("cpop2",		V8,	0), /* impdep2 */
1645
1646	/* 0x38 */
1647	INST("jmpl",		VALL,	0),
1648	INST("rett",		VALL,	0),
1649	TABLE(Tcc_table,	VALL),
1650	INST("flush",		VALL,	0),
1651
1652	INST("save",		VALL,	0),
1653	INST("restore",		VALL,	0),
1654	TABLE(tr_table,		V9|V9S),
1655	INVALID
1656};
1657
1658
1659static const overlay_t alu_ov_table[] = {
1660	OVERLAY(0x08, INST("addc",		V9|V9S, 0)),
1661	OVERLAY(0x0c, INST("subc",		V9|V9S, 0)),
1662	OVERLAY(0x18, INST("addccc",		V9|V9S, 0)),
1663	OVERLAY(0x1c, INST("subccc",		V9|V9S, 0)),
1664
1665	OVERLAY(0x29, INST("rdhpr",		V9|V9S, 0)),
1666	OVERLAY(0x2a, INST("rdpr",		V9|V9S, 0)),
1667	OVERLAY(0x2b, INST("flushw",		V9|V9S, 0)),
1668	OVERLAY(0x31, TABLE(rwin_table,		V9|V9S)),
1669
1670	OVERLAY(0x32, INST("wrpr",		V9|V9S, 0)),
1671	OVERLAY(0x33, INST("wrhpr",		V9|V9S, 0)),
1672	OVERLAY(0x36, TABLE(vis_table,		V9S)),
1673	OVERLAY(0x37, TABLE(fused_table,	VALL)),
1674	OVERLAY(0x39, INST("return",		VALL, 0)),
1675
1676	OVERLAY_END
1677};
1678
1679static const table_t alu_table = {
1680	.tbl_field = 24,
1681	.tbl_len   = 6,
1682	.tbl_ovp   = alu_ov_table,
1683	.tbl_fmt   = fmt_alu,
1684	.tbl_inp   = alu_table_def
1685};
1686
1687static const inst_t initial_table_def[4] = {
1688	TABLE(branch_table,	VALL),
1689	INST("call",		VALL, 0),
1690	TABLE(alu_table,	VALL),
1691	TABLE(ls_table,		VALL)
1692};
1693
1694/* NOTE: this must not be made static */
1695const table_t initial_table = {
1696	.tbl_field = 31,
1697	.tbl_len   = 2,
1698	.tbl_ovp   = NULL,
1699	.tbl_fmt   = fmt_call,
1700	.tbl_inp   = initial_table_def
1701};
1702