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 */
91 static 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
114 static 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
122 static 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
149 static 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
157 static 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
171 static 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
179 static 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
201 static 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
209 static 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
231 static 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
239 static 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
258 static 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
266 static 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
278 static const overlay_t branch_ov_table[] = {
279 OVERLAY(0x00, INST("illtrap", V9|V9S, 0)),
280 OVERLAY_END
281 };
282
283 static 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 */
292 static 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
384 static 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
400 static 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 */
410 static 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
432 static 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
440 static 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
460 static 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
468 static 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
489 static 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
497 static 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
519 static 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
541 static 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
549 static 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
557 static const inst_t movcc_table_def[2] = {
558 TABLE(movfcc_table, V9|V9S),
559 TABLE(movicc_table, V9|V9S)
560 };
561
562 static 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
570 static 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
584 static 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
592 static 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
855 static 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
863 static 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
1121 static 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
1129 static 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
1525 static 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
1533 static 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
1559 static 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
1567 static 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
1659 static 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
1679 static 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
1687 static 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 */
1695 const 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 };