* cgen-asm.in (insert_1): Replace calls to bfd_getb8/putb8.
[deliverable/binutils-gdb.git] / opcodes / fr30-opc.c
1 /* Generic opcode table support for targets using CGEN. -*- C -*-
2 CGEN: Cpu tools GENerator
3
4 THIS FILE IS USED TO GENERATE fr30-opc.c.
5
6 Copyright (C) 1998 Free Software Foundation, Inc.
7
8 This file is part of the GNU Binutils and GDB, the GNU debugger.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2, or (at your option)
13 any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software Foundation, Inc.,
22 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
23
24 #include "sysdep.h"
25 #include <stdio.h>
26 #include "ansidecl.h"
27 #include "libiberty.h"
28 #include "bfd.h"
29 #include "symcat.h"
30 #include "fr30-opc.h"
31 #include "opintl.h"
32
33 /* The hash functions are recorded here to help keep assembler code out of
34 the disassembler and vice versa. */
35
36 static int asm_hash_insn_p PARAMS ((const CGEN_INSN *));
37 static unsigned int asm_hash_insn PARAMS ((const char *));
38 static int dis_hash_insn_p PARAMS ((const CGEN_INSN *));
39 static unsigned int dis_hash_insn PARAMS ((const char *, CGEN_INSN_INT));
40
41 /* Look up instruction INSN_VALUE and extract its fields.
42 INSN, if non-null, is the insn table entry.
43 Otherwise INSN_VALUE is examined to compute it.
44 LENGTH is the bit length of INSN_VALUE if known, otherwise 0.
45 0 is only valid if `insn == NULL && ! CGEN_INT_INSN_P'.
46 If INSN != NULL, LENGTH must be valid.
47 ALIAS_P is non-zero if alias insns are to be included in the search.
48
49 The result is a pointer to the insn table entry, or NULL if the instruction
50 wasn't recognized. */
51
52 const CGEN_INSN *
53 fr30_cgen_lookup_insn (od, insn, insn_value, length, fields, alias_p)
54 CGEN_OPCODE_DESC od;
55 const CGEN_INSN *insn;
56 CGEN_INSN_BYTES insn_value;
57 int length;
58 CGEN_FIELDS *fields;
59 int alias_p;
60 {
61 unsigned char buf[CGEN_MAX_INSN_SIZE];
62 unsigned char *bufp;
63 CGEN_INSN_INT base_insn;
64 #if CGEN_INT_INSN_P
65 CGEN_EXTRACT_INFO *info = NULL;
66 #else
67 CGEN_EXTRACT_INFO ex_info;
68 CGEN_EXTRACT_INFO *info = &ex_info;
69 #endif
70
71 #if CGEN_INT_INSN_P
72 cgen_put_insn_value (od, buf, length, insn_value);
73 bufp = buf;
74 base_insn = insn_value; /*???*/
75 #else
76 ex_info.dis_info = NULL;
77 ex_info.insn_bytes = insn_value;
78 ex_info.valid = -1;
79 base_insn = cgen_get_insn_value (od, buf, length);
80 bufp = insn_value;
81 #endif
82
83 if (!insn)
84 {
85 const CGEN_INSN_LIST *insn_list;
86
87 /* The instructions are stored in hash lists.
88 Pick the first one and keep trying until we find the right one. */
89
90 insn_list = CGEN_DIS_LOOKUP_INSN (od, bufp, base_insn);
91 while (insn_list != NULL)
92 {
93 insn = insn_list->insn;
94
95 if (alias_p
96 || ! CGEN_INSN_ATTR (insn, CGEN_INSN_ALIAS))
97 {
98 /* Basic bit mask must be correct. */
99 /* ??? May wish to allow target to defer this check until the
100 extract handler. */
101 if ((base_insn & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn))
102 {
103 /* ??? 0 is passed for `pc' */
104 int elength = (*CGEN_EXTRACT_FN (insn)) (od, insn, info,
105 base_insn, fields,
106 (bfd_vma) 0);
107 if (elength > 0)
108 {
109 /* sanity check */
110 if (length != 0 && length != elength)
111 abort ();
112 return insn;
113 }
114 }
115 }
116
117 insn_list = CGEN_DIS_NEXT_INSN (insn_list);
118 }
119 }
120 else
121 {
122 /* Sanity check: can't pass an alias insn if ! alias_p. */
123 if (! alias_p
124 && CGEN_INSN_ATTR (insn, CGEN_INSN_ALIAS))
125 abort ();
126 /* Sanity check: length must be correct. */
127 if (length != CGEN_INSN_BITSIZE (insn))
128 abort ();
129
130 /* ??? 0 is passed for `pc' */
131 length = (*CGEN_EXTRACT_FN (insn)) (od, insn, info, base_insn, fields,
132 (bfd_vma) 0);
133 /* Sanity check: must succeed.
134 Could relax this later if it ever proves useful. */
135 if (length == 0)
136 abort ();
137 return insn;
138 }
139
140 return NULL;
141 }
142
143 /* Fill in the operand instances used by INSN whose operands are FIELDS.
144 INDICES is a pointer to a buffer of MAX_OPERAND_INSTANCES ints to be filled
145 in. */
146
147 void
148 fr30_cgen_get_insn_operands (od, insn, fields, indices)
149 CGEN_OPCODE_DESC od;
150 const CGEN_INSN * insn;
151 const CGEN_FIELDS * fields;
152 int *indices;
153 {
154 const CGEN_OPERAND_INSTANCE *opinst;
155 int i;
156
157 for (i = 0, opinst = CGEN_INSN_OPERANDS (insn);
158 opinst != NULL
159 && CGEN_OPERAND_INSTANCE_TYPE (opinst) != CGEN_OPERAND_INSTANCE_END;
160 ++i, ++opinst)
161 {
162 const CGEN_OPERAND *op = CGEN_OPERAND_INSTANCE_OPERAND (opinst);
163 if (op == NULL)
164 indices[i] = CGEN_OPERAND_INSTANCE_INDEX (opinst);
165 else
166 indices[i] = fr30_cgen_get_int_operand (CGEN_OPERAND_INDEX (op),
167 fields);
168 }
169 }
170
171 /* Cover function to fr30_cgen_get_insn_operands when either INSN or FIELDS
172 isn't known.
173 The INSN, INSN_VALUE, and LENGTH arguments are passed to
174 fr30_cgen_lookup_insn unchanged.
175
176 The result is the insn table entry or NULL if the instruction wasn't
177 recognized. */
178
179 const CGEN_INSN *
180 fr30_cgen_lookup_get_insn_operands (od, insn, insn_value, length, indices)
181 CGEN_OPCODE_DESC od;
182 const CGEN_INSN *insn;
183 CGEN_INSN_BYTES insn_value;
184 int length;
185 int *indices;
186 {
187 CGEN_FIELDS fields;
188
189 /* Pass non-zero for ALIAS_P only if INSN != NULL.
190 If INSN == NULL, we want a real insn. */
191 insn = fr30_cgen_lookup_insn (od, insn, insn_value, length, &fields,
192 insn != NULL);
193 if (! insn)
194 return NULL;
195
196 fr30_cgen_get_insn_operands (od, insn, &fields, indices);
197 return insn;
198 }
199 /* Attributes. */
200
201 static const CGEN_ATTR_ENTRY MACH_attr[] =
202 {
203 { "base", MACH_BASE },
204 { "fr30", MACH_FR30 },
205 { "max", MACH_MAX },
206 { 0, 0 }
207 };
208
209 const CGEN_ATTR_TABLE fr30_cgen_hardware_attr_table[] =
210 {
211 { "CACHE-ADDR", NULL },
212 { "PC", NULL },
213 { "PROFILE", NULL },
214 { 0, 0 }
215 };
216
217 const CGEN_ATTR_TABLE fr30_cgen_operand_attr_table[] =
218 {
219 { "ABS-ADDR", NULL },
220 { "HASH-PREFIX", NULL },
221 { "NEGATIVE", NULL },
222 { "PCREL-ADDR", NULL },
223 { "RELAX", NULL },
224 { "SEM-ONLY", NULL },
225 { "SIGN-OPT", NULL },
226 { "SIGNED", NULL },
227 { "UNSIGNED", NULL },
228 { 0, 0 }
229 };
230
231 const CGEN_ATTR_TABLE fr30_cgen_insn_attr_table[] =
232 {
233 { "ALIAS", NULL },
234 { "COND-CTI", NULL },
235 { "NO-DIS", NULL },
236 { "RELAX", NULL },
237 { "RELAXABLE", NULL },
238 { "SKIP-CTI", NULL },
239 { "UNCOND-CTI", NULL },
240 { "VIRTUAL", NULL },
241 { 0, 0 }
242 };
243
244 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_gr_entries[] =
245 {
246 { "ac", 13 },
247 { "fp", 14 },
248 { "sp", 15 },
249 { "r0", 0 },
250 { "r1", 1 },
251 { "r2", 2 },
252 { "r3", 3 },
253 { "r4", 4 },
254 { "r5", 5 },
255 { "r6", 6 },
256 { "r7", 7 },
257 { "r8", 8 },
258 { "r9", 9 },
259 { "r10", 10 },
260 { "r11", 11 },
261 { "r12", 12 },
262 { "r13", 13 },
263 { "r14", 14 },
264 { "r15", 15 }
265 };
266
267 CGEN_KEYWORD fr30_cgen_opval_h_gr =
268 {
269 & fr30_cgen_opval_h_gr_entries[0],
270 19
271 };
272
273 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_dr_entries[] =
274 {
275 { "tbr", 0 },
276 { "rp", 1 },
277 { "ssp", 2 },
278 { "usp", 3 },
279 { "mdh", 4 },
280 { "mdl", 5 }
281 };
282
283 CGEN_KEYWORD fr30_cgen_opval_h_dr =
284 {
285 & fr30_cgen_opval_h_dr_entries[0],
286 6
287 };
288
289 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_ps_entries[] =
290 {
291 { "ps", 1 }
292 };
293
294 CGEN_KEYWORD fr30_cgen_opval_h_ps =
295 {
296 & fr30_cgen_opval_h_ps_entries[0],
297 1
298 };
299
300 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_r13_entries[] =
301 {
302 { "r13", 13 }
303 };
304
305 CGEN_KEYWORD fr30_cgen_opval_h_r13 =
306 {
307 & fr30_cgen_opval_h_r13_entries[0],
308 1
309 };
310
311 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_r14_entries[] =
312 {
313 { "r14", 14 }
314 };
315
316 CGEN_KEYWORD fr30_cgen_opval_h_r14 =
317 {
318 & fr30_cgen_opval_h_r14_entries[0],
319 1
320 };
321
322 CGEN_KEYWORD_ENTRY fr30_cgen_opval_h_r15_entries[] =
323 {
324 { "r15", 15 }
325 };
326
327 CGEN_KEYWORD fr30_cgen_opval_h_r15 =
328 {
329 & fr30_cgen_opval_h_r15_entries[0],
330 1
331 };
332
333
334 /* The hardware table. */
335
336 #define HW_ENT(n) fr30_cgen_hw_entries[n]
337 static const CGEN_HW_ENTRY fr30_cgen_hw_entries[] =
338 {
339 { HW_H_PC, & HW_ENT (HW_H_PC + 1), "h-pc", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0|(1<<CGEN_HW_PROFILE)|(1<<CGEN_HW_PC), { 0 } } },
340 { HW_H_MEMORY, & HW_ENT (HW_H_MEMORY + 1), "h-memory", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
341 { HW_H_SINT, & HW_ENT (HW_H_SINT + 1), "h-sint", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
342 { HW_H_UINT, & HW_ENT (HW_H_UINT + 1), "h-uint", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
343 { HW_H_ADDR, & HW_ENT (HW_H_ADDR + 1), "h-addr", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
344 { HW_H_IADDR, & HW_ENT (HW_H_IADDR + 1), "h-iaddr", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
345 { HW_H_GR, & HW_ENT (HW_H_GR + 1), "h-gr", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_gr, { 0, 0|(1<<CGEN_HW_CACHE_ADDR)|(1<<CGEN_HW_PROFILE), { 0 } } },
346 { HW_H_DR, & HW_ENT (HW_H_DR + 1), "h-dr", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_dr, { 0, 0, { 0 } } },
347 { HW_H_PS, & HW_ENT (HW_H_PS + 1), "h-ps", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_ps, { 0, 0, { 0 } } },
348 { HW_H_R13, & HW_ENT (HW_H_R13 + 1), "h-r13", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_r13, { 0, 0, { 0 } } },
349 { HW_H_R14, & HW_ENT (HW_H_R14 + 1), "h-r14", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_r14, { 0, 0, { 0 } } },
350 { HW_H_R15, & HW_ENT (HW_H_R15 + 1), "h-r15", CGEN_ASM_KEYWORD, (PTR) & fr30_cgen_opval_h_r15, { 0, 0, { 0 } } },
351 { HW_H_NBIT, & HW_ENT (HW_H_NBIT + 1), "h-nbit", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
352 { HW_H_ZBIT, & HW_ENT (HW_H_ZBIT + 1), "h-zbit", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
353 { HW_H_VBIT, & HW_ENT (HW_H_VBIT + 1), "h-vbit", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
354 { HW_H_CBIT, & HW_ENT (HW_H_CBIT + 1), "h-cbit", CGEN_ASM_KEYWORD, (PTR) 0, { 0, 0, { 0 } } },
355 { 0 }
356 };
357
358 /* The operand table. */
359
360 #define OPERAND(op) CONCAT2 (FR30_OPERAND_,op)
361 #define OP_ENT(op) fr30_cgen_operand_table[OPERAND (op)]
362
363 const CGEN_OPERAND fr30_cgen_operand_table[MAX_OPERANDS] =
364 {
365 /* pc: program counter */
366 { "pc", & HW_ENT (HW_H_PC), 0, 0,
367 { 0, 0|(1<<CGEN_OPERAND_SEM_ONLY), { 0 } } },
368 /* Ri: destination register */
369 { "Ri", & HW_ENT (HW_H_GR), 12, 4,
370 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
371 /* Rj: source register */
372 { "Rj", & HW_ENT (HW_H_GR), 8, 4,
373 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
374 /* Rs1: dedicated register */
375 { "Rs1", & HW_ENT (HW_H_DR), 8, 4,
376 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
377 /* Rs2: dedicated register */
378 { "Rs2", & HW_ENT (HW_H_DR), 12, 4,
379 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
380 /* R13: General Register 13 */
381 { "R13", & HW_ENT (HW_H_R13), 0, 0,
382 { 0, 0, { 0 } } },
383 /* R14: General Register 14 */
384 { "R14", & HW_ENT (HW_H_R14), 0, 0,
385 { 0, 0, { 0 } } },
386 /* R15: General Register 15 */
387 { "R15", & HW_ENT (HW_H_R15), 0, 0,
388 { 0, 0, { 0 } } },
389 /* ps: Program Status register */
390 { "ps", & HW_ENT (HW_H_PS), 0, 0,
391 { 0, 0, { 0 } } },
392 /* u4: 4 bit unsigned immediate */
393 { "u4", & HW_ENT (HW_H_UINT), 8, 4,
394 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
395 /* m4: 4 bit negative immediate */
396 { "m4", & HW_ENT (HW_H_UINT), 8, 4,
397 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
398 /* u8: 8 bit unsigned immediate */
399 { "u8", & HW_ENT (HW_H_UINT), 8, 8,
400 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
401 /* i8: 8 bit unsigned immediate */
402 { "i8", & HW_ENT (HW_H_UINT), 4, 8,
403 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
404 /* udisp6: 6 bit unsigned immediate */
405 { "udisp6", & HW_ENT (HW_H_UINT), 8, 4,
406 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
407 /* disp8: 8 bit signed immediate */
408 { "disp8", & HW_ENT (HW_H_SINT), 4, 8,
409 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
410 /* disp9: 9 bit signed immediate */
411 { "disp9", & HW_ENT (HW_H_SINT), 4, 8,
412 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
413 /* disp10: 10 bit signed immediate */
414 { "disp10", & HW_ENT (HW_H_SINT), 4, 8,
415 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
416 /* s10: 10 bit signed immediate */
417 { "s10", & HW_ENT (HW_H_SINT), 8, 8,
418 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
419 /* u10: 10 bit unsigned immediate */
420 { "u10", & HW_ENT (HW_H_UINT), 8, 8,
421 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
422 /* i32: 32 bit immediate */
423 { "i32", & HW_ENT (HW_H_UINT), 16, 32,
424 { 0, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGN_OPT)|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
425 /* dir8: 8 bit direct address */
426 { "dir8", & HW_ENT (HW_H_UINT), 8, 8,
427 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
428 /* dir9: 9 bit direct address */
429 { "dir9", & HW_ENT (HW_H_UINT), 8, 8,
430 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
431 /* dir10: 10 bit direct address */
432 { "dir10", & HW_ENT (HW_H_UINT), 8, 8,
433 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
434 /* label9: 9 bit pc relative address */
435 { "label9", & HW_ENT (HW_H_SINT), 8, 8,
436 { 0, 0|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
437 /* label12: 12 bit pc relative address */
438 { "label12", & HW_ENT (HW_H_SINT), 5, 11,
439 { 0, 0|(1<<CGEN_OPERAND_SIGNED), { 0 } } },
440 /* cc: condition codes */
441 { "cc", & HW_ENT (HW_H_UINT), 4, 4,
442 { 0, 0|(1<<CGEN_OPERAND_UNSIGNED), { 0 } } },
443 /* nbit: negative bit */
444 { "nbit", & HW_ENT (HW_H_NBIT), 0, 0,
445 { 0, 0|(1<<CGEN_OPERAND_SEM_ONLY), { 0 } } },
446 /* vbit: overflow bit */
447 { "vbit", & HW_ENT (HW_H_VBIT), 0, 0,
448 { 0, 0|(1<<CGEN_OPERAND_SEM_ONLY), { 0 } } },
449 /* zbit: zero bit */
450 { "zbit", & HW_ENT (HW_H_ZBIT), 0, 0,
451 { 0, 0|(1<<CGEN_OPERAND_SEM_ONLY), { 0 } } },
452 /* cbit: carry bit */
453 { "cbit", & HW_ENT (HW_H_CBIT), 0, 0,
454 { 0, 0|(1<<CGEN_OPERAND_SEM_ONLY), { 0 } } },
455 };
456
457 /* Operand references. */
458
459 #define INPUT CGEN_OPERAND_INSTANCE_INPUT
460 #define OUTPUT CGEN_OPERAND_INSTANCE_OUTPUT
461 #define COND_REF CGEN_OPERAND_INSTANCE_COND_REF
462
463 static const CGEN_OPERAND_INSTANCE fmt_add_ops[] = {
464 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
465 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
466 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
467 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
468 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
469 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
470 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
471 { 0 }
472 };
473
474 static const CGEN_OPERAND_INSTANCE fmt_addi_ops[] = {
475 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
476 { INPUT, "u4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (U4), 0, 0 },
477 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
478 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
479 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
480 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
481 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
482 { 0 }
483 };
484
485 static const CGEN_OPERAND_INSTANCE fmt_add2_ops[] = {
486 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
487 { INPUT, "m4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (M4), 0, 0 },
488 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
489 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
490 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
491 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
492 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
493 { 0 }
494 };
495
496 static const CGEN_OPERAND_INSTANCE fmt_addc_ops[] = {
497 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
498 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
499 { INPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
500 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
501 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
502 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
503 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
504 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
505 { 0 }
506 };
507
508 static const CGEN_OPERAND_INSTANCE fmt_addn_ops[] = {
509 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
510 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
511 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
512 { 0 }
513 };
514
515 static const CGEN_OPERAND_INSTANCE fmt_addni_ops[] = {
516 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
517 { INPUT, "u4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (U4), 0, 0 },
518 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
519 { 0 }
520 };
521
522 static const CGEN_OPERAND_INSTANCE fmt_addn2_ops[] = {
523 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
524 { INPUT, "m4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (M4), 0, 0 },
525 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
526 { 0 }
527 };
528
529 static const CGEN_OPERAND_INSTANCE fmt_cmp_ops[] = {
530 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
531 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
532 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
533 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
534 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
535 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
536 { 0 }
537 };
538
539 static const CGEN_OPERAND_INSTANCE fmt_cmpi_ops[] = {
540 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
541 { INPUT, "u4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (U4), 0, 0 },
542 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
543 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
544 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
545 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
546 { 0 }
547 };
548
549 static const CGEN_OPERAND_INSTANCE fmt_cmp2_ops[] = {
550 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
551 { INPUT, "m4", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (M4), 0, 0 },
552 { OUTPUT, "vbit", & HW_ENT (HW_H_VBIT), CGEN_MODE_BI, 0, 0, 0 },
553 { OUTPUT, "cbit", & HW_ENT (HW_H_CBIT), CGEN_MODE_BI, 0, 0, 0 },
554 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
555 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
556 { 0 }
557 };
558
559 static const CGEN_OPERAND_INSTANCE fmt_and_ops[] = {
560 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
561 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
562 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
563 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
564 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
565 { 0 }
566 };
567
568 static const CGEN_OPERAND_INSTANCE fmt_andm_ops[] = {
569 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_USI, & OP_ENT (RI), 0, 0 },
570 { INPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_SI, 0, 0, 0 },
571 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RJ), 0, 0 },
572 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
573 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
574 { OUTPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_SI, 0, 0, 0 },
575 { 0 }
576 };
577
578 static const CGEN_OPERAND_INSTANCE fmt_andh_ops[] = {
579 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_USI, & OP_ENT (RI), 0, 0 },
580 { INPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_HI, 0, 0, 0 },
581 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_HI, & OP_ENT (RJ), 0, 0 },
582 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
583 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
584 { OUTPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_HI, 0, 0, 0 },
585 { 0 }
586 };
587
588 static const CGEN_OPERAND_INSTANCE fmt_andb_ops[] = {
589 { INPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_USI, & OP_ENT (RI), 0, 0 },
590 { INPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_QI, 0, 0, 0 },
591 { INPUT, "Rj", & HW_ENT (HW_H_GR), CGEN_MODE_QI, & OP_ENT (RJ), 0, 0 },
592 { OUTPUT, "zbit", & HW_ENT (HW_H_ZBIT), CGEN_MODE_BI, 0, 0, 0 },
593 { OUTPUT, "nbit", & HW_ENT (HW_H_NBIT), CGEN_MODE_BI, 0, 0, 0 },
594 { OUTPUT, "h_memory_Ri", & HW_ENT (HW_H_MEMORY), CGEN_MODE_QI, 0, 0, 0 },
595 { 0 }
596 };
597
598 static const CGEN_OPERAND_INSTANCE fmt_ldi32_ops[] = {
599 { INPUT, "i32", & HW_ENT (HW_H_UINT), CGEN_MODE_USI, & OP_ENT (I32), 0, 0 },
600 { OUTPUT, "Ri", & HW_ENT (HW_H_GR), CGEN_MODE_SI, & OP_ENT (RI), 0, 0 },
601 { 0 }
602 };
603
604 #undef INPUT
605 #undef OUTPUT
606 #undef COND_REF
607
608 #define A(a) (1 << CONCAT2 (CGEN_INSN_,a))
609 #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
610 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
611
612 /* The instruction table.
613 This is currently non-static because the simulator accesses it
614 directly. */
615
616 const CGEN_INSN fr30_cgen_insn_table_entries[MAX_INSNS] =
617 {
618 /* Special null first entry.
619 A `num' value of zero is thus invalid.
620 Also, the special `invalid' insn resides here. */
621 { { 0 }, 0 },
622 /* add $Rj,$Ri */
623 {
624 { 1, 1, 1, 1 },
625 FR30_INSN_ADD, "add", "add",
626 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
627 { 16, 16, 0xff00 }, 0xa600,
628 (PTR) & fmt_add_ops[0],
629 { 0, 0, { 0 } }
630 },
631 /* add $u4,$Ri */
632 {
633 { 1, 1, 1, 1 },
634 FR30_INSN_ADDI, "addi", "add",
635 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
636 { 16, 16, 0xff00 }, 0xa400,
637 (PTR) & fmt_addi_ops[0],
638 { 0, 0, { 0 } }
639 },
640 /* add2 $m4,$Ri */
641 {
642 { 1, 1, 1, 1 },
643 FR30_INSN_ADD2, "add2", "add2",
644 { { MNEM, ' ', OP (M4), ',', OP (RI), 0 } },
645 { 16, 16, 0xff00 }, 0xa500,
646 (PTR) & fmt_add2_ops[0],
647 { 0, 0, { 0 } }
648 },
649 /* addc $Rj,$Ri */
650 {
651 { 1, 1, 1, 1 },
652 FR30_INSN_ADDC, "addc", "addc",
653 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
654 { 16, 16, 0xff00 }, 0xa700,
655 (PTR) & fmt_addc_ops[0],
656 { 0, 0, { 0 } }
657 },
658 /* addn $Rj,$Ri */
659 {
660 { 1, 1, 1, 1 },
661 FR30_INSN_ADDN, "addn", "addn",
662 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
663 { 16, 16, 0xff00 }, 0xa200,
664 (PTR) & fmt_addn_ops[0],
665 { 0, 0, { 0 } }
666 },
667 /* addn $u4,$Ri */
668 {
669 { 1, 1, 1, 1 },
670 FR30_INSN_ADDNI, "addni", "addn",
671 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
672 { 16, 16, 0xff00 }, 0xa000,
673 (PTR) & fmt_addni_ops[0],
674 { 0, 0, { 0 } }
675 },
676 /* addn2 $m4,$Ri */
677 {
678 { 1, 1, 1, 1 },
679 FR30_INSN_ADDN2, "addn2", "addn2",
680 { { MNEM, ' ', OP (M4), ',', OP (RI), 0 } },
681 { 16, 16, 0xff00 }, 0xa100,
682 (PTR) & fmt_addn2_ops[0],
683 { 0, 0, { 0 } }
684 },
685 /* sub $Rj,$Ri */
686 {
687 { 1, 1, 1, 1 },
688 FR30_INSN_SUB, "sub", "sub",
689 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
690 { 16, 16, 0xff00 }, 0xac00,
691 (PTR) & fmt_add_ops[0],
692 { 0, 0, { 0 } }
693 },
694 /* subc $Rj,$Ri */
695 {
696 { 1, 1, 1, 1 },
697 FR30_INSN_SUBC, "subc", "subc",
698 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
699 { 16, 16, 0xff00 }, 0xad00,
700 (PTR) & fmt_addc_ops[0],
701 { 0, 0, { 0 } }
702 },
703 /* subn $Rj,$Ri */
704 {
705 { 1, 1, 1, 1 },
706 FR30_INSN_SUBN, "subn", "subn",
707 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
708 { 16, 16, 0xff00 }, 0xae00,
709 (PTR) & fmt_addn_ops[0],
710 { 0, 0, { 0 } }
711 },
712 /* cmp $Rj,$Ri */
713 {
714 { 1, 1, 1, 1 },
715 FR30_INSN_CMP, "cmp", "cmp",
716 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
717 { 16, 16, 0xff00 }, 0xaa00,
718 (PTR) & fmt_cmp_ops[0],
719 { 0, 0, { 0 } }
720 },
721 /* cmp $u4,$Ri */
722 {
723 { 1, 1, 1, 1 },
724 FR30_INSN_CMPI, "cmpi", "cmp",
725 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
726 { 16, 16, 0xff00 }, 0xa800,
727 (PTR) & fmt_cmpi_ops[0],
728 { 0, 0, { 0 } }
729 },
730 /* cmp2 $m4,$Ri */
731 {
732 { 1, 1, 1, 1 },
733 FR30_INSN_CMP2, "cmp2", "cmp2",
734 { { MNEM, ' ', OP (M4), ',', OP (RI), 0 } },
735 { 16, 16, 0xff00 }, 0xa900,
736 (PTR) & fmt_cmp2_ops[0],
737 { 0, 0, { 0 } }
738 },
739 /* and $Rj,$Ri */
740 {
741 { 1, 1, 1, 1 },
742 FR30_INSN_AND, "and", "and",
743 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
744 { 16, 16, 0xff00 }, 0x8200,
745 (PTR) & fmt_and_ops[0],
746 { 0, 0, { 0 } }
747 },
748 /* or $Rj,$Ri */
749 {
750 { 1, 1, 1, 1 },
751 FR30_INSN_OR, "or", "or",
752 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
753 { 16, 16, 0xff00 }, 0x9200,
754 (PTR) & fmt_and_ops[0],
755 { 0, 0, { 0 } }
756 },
757 /* eor $Rj,$Ri */
758 {
759 { 1, 1, 1, 1 },
760 FR30_INSN_EOR, "eor", "eor",
761 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
762 { 16, 16, 0xff00 }, 0x9a00,
763 (PTR) & fmt_and_ops[0],
764 { 0, 0, { 0 } }
765 },
766 /* and $Rj,@$Ri */
767 {
768 { 1, 1, 1, 1 },
769 FR30_INSN_ANDM, "andm", "and",
770 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
771 { 16, 16, 0xff00 }, 0x8400,
772 (PTR) & fmt_andm_ops[0],
773 { 0, 0, { 0 } }
774 },
775 /* andh $Rj,@$Ri */
776 {
777 { 1, 1, 1, 1 },
778 FR30_INSN_ANDH, "andh", "andh",
779 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
780 { 16, 16, 0xff00 }, 0x8500,
781 (PTR) & fmt_andh_ops[0],
782 { 0, 0, { 0 } }
783 },
784 /* andb $Rj,@$Ri */
785 {
786 { 1, 1, 1, 1 },
787 FR30_INSN_ANDB, "andb", "andb",
788 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
789 { 16, 16, 0xff00 }, 0x8600,
790 (PTR) & fmt_andb_ops[0],
791 { 0, 0, { 0 } }
792 },
793 /* or $Rj,@$Ri */
794 {
795 { 1, 1, 1, 1 },
796 FR30_INSN_ORM, "orm", "or",
797 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
798 { 16, 16, 0xff00 }, 0x9400,
799 (PTR) & fmt_andm_ops[0],
800 { 0, 0, { 0 } }
801 },
802 /* orh $Rj,@$Ri */
803 {
804 { 1, 1, 1, 1 },
805 FR30_INSN_ORH, "orh", "orh",
806 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
807 { 16, 16, 0xff00 }, 0x9500,
808 (PTR) & fmt_andh_ops[0],
809 { 0, 0, { 0 } }
810 },
811 /* orb $Rj,@$Ri */
812 {
813 { 1, 1, 1, 1 },
814 FR30_INSN_ORB, "orb", "orb",
815 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
816 { 16, 16, 0xff00 }, 0x9600,
817 (PTR) & fmt_andb_ops[0],
818 { 0, 0, { 0 } }
819 },
820 /* eor $Rj,@$Ri */
821 {
822 { 1, 1, 1, 1 },
823 FR30_INSN_EORM, "eorm", "eor",
824 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
825 { 16, 16, 0xff00 }, 0x9c00,
826 (PTR) & fmt_andm_ops[0],
827 { 0, 0, { 0 } }
828 },
829 /* eorh $Rj,@$Ri */
830 {
831 { 1, 1, 1, 1 },
832 FR30_INSN_EORH, "eorh", "eorh",
833 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
834 { 16, 16, 0xff00 }, 0x9d00,
835 (PTR) & fmt_andh_ops[0],
836 { 0, 0, { 0 } }
837 },
838 /* eorb $Rj,@$Ri */
839 {
840 { 1, 1, 1, 1 },
841 FR30_INSN_EORB, "eorb", "eorb",
842 { { MNEM, ' ', OP (RJ), ',', '@', OP (RI), 0 } },
843 { 16, 16, 0xff00 }, 0x9e00,
844 (PTR) & fmt_andb_ops[0],
845 { 0, 0, { 0 } }
846 },
847 /* bandl $u4,@$Ri */
848 {
849 { 1, 1, 1, 1 },
850 FR30_INSN_BANDL, "bandl", "bandl",
851 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
852 { 16, 16, 0xff00 }, 0x8000,
853 (PTR) 0,
854 { 0, 0, { 0 } }
855 },
856 /* borl $u4,@$Ri */
857 {
858 { 1, 1, 1, 1 },
859 FR30_INSN_BORL, "borl", "borl",
860 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
861 { 16, 16, 0xff00 }, 0x9000,
862 (PTR) 0,
863 { 0, 0, { 0 } }
864 },
865 /* beorl $u4,@$Ri */
866 {
867 { 1, 1, 1, 1 },
868 FR30_INSN_BEORL, "beorl", "beorl",
869 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
870 { 16, 16, 0xff00 }, 0x9800,
871 (PTR) 0,
872 { 0, 0, { 0 } }
873 },
874 /* bandh $u4,@$Ri */
875 {
876 { 1, 1, 1, 1 },
877 FR30_INSN_BANDH, "bandh", "bandh",
878 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
879 { 16, 16, 0xff00 }, 0x8100,
880 (PTR) 0,
881 { 0, 0, { 0 } }
882 },
883 /* borh $u4,@$Ri */
884 {
885 { 1, 1, 1, 1 },
886 FR30_INSN_BORH, "borh", "borh",
887 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
888 { 16, 16, 0xff00 }, 0x9100,
889 (PTR) 0,
890 { 0, 0, { 0 } }
891 },
892 /* beorh $u4,@$Ri */
893 {
894 { 1, 1, 1, 1 },
895 FR30_INSN_BEORH, "beorh", "beorh",
896 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
897 { 16, 16, 0xff00 }, 0x9900,
898 (PTR) 0,
899 { 0, 0, { 0 } }
900 },
901 /* btstl $u4,@$Ri */
902 {
903 { 1, 1, 1, 1 },
904 FR30_INSN_BTSTL, "btstl", "btstl",
905 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
906 { 16, 16, 0xff00 }, 0x8800,
907 (PTR) 0,
908 { 0, 0, { 0 } }
909 },
910 /* btsth $u4,@$Ri */
911 {
912 { 1, 1, 1, 1 },
913 FR30_INSN_BTSTH, "btsth", "btsth",
914 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), 0 } },
915 { 16, 16, 0xff00 }, 0x8900,
916 (PTR) 0,
917 { 0, 0, { 0 } }
918 },
919 /* mul $Rj,$Ri */
920 {
921 { 1, 1, 1, 1 },
922 FR30_INSN_MUL, "mul", "mul",
923 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
924 { 16, 16, 0xff00 }, 0xaf00,
925 (PTR) 0,
926 { 0, 0, { 0 } }
927 },
928 /* mulu $Rj,$Ri */
929 {
930 { 1, 1, 1, 1 },
931 FR30_INSN_MULU, "mulu", "mulu",
932 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
933 { 16, 16, 0xff00 }, 0xab00,
934 (PTR) 0,
935 { 0, 0, { 0 } }
936 },
937 /* mulh $Rj,$Ri */
938 {
939 { 1, 1, 1, 1 },
940 FR30_INSN_MULH, "mulh", "mulh",
941 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
942 { 16, 16, 0xff00 }, 0xbf00,
943 (PTR) 0,
944 { 0, 0, { 0 } }
945 },
946 /* muluh $Rj,$Ri */
947 {
948 { 1, 1, 1, 1 },
949 FR30_INSN_MULUH, "muluh", "muluh",
950 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
951 { 16, 16, 0xff00 }, 0xbb00,
952 (PTR) 0,
953 { 0, 0, { 0 } }
954 },
955 /* div0s $Ri */
956 {
957 { 1, 1, 1, 1 },
958 FR30_INSN_DIV0S, "div0s", "div0s",
959 { { MNEM, ' ', OP (RI), 0 } },
960 { 16, 16, 0xfff0 }, 0x9740,
961 (PTR) 0,
962 { 0, 0, { 0 } }
963 },
964 /* div0u $Ri */
965 {
966 { 1, 1, 1, 1 },
967 FR30_INSN_DIV0U, "div0u", "div0u",
968 { { MNEM, ' ', OP (RI), 0 } },
969 { 16, 16, 0xfff0 }, 0x9750,
970 (PTR) 0,
971 { 0, 0, { 0 } }
972 },
973 /* div1 $Ri */
974 {
975 { 1, 1, 1, 1 },
976 FR30_INSN_DIV1, "div1", "div1",
977 { { MNEM, ' ', OP (RI), 0 } },
978 { 16, 16, 0xfff0 }, 0x9760,
979 (PTR) 0,
980 { 0, 0, { 0 } }
981 },
982 /* div2 $Ri */
983 {
984 { 1, 1, 1, 1 },
985 FR30_INSN_DIV2, "div2", "div2",
986 { { MNEM, ' ', OP (RI), 0 } },
987 { 16, 16, 0xfff0 }, 0x9770,
988 (PTR) 0,
989 { 0, 0, { 0 } }
990 },
991 /* div3 */
992 {
993 { 1, 1, 1, 1 },
994 FR30_INSN_DIV3, "div3", "div3",
995 { { MNEM, 0 } },
996 { 16, 16, 0xffff }, 0x9f60,
997 (PTR) 0,
998 { 0, 0, { 0 } }
999 },
1000 /* div4s */
1001 {
1002 { 1, 1, 1, 1 },
1003 FR30_INSN_DIV4S, "div4s", "div4s",
1004 { { MNEM, 0 } },
1005 { 16, 16, 0xffff }, 0x9f70,
1006 (PTR) 0,
1007 { 0, 0, { 0 } }
1008 },
1009 /* lsl $Rj,$Ri */
1010 {
1011 { 1, 1, 1, 1 },
1012 FR30_INSN_LSL, "lsl", "lsl",
1013 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
1014 { 16, 16, 0xff00 }, 0xb600,
1015 (PTR) 0,
1016 { 0, 0, { 0 } }
1017 },
1018 /* lsl $u4,$Ri */
1019 {
1020 { 1, 1, 1, 1 },
1021 FR30_INSN_LSLI, "lsli", "lsl",
1022 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1023 { 16, 16, 0xff00 }, 0xb400,
1024 (PTR) 0,
1025 { 0, 0, { 0 } }
1026 },
1027 /* lsl2 $u4,$Ri */
1028 {
1029 { 1, 1, 1, 1 },
1030 FR30_INSN_LSL2, "lsl2", "lsl2",
1031 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1032 { 16, 16, 0xff00 }, 0xb500,
1033 (PTR) 0,
1034 { 0, 0, { 0 } }
1035 },
1036 /* lsr $Rj,$Ri */
1037 {
1038 { 1, 1, 1, 1 },
1039 FR30_INSN_LSR, "lsr", "lsr",
1040 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
1041 { 16, 16, 0xff00 }, 0xb200,
1042 (PTR) 0,
1043 { 0, 0, { 0 } }
1044 },
1045 /* lsr $u4,$Ri */
1046 {
1047 { 1, 1, 1, 1 },
1048 FR30_INSN_LSRI, "lsri", "lsr",
1049 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1050 { 16, 16, 0xff00 }, 0xb000,
1051 (PTR) 0,
1052 { 0, 0, { 0 } }
1053 },
1054 /* lsr2 $u4,$Ri */
1055 {
1056 { 1, 1, 1, 1 },
1057 FR30_INSN_LSR2, "lsr2", "lsr2",
1058 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1059 { 16, 16, 0xff00 }, 0xb100,
1060 (PTR) 0,
1061 { 0, 0, { 0 } }
1062 },
1063 /* asr $Rj,$Ri */
1064 {
1065 { 1, 1, 1, 1 },
1066 FR30_INSN_ASR, "asr", "asr",
1067 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
1068 { 16, 16, 0xff00 }, 0xba00,
1069 (PTR) 0,
1070 { 0, 0, { 0 } }
1071 },
1072 /* asr $u4,$Ri */
1073 {
1074 { 1, 1, 1, 1 },
1075 FR30_INSN_ASRI, "asri", "asr",
1076 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1077 { 16, 16, 0xff00 }, 0xb800,
1078 (PTR) 0,
1079 { 0, 0, { 0 } }
1080 },
1081 /* asr2 $u4,$Ri */
1082 {
1083 { 1, 1, 1, 1 },
1084 FR30_INSN_ASR2, "asr2", "asr2",
1085 { { MNEM, ' ', OP (U4), ',', OP (RI), 0 } },
1086 { 16, 16, 0xff00 }, 0xb900,
1087 (PTR) 0,
1088 { 0, 0, { 0 } }
1089 },
1090 /* ldi:8 $i8,$Ri */
1091 {
1092 { 1, 1, 1, 1 },
1093 FR30_INSN_LDI_8, "ldi:8", "ldi:8",
1094 { { MNEM, ' ', OP (I8), ',', OP (RI), 0 } },
1095 { 16, 16, 0xf000 }, 0xc000,
1096 (PTR) 0,
1097 { 0, 0, { 0 } }
1098 },
1099 /* ldi:32 $i32,$Ri */
1100 {
1101 { 1, 1, 1, 1 },
1102 FR30_INSN_LDI32, "ldi32", "ldi:32",
1103 { { MNEM, ' ', OP (I32), ',', OP (RI), 0 } },
1104 { 16, 48, 0xfff0 }, 0x9f80,
1105 (PTR) & fmt_ldi32_ops[0],
1106 { 0, 0, { 0 } }
1107 },
1108 /* ld @$Rj,$Ri */
1109 {
1110 { 1, 1, 1, 1 },
1111 FR30_INSN_LD, "ld", "ld",
1112 { { MNEM, ' ', '@', OP (RJ), ',', OP (RI), 0 } },
1113 { 16, 16, 0xff00 }, 0x400,
1114 (PTR) 0,
1115 { 0, 0, { 0 } }
1116 },
1117 /* lduh @$Rj,$Ri */
1118 {
1119 { 1, 1, 1, 1 },
1120 FR30_INSN_LDUH, "lduh", "lduh",
1121 { { MNEM, ' ', '@', OP (RJ), ',', OP (RI), 0 } },
1122 { 16, 16, 0xff00 }, 0x500,
1123 (PTR) 0,
1124 { 0, 0, { 0 } }
1125 },
1126 /* ldub @$Rj,$Ri */
1127 {
1128 { 1, 1, 1, 1 },
1129 FR30_INSN_LDUB, "ldub", "ldub",
1130 { { MNEM, ' ', '@', OP (RJ), ',', OP (RI), 0 } },
1131 { 16, 16, 0xff00 }, 0x600,
1132 (PTR) 0,
1133 { 0, 0, { 0 } }
1134 },
1135 /* ld @($r13,$Rj),$Ri */
1136 {
1137 { 1, 1, 1, 1 },
1138 FR30_INSN_LDR13, "ldr13", "ld",
1139 { { MNEM, ' ', '@', '(', OP (R13), ',', OP (RJ), ')', ',', OP (RI), 0 } },
1140 { 16, 16, 0xff00 }, 0x0,
1141 (PTR) 0,
1142 { 0, 0, { 0 } }
1143 },
1144 /* lduh @($r13,$Rj),$Ri */
1145 {
1146 { 1, 1, 1, 1 },
1147 FR30_INSN_LDR13UH, "ldr13uh", "lduh",
1148 { { MNEM, ' ', '@', '(', OP (R13), ',', OP (RJ), ')', ',', OP (RI), 0 } },
1149 { 16, 16, 0xff00 }, 0x100,
1150 (PTR) 0,
1151 { 0, 0, { 0 } }
1152 },
1153 /* ldub @($r13,$Rj),$Ri */
1154 {
1155 { 1, 1, 1, 1 },
1156 FR30_INSN_LDR13UB, "ldr13ub", "ldub",
1157 { { MNEM, ' ', '@', '(', OP (R13), ',', OP (RJ), ')', ',', OP (RI), 0 } },
1158 { 16, 16, 0xff00 }, 0x200,
1159 (PTR) 0,
1160 { 0, 0, { 0 } }
1161 },
1162 /* ld @($r14,$disp10),$Ri */
1163 {
1164 { 1, 1, 1, 1 },
1165 FR30_INSN_LDR14, "ldr14", "ld",
1166 { { MNEM, ' ', '@', '(', OP (R14), ',', OP (DISP10), ')', ',', OP (RI), 0 } },
1167 { 16, 16, 0xf000 }, 0x2000,
1168 (PTR) 0,
1169 { 0, 0, { 0 } }
1170 },
1171 /* lduh @($r14,$disp9),$Ri */
1172 {
1173 { 1, 1, 1, 1 },
1174 FR30_INSN_LDR14UH, "ldr14uh", "lduh",
1175 { { MNEM, ' ', '@', '(', OP (R14), ',', OP (DISP9), ')', ',', OP (RI), 0 } },
1176 { 16, 16, 0xf000 }, 0x4000,
1177 (PTR) 0,
1178 { 0, 0, { 0 } }
1179 },
1180 /* ldub @($r14,$disp8),$Ri */
1181 {
1182 { 1, 1, 1, 1 },
1183 FR30_INSN_LDR14UB, "ldr14ub", "ldub",
1184 { { MNEM, ' ', '@', '(', OP (R14), ',', OP (DISP8), ')', ',', OP (RI), 0 } },
1185 { 16, 16, 0xf000 }, 0x6000,
1186 (PTR) 0,
1187 { 0, 0, { 0 } }
1188 },
1189 /* ld @($r15,$udisp6),$Ri */
1190 {
1191 { 1, 1, 1, 1 },
1192 FR30_INSN_LDR15, "ldr15", "ld",
1193 { { MNEM, ' ', '@', '(', OP (R15), ',', OP (UDISP6), ')', ',', OP (RI), 0 } },
1194 { 16, 16, 0xff00 }, 0x300,
1195 (PTR) 0,
1196 { 0, 0, { 0 } }
1197 },
1198 /* ld @$r15+,$Ri */
1199 {
1200 { 1, 1, 1, 1 },
1201 FR30_INSN_LDR15GR, "ldr15gr", "ld",
1202 { { MNEM, ' ', '@', OP (R15), '+', ',', OP (RI), 0 } },
1203 { 16, 16, 0xfff0 }, 0x700,
1204 (PTR) 0,
1205 { 0, 0, { 0 } }
1206 },
1207 /* ld @$r15+,$Rs2 */
1208 {
1209 { 1, 1, 1, 1 },
1210 FR30_INSN_LDR15DR, "ldr15dr", "ld",
1211 { { MNEM, ' ', '@', OP (R15), '+', ',', OP (RS2), 0 } },
1212 { 16, 16, 0xfff0 }, 0x780,
1213 (PTR) 0,
1214 { 0, 0, { 0 } }
1215 },
1216 /* ld @$r15+,$ps */
1217 {
1218 { 1, 1, 1, 1 },
1219 FR30_INSN_LDR15PS, "ldr15ps", "ld",
1220 { { MNEM, ' ', '@', OP (R15), '+', ',', OP (PS), 0 } },
1221 { 16, 16, 0xffff }, 0x790,
1222 (PTR) 0,
1223 { 0, 0, { 0 } }
1224 },
1225 /* st $Ri,@$Rj */
1226 {
1227 { 1, 1, 1, 1 },
1228 FR30_INSN_ST, "st", "st",
1229 { { MNEM, ' ', OP (RI), ',', '@', OP (RJ), 0 } },
1230 { 16, 16, 0xff00 }, 0x1400,
1231 (PTR) 0,
1232 { 0, 0, { 0 } }
1233 },
1234 /* sth $Ri,@$Rj */
1235 {
1236 { 1, 1, 1, 1 },
1237 FR30_INSN_STH, "sth", "sth",
1238 { { MNEM, ' ', OP (RI), ',', '@', OP (RJ), 0 } },
1239 { 16, 16, 0xff00 }, 0x1500,
1240 (PTR) 0,
1241 { 0, 0, { 0 } }
1242 },
1243 /* stb $Ri,@$Rj */
1244 {
1245 { 1, 1, 1, 1 },
1246 FR30_INSN_STB, "stb", "stb",
1247 { { MNEM, ' ', OP (RI), ',', '@', OP (RJ), 0 } },
1248 { 16, 16, 0xff00 }, 0x1600,
1249 (PTR) 0,
1250 { 0, 0, { 0 } }
1251 },
1252 /* st $Ri,@($r13,$Rj) */
1253 {
1254 { 1, 1, 1, 1 },
1255 FR30_INSN_STR13, "str13", "st",
1256 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R13), ',', OP (RJ), ')', 0 } },
1257 { 16, 16, 0xff00 }, 0x1000,
1258 (PTR) 0,
1259 { 0, 0, { 0 } }
1260 },
1261 /* sth $Ri,@($r13,$Rj) */
1262 {
1263 { 1, 1, 1, 1 },
1264 FR30_INSN_STR13H, "str13h", "sth",
1265 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R13), ',', OP (RJ), ')', 0 } },
1266 { 16, 16, 0xff00 }, 0x1100,
1267 (PTR) 0,
1268 { 0, 0, { 0 } }
1269 },
1270 /* stb $Ri,@($r13,$Rj) */
1271 {
1272 { 1, 1, 1, 1 },
1273 FR30_INSN_STR13B, "stR13b", "stb",
1274 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R13), ',', OP (RJ), ')', 0 } },
1275 { 16, 16, 0xff00 }, 0x1200,
1276 (PTR) 0,
1277 { 0, 0, { 0 } }
1278 },
1279 /* st $Ri,@($r14,$disp10) */
1280 {
1281 { 1, 1, 1, 1 },
1282 FR30_INSN_STR14, "str14", "st",
1283 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R14), ',', OP (DISP10), ')', 0 } },
1284 { 16, 16, 0xf000 }, 0x3000,
1285 (PTR) 0,
1286 { 0, 0, { 0 } }
1287 },
1288 /* sth $Ri,@($r14,$disp9) */
1289 {
1290 { 1, 1, 1, 1 },
1291 FR30_INSN_STR14H, "str14h", "sth",
1292 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R14), ',', OP (DISP9), ')', 0 } },
1293 { 16, 16, 0xf000 }, 0x5000,
1294 (PTR) 0,
1295 { 0, 0, { 0 } }
1296 },
1297 /* stb $Ri,@($r14,$disp8) */
1298 {
1299 { 1, 1, 1, 1 },
1300 FR30_INSN_STR14B, "str14b", "stb",
1301 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R14), ',', OP (DISP8), ')', 0 } },
1302 { 16, 16, 0xf000 }, 0x7000,
1303 (PTR) 0,
1304 { 0, 0, { 0 } }
1305 },
1306 /* st $Ri,@($r15,$udisp6) */
1307 {
1308 { 1, 1, 1, 1 },
1309 FR30_INSN_STR15, "str15", "st",
1310 { { MNEM, ' ', OP (RI), ',', '@', '(', OP (R15), ',', OP (UDISP6), ')', 0 } },
1311 { 16, 16, 0xff00 }, 0x1300,
1312 (PTR) 0,
1313 { 0, 0, { 0 } }
1314 },
1315 /* st $Ri,@-$r15 */
1316 {
1317 { 1, 1, 1, 1 },
1318 FR30_INSN_STR15GR, "str15gr", "st",
1319 { { MNEM, ' ', OP (RI), ',', '@', '-', OP (R15), 0 } },
1320 { 16, 16, 0xfff0 }, 0x1700,
1321 (PTR) 0,
1322 { 0, 0, { 0 } }
1323 },
1324 /* st $Rs2,@-$r15 */
1325 {
1326 { 1, 1, 1, 1 },
1327 FR30_INSN_STR15DR, "str15dr", "st",
1328 { { MNEM, ' ', OP (RS2), ',', '@', '-', OP (R15), 0 } },
1329 { 16, 16, 0xfff0 }, 0x1780,
1330 (PTR) 0,
1331 { 0, 0, { 0 } }
1332 },
1333 /* st $ps,@-$r15 */
1334 {
1335 { 1, 1, 1, 1 },
1336 FR30_INSN_STR15PS, "str15ps", "st",
1337 { { MNEM, ' ', OP (PS), ',', '@', '-', OP (R15), 0 } },
1338 { 16, 16, 0xffff }, 0x1790,
1339 (PTR) 0,
1340 { 0, 0, { 0 } }
1341 },
1342 /* mov $Rj,$Ri */
1343 {
1344 { 1, 1, 1, 1 },
1345 FR30_INSN_MOV, "mov", "mov",
1346 { { MNEM, ' ', OP (RJ), ',', OP (RI), 0 } },
1347 { 16, 16, 0xff00 }, 0x8b00,
1348 (PTR) 0,
1349 { 0, 0, { 0 } }
1350 },
1351 /* mov $Rs1,$Ri */
1352 {
1353 { 1, 1, 1, 1 },
1354 FR30_INSN_MOVDR, "movdr", "mov",
1355 { { MNEM, ' ', OP (RS1), ',', OP (RI), 0 } },
1356 { 16, 16, 0xff00 }, 0xb700,
1357 (PTR) 0,
1358 { 0, 0, { 0 } }
1359 },
1360 /* mov $ps,$Ri */
1361 {
1362 { 1, 1, 1, 1 },
1363 FR30_INSN_MOVPS, "movps", "mov",
1364 { { MNEM, ' ', OP (PS), ',', OP (RI), 0 } },
1365 { 16, 16, 0xfff0 }, 0x1710,
1366 (PTR) 0,
1367 { 0, 0, { 0 } }
1368 },
1369 /* mov $Ri,$Rs1 */
1370 {
1371 { 1, 1, 1, 1 },
1372 FR30_INSN_MOV2DR, "mov2dr", "mov",
1373 { { MNEM, ' ', OP (RI), ',', OP (RS1), 0 } },
1374 { 16, 16, 0xff00 }, 0xb300,
1375 (PTR) 0,
1376 { 0, 0, { 0 } }
1377 },
1378 /* mov $Ri,$ps */
1379 {
1380 { 1, 1, 1, 1 },
1381 FR30_INSN_MOV2PS, "mov2ps", "mov",
1382 { { MNEM, ' ', OP (RI), ',', OP (PS), 0 } },
1383 { 16, 16, 0xfff0 }, 0x710,
1384 (PTR) 0,
1385 { 0, 0, { 0 } }
1386 },
1387 /* jmp @$Ri */
1388 {
1389 { 1, 1, 1, 1 },
1390 FR30_INSN_JMP, "jmp", "jmp",
1391 { { MNEM, ' ', '@', OP (RI), 0 } },
1392 { 16, 16, 0xfff0 }, 0x9700,
1393 (PTR) 0,
1394 { 0, 0, { 0 } }
1395 },
1396 /* jmp:D @$Ri */
1397 {
1398 { 1, 1, 1, 1 },
1399 FR30_INSN_JMPD, "jmpd", "jmp:D",
1400 { { MNEM, ' ', '@', OP (RI), 0 } },
1401 { 16, 16, 0xfff0 }, 0x9f00,
1402 (PTR) 0,
1403 { 0, 0, { 0 } }
1404 },
1405 /* call $label12 */
1406 {
1407 { 1, 1, 1, 1 },
1408 FR30_INSN_CALL, "call", "call",
1409 { { MNEM, ' ', OP (LABEL12), 0 } },
1410 { 16, 16, 0xf400 }, 0xd000,
1411 (PTR) 0,
1412 { 0, 0, { 0 } }
1413 },
1414 /* call:D $label12 */
1415 {
1416 { 1, 1, 1, 1 },
1417 FR30_INSN_CALLD, "calld", "call:D",
1418 { { MNEM, ' ', OP (LABEL12), 0 } },
1419 { 16, 16, 0xf400 }, 0xd400,
1420 (PTR) 0,
1421 { 0, 0, { 0 } }
1422 },
1423 /* call @$Ri */
1424 {
1425 { 1, 1, 1, 1 },
1426 FR30_INSN_CALLR, "callr", "call",
1427 { { MNEM, ' ', '@', OP (RI), 0 } },
1428 { 16, 16, 0xfff0 }, 0x9710,
1429 (PTR) 0,
1430 { 0, 0, { 0 } }
1431 },
1432 /* call:D @$Ri */
1433 {
1434 { 1, 1, 1, 1 },
1435 FR30_INSN_CALLRD, "callrd", "call:D",
1436 { { MNEM, ' ', '@', OP (RI), 0 } },
1437 { 16, 16, 0xfff0 }, 0x9f10,
1438 (PTR) 0,
1439 { 0, 0, { 0 } }
1440 },
1441 /* ret */
1442 {
1443 { 1, 1, 1, 1 },
1444 FR30_INSN_RET, "ret", "ret",
1445 { { MNEM, 0 } },
1446 { 16, 16, 0xffff }, 0x9720,
1447 (PTR) 0,
1448 { 0, 0, { 0 } }
1449 },
1450 /* ret:D */
1451 {
1452 { 1, 1, 1, 1 },
1453 FR30_INSN_RETD, "retd", "ret:D",
1454 { { MNEM, 0 } },
1455 { 16, 16, 0xffff }, 0x9f20,
1456 (PTR) 0,
1457 { 0, 0, { 0 } }
1458 },
1459 /* int $u8 */
1460 {
1461 { 1, 1, 1, 1 },
1462 FR30_INSN_INT, "int", "int",
1463 { { MNEM, ' ', OP (U8), 0 } },
1464 { 16, 16, 0xff00 }, 0x1f00,
1465 (PTR) 0,
1466 { 0, 0, { 0 } }
1467 },
1468 /* inte */
1469 {
1470 { 1, 1, 1, 1 },
1471 FR30_INSN_INTE, "inte", "inte",
1472 { { MNEM, 0 } },
1473 { 16, 16, 0xffff }, 0x9f30,
1474 (PTR) 0,
1475 { 0, 0, { 0 } }
1476 },
1477 /* reti */
1478 {
1479 { 1, 1, 1, 1 },
1480 FR30_INSN_RETI, "reti", "reti",
1481 { { MNEM, 0 } },
1482 { 16, 16, 0xffff }, 0x9730,
1483 (PTR) 0,
1484 { 0, 0, { 0 } }
1485 },
1486 /* bra $label9 */
1487 {
1488 { 1, 1, 1, 1 },
1489 FR30_INSN_BRA, "bra", "bra",
1490 { { MNEM, ' ', OP (LABEL9), 0 } },
1491 { 16, 16, 0xff00 }, 0xe000,
1492 (PTR) 0,
1493 { 0, 0, { 0 } }
1494 },
1495 /* bno $label9 */
1496 {
1497 { 1, 1, 1, 1 },
1498 FR30_INSN_BNO, "bno", "bno",
1499 { { MNEM, ' ', OP (LABEL9), 0 } },
1500 { 16, 16, 0xff00 }, 0xe100,
1501 (PTR) 0,
1502 { 0, 0, { 0 } }
1503 },
1504 /* beq $label9 */
1505 {
1506 { 1, 1, 1, 1 },
1507 FR30_INSN_BEQ, "beq", "beq",
1508 { { MNEM, ' ', OP (LABEL9), 0 } },
1509 { 16, 16, 0xff00 }, 0xe200,
1510 (PTR) 0,
1511 { 0, 0, { 0 } }
1512 },
1513 /* bne $label9 */
1514 {
1515 { 1, 1, 1, 1 },
1516 FR30_INSN_BNE, "bne", "bne",
1517 { { MNEM, ' ', OP (LABEL9), 0 } },
1518 { 16, 16, 0xff00 }, 0xe300,
1519 (PTR) 0,
1520 { 0, 0, { 0 } }
1521 },
1522 /* bc $label9 */
1523 {
1524 { 1, 1, 1, 1 },
1525 FR30_INSN_BC, "bc", "bc",
1526 { { MNEM, ' ', OP (LABEL9), 0 } },
1527 { 16, 16, 0xff00 }, 0xe400,
1528 (PTR) 0,
1529 { 0, 0, { 0 } }
1530 },
1531 /* bnc $label9 */
1532 {
1533 { 1, 1, 1, 1 },
1534 FR30_INSN_BNC, "bnc", "bnc",
1535 { { MNEM, ' ', OP (LABEL9), 0 } },
1536 { 16, 16, 0xff00 }, 0xe500,
1537 (PTR) 0,
1538 { 0, 0, { 0 } }
1539 },
1540 /* bn $label9 */
1541 {
1542 { 1, 1, 1, 1 },
1543 FR30_INSN_BN, "bn", "bn",
1544 { { MNEM, ' ', OP (LABEL9), 0 } },
1545 { 16, 16, 0xff00 }, 0xe600,
1546 (PTR) 0,
1547 { 0, 0, { 0 } }
1548 },
1549 /* bp $label9 */
1550 {
1551 { 1, 1, 1, 1 },
1552 FR30_INSN_BP, "bp", "bp",
1553 { { MNEM, ' ', OP (LABEL9), 0 } },
1554 { 16, 16, 0xff00 }, 0xe700,
1555 (PTR) 0,
1556 { 0, 0, { 0 } }
1557 },
1558 /* bv $label9 */
1559 {
1560 { 1, 1, 1, 1 },
1561 FR30_INSN_BV, "bv", "bv",
1562 { { MNEM, ' ', OP (LABEL9), 0 } },
1563 { 16, 16, 0xff00 }, 0xe800,
1564 (PTR) 0,
1565 { 0, 0, { 0 } }
1566 },
1567 /* bnv $label9 */
1568 {
1569 { 1, 1, 1, 1 },
1570 FR30_INSN_BNV, "bnv", "bnv",
1571 { { MNEM, ' ', OP (LABEL9), 0 } },
1572 { 16, 16, 0xff00 }, 0xe900,
1573 (PTR) 0,
1574 { 0, 0, { 0 } }
1575 },
1576 /* blt $label9 */
1577 {
1578 { 1, 1, 1, 1 },
1579 FR30_INSN_BLT, "blt", "blt",
1580 { { MNEM, ' ', OP (LABEL9), 0 } },
1581 { 16, 16, 0xff00 }, 0xea00,
1582 (PTR) 0,
1583 { 0, 0, { 0 } }
1584 },
1585 /* bge $label9 */
1586 {
1587 { 1, 1, 1, 1 },
1588 FR30_INSN_BGE, "bge", "bge",
1589 { { MNEM, ' ', OP (LABEL9), 0 } },
1590 { 16, 16, 0xff00 }, 0xeb00,
1591 (PTR) 0,
1592 { 0, 0, { 0 } }
1593 },
1594 /* ble $label9 */
1595 {
1596 { 1, 1, 1, 1 },
1597 FR30_INSN_BLE, "ble", "ble",
1598 { { MNEM, ' ', OP (LABEL9), 0 } },
1599 { 16, 16, 0xff00 }, 0xec00,
1600 (PTR) 0,
1601 { 0, 0, { 0 } }
1602 },
1603 /* bgt $label9 */
1604 {
1605 { 1, 1, 1, 1 },
1606 FR30_INSN_BGT, "bgt", "bgt",
1607 { { MNEM, ' ', OP (LABEL9), 0 } },
1608 { 16, 16, 0xff00 }, 0xed00,
1609 (PTR) 0,
1610 { 0, 0, { 0 } }
1611 },
1612 /* bls $label9 */
1613 {
1614 { 1, 1, 1, 1 },
1615 FR30_INSN_BLS, "bls", "bls",
1616 { { MNEM, ' ', OP (LABEL9), 0 } },
1617 { 16, 16, 0xff00 }, 0xee00,
1618 (PTR) 0,
1619 { 0, 0, { 0 } }
1620 },
1621 /* bhi $label9 */
1622 {
1623 { 1, 1, 1, 1 },
1624 FR30_INSN_BHI, "bhi", "bhi",
1625 { { MNEM, ' ', OP (LABEL9), 0 } },
1626 { 16, 16, 0xff00 }, 0xef00,
1627 (PTR) 0,
1628 { 0, 0, { 0 } }
1629 },
1630 /* bra:D $label9 */
1631 {
1632 { 1, 1, 1, 1 },
1633 FR30_INSN_BRAD, "brad", "bra:D",
1634 { { MNEM, ' ', OP (LABEL9), 0 } },
1635 { 16, 16, 0xff00 }, 0xf000,
1636 (PTR) 0,
1637 { 0, 0, { 0 } }
1638 },
1639 /* bno:D $label9 */
1640 {
1641 { 1, 1, 1, 1 },
1642 FR30_INSN_BNOD, "bnod", "bno:D",
1643 { { MNEM, ' ', OP (LABEL9), 0 } },
1644 { 16, 16, 0xff00 }, 0xf100,
1645 (PTR) 0,
1646 { 0, 0, { 0 } }
1647 },
1648 /* beq:D $label9 */
1649 {
1650 { 1, 1, 1, 1 },
1651 FR30_INSN_BEQD, "beqd", "beq:D",
1652 { { MNEM, ' ', OP (LABEL9), 0 } },
1653 { 16, 16, 0xff00 }, 0xf200,
1654 (PTR) 0,
1655 { 0, 0, { 0 } }
1656 },
1657 /* bne:D $label9 */
1658 {
1659 { 1, 1, 1, 1 },
1660 FR30_INSN_BNED, "bned", "bne:D",
1661 { { MNEM, ' ', OP (LABEL9), 0 } },
1662 { 16, 16, 0xff00 }, 0xf300,
1663 (PTR) 0,
1664 { 0, 0, { 0 } }
1665 },
1666 /* bc:D $label9 */
1667 {
1668 { 1, 1, 1, 1 },
1669 FR30_INSN_BCD, "bcd", "bc:D",
1670 { { MNEM, ' ', OP (LABEL9), 0 } },
1671 { 16, 16, 0xff00 }, 0xf400,
1672 (PTR) 0,
1673 { 0, 0, { 0 } }
1674 },
1675 /* bnc:D $label9 */
1676 {
1677 { 1, 1, 1, 1 },
1678 FR30_INSN_BNCD, "bncd", "bnc:D",
1679 { { MNEM, ' ', OP (LABEL9), 0 } },
1680 { 16, 16, 0xff00 }, 0xf500,
1681 (PTR) 0,
1682 { 0, 0, { 0 } }
1683 },
1684 /* bn:D $label9 */
1685 {
1686 { 1, 1, 1, 1 },
1687 FR30_INSN_BND, "bnd", "bn:D",
1688 { { MNEM, ' ', OP (LABEL9), 0 } },
1689 { 16, 16, 0xff00 }, 0xf600,
1690 (PTR) 0,
1691 { 0, 0, { 0 } }
1692 },
1693 /* bp:D $label9 */
1694 {
1695 { 1, 1, 1, 1 },
1696 FR30_INSN_BPD, "bpd", "bp:D",
1697 { { MNEM, ' ', OP (LABEL9), 0 } },
1698 { 16, 16, 0xff00 }, 0xf700,
1699 (PTR) 0,
1700 { 0, 0, { 0 } }
1701 },
1702 /* bv:D $label9 */
1703 {
1704 { 1, 1, 1, 1 },
1705 FR30_INSN_BVD, "bvd", "bv:D",
1706 { { MNEM, ' ', OP (LABEL9), 0 } },
1707 { 16, 16, 0xff00 }, 0xf800,
1708 (PTR) 0,
1709 { 0, 0, { 0 } }
1710 },
1711 /* bnv:D $label9 */
1712 {
1713 { 1, 1, 1, 1 },
1714 FR30_INSN_BNVD, "bnvd", "bnv:D",
1715 { { MNEM, ' ', OP (LABEL9), 0 } },
1716 { 16, 16, 0xff00 }, 0xf900,
1717 (PTR) 0,
1718 { 0, 0, { 0 } }
1719 },
1720 /* blt:D $label9 */
1721 {
1722 { 1, 1, 1, 1 },
1723 FR30_INSN_BLTD, "bltd", "blt:D",
1724 { { MNEM, ' ', OP (LABEL9), 0 } },
1725 { 16, 16, 0xff00 }, 0xfa00,
1726 (PTR) 0,
1727 { 0, 0, { 0 } }
1728 },
1729 /* bge:D $label9 */
1730 {
1731 { 1, 1, 1, 1 },
1732 FR30_INSN_BGED, "bged", "bge:D",
1733 { { MNEM, ' ', OP (LABEL9), 0 } },
1734 { 16, 16, 0xff00 }, 0xfb00,
1735 (PTR) 0,
1736 { 0, 0, { 0 } }
1737 },
1738 /* ble:D $label9 */
1739 {
1740 { 1, 1, 1, 1 },
1741 FR30_INSN_BLED, "bled", "ble:D",
1742 { { MNEM, ' ', OP (LABEL9), 0 } },
1743 { 16, 16, 0xff00 }, 0xfc00,
1744 (PTR) 0,
1745 { 0, 0, { 0 } }
1746 },
1747 /* bgt:D $label9 */
1748 {
1749 { 1, 1, 1, 1 },
1750 FR30_INSN_BGTD, "bgtd", "bgt:D",
1751 { { MNEM, ' ', OP (LABEL9), 0 } },
1752 { 16, 16, 0xff00 }, 0xfd00,
1753 (PTR) 0,
1754 { 0, 0, { 0 } }
1755 },
1756 /* bls:D $label9 */
1757 {
1758 { 1, 1, 1, 1 },
1759 FR30_INSN_BLSD, "blsd", "bls:D",
1760 { { MNEM, ' ', OP (LABEL9), 0 } },
1761 { 16, 16, 0xff00 }, 0xfe00,
1762 (PTR) 0,
1763 { 0, 0, { 0 } }
1764 },
1765 /* bhi:D $label9 */
1766 {
1767 { 1, 1, 1, 1 },
1768 FR30_INSN_BHID, "bhid", "bhi:D",
1769 { { MNEM, ' ', OP (LABEL9), 0 } },
1770 { 16, 16, 0xff00 }, 0xff00,
1771 (PTR) 0,
1772 { 0, 0, { 0 } }
1773 },
1774 /* dmov @$dir10,$R13 */
1775 {
1776 { 1, 1, 1, 1 },
1777 FR30_INSN_DMOV2R13, "dmov2r13", "dmov",
1778 { { MNEM, ' ', '@', OP (DIR10), ',', OP (R13), 0 } },
1779 { 16, 16, 0xff00 }, 0x800,
1780 (PTR) 0,
1781 { 0, 0, { 0 } }
1782 },
1783 /* dmovh @$dir9,$R13 */
1784 {
1785 { 1, 1, 1, 1 },
1786 FR30_INSN_DMOV2R13H, "dmov2r13h", "dmovh",
1787 { { MNEM, ' ', '@', OP (DIR9), ',', OP (R13), 0 } },
1788 { 16, 16, 0xff00 }, 0x900,
1789 (PTR) 0,
1790 { 0, 0, { 0 } }
1791 },
1792 /* dmovb @$dir8,$R13 */
1793 {
1794 { 1, 1, 1, 1 },
1795 FR30_INSN_DMOV2R13B, "dmov2r13b", "dmovb",
1796 { { MNEM, ' ', '@', OP (DIR8), ',', OP (R13), 0 } },
1797 { 16, 16, 0xff00 }, 0xa00,
1798 (PTR) 0,
1799 { 0, 0, { 0 } }
1800 },
1801 /* dmov $R13,@$dir10 */
1802 {
1803 { 1, 1, 1, 1 },
1804 FR30_INSN_DMOVR13, "dmovr13", "dmov",
1805 { { MNEM, ' ', OP (R13), ',', '@', OP (DIR10), 0 } },
1806 { 16, 16, 0xff00 }, 0x1800,
1807 (PTR) 0,
1808 { 0, 0, { 0 } }
1809 },
1810 /* dmovh $R13,@$dir9 */
1811 {
1812 { 1, 1, 1, 1 },
1813 FR30_INSN_DMOVR13H, "dmovr13h", "dmovh",
1814 { { MNEM, ' ', OP (R13), ',', '@', OP (DIR9), 0 } },
1815 { 16, 16, 0xff00 }, 0x1900,
1816 (PTR) 0,
1817 { 0, 0, { 0 } }
1818 },
1819 /* dmovb $R13,@$dir8 */
1820 {
1821 { 1, 1, 1, 1 },
1822 FR30_INSN_DMOVR13B, "dmovr13b", "dmovb",
1823 { { MNEM, ' ', OP (R13), ',', '@', OP (DIR8), 0 } },
1824 { 16, 16, 0xff00 }, 0x1a00,
1825 (PTR) 0,
1826 { 0, 0, { 0 } }
1827 },
1828 /* dmov @$dir10,@$R13+ */
1829 {
1830 { 1, 1, 1, 1 },
1831 FR30_INSN_DMOV2R13PI, "dmov2r13pi", "dmov",
1832 { { MNEM, ' ', '@', OP (DIR10), ',', '@', OP (R13), '+', 0 } },
1833 { 16, 16, 0xff00 }, 0xc00,
1834 (PTR) 0,
1835 { 0, 0, { 0 } }
1836 },
1837 /* dmovh @$dir9,@$R13+ */
1838 {
1839 { 1, 1, 1, 1 },
1840 FR30_INSN_DMOV2R13PIH, "dmov2r13pih", "dmovh",
1841 { { MNEM, ' ', '@', OP (DIR9), ',', '@', OP (R13), '+', 0 } },
1842 { 16, 16, 0xff00 }, 0xd00,
1843 (PTR) 0,
1844 { 0, 0, { 0 } }
1845 },
1846 /* dmovb @$dir8,@$R13+ */
1847 {
1848 { 1, 1, 1, 1 },
1849 FR30_INSN_DMOV2R13PIB, "dmov2r13pib", "dmovb",
1850 { { MNEM, ' ', '@', OP (DIR8), ',', '@', OP (R13), '+', 0 } },
1851 { 16, 16, 0xff00 }, 0xe00,
1852 (PTR) 0,
1853 { 0, 0, { 0 } }
1854 },
1855 /* dmov @$R13+,@$dir10 */
1856 {
1857 { 1, 1, 1, 1 },
1858 FR30_INSN_DMOVR13PI, "dmovr13pi", "dmov",
1859 { { MNEM, ' ', '@', OP (R13), '+', ',', '@', OP (DIR10), 0 } },
1860 { 16, 16, 0xff00 }, 0x1c00,
1861 (PTR) 0,
1862 { 0, 0, { 0 } }
1863 },
1864 /* dmovh @$R13+,@$dir9 */
1865 {
1866 { 1, 1, 1, 1 },
1867 FR30_INSN_DMOVR13PIH, "dmovr13pih", "dmovh",
1868 { { MNEM, ' ', '@', OP (R13), '+', ',', '@', OP (DIR9), 0 } },
1869 { 16, 16, 0xff00 }, 0x1d00,
1870 (PTR) 0,
1871 { 0, 0, { 0 } }
1872 },
1873 /* dmovb @$R13+,@$dir8 */
1874 {
1875 { 1, 1, 1, 1 },
1876 FR30_INSN_DMOVR13PIB, "dmovr13pib", "dmovb",
1877 { { MNEM, ' ', '@', OP (R13), '+', ',', '@', OP (DIR8), 0 } },
1878 { 16, 16, 0xff00 }, 0x1e00,
1879 (PTR) 0,
1880 { 0, 0, { 0 } }
1881 },
1882 /* dmov @$dir10,@-$R15 */
1883 {
1884 { 1, 1, 1, 1 },
1885 FR30_INSN_DMOV2R15PD, "dmov2r15pd", "dmov",
1886 { { MNEM, ' ', '@', OP (DIR10), ',', '@', '-', OP (R15), 0 } },
1887 { 16, 16, 0xff00 }, 0xb00,
1888 (PTR) 0,
1889 { 0, 0, { 0 } }
1890 },
1891 /* dmov @$R15+,@$dir10 */
1892 {
1893 { 1, 1, 1, 1 },
1894 FR30_INSN_DMOVR15PI, "dmovr15pi", "dmov",
1895 { { MNEM, ' ', '@', OP (R15), '+', ',', '@', OP (DIR10), 0 } },
1896 { 16, 16, 0xff00 }, 0x1b00,
1897 (PTR) 0,
1898 { 0, 0, { 0 } }
1899 },
1900 /* ldres @$Ri+,$u4 */
1901 {
1902 { 1, 1, 1, 1 },
1903 FR30_INSN_LDRES, "ldres", "ldres",
1904 { { MNEM, ' ', '@', OP (RI), '+', ',', OP (U4), 0 } },
1905 { 16, 16, 0xff00 }, 0xbc00,
1906 (PTR) 0,
1907 { 0, 0, { 0 } }
1908 },
1909 /* stres $u4,@$Ri+ */
1910 {
1911 { 1, 1, 1, 1 },
1912 FR30_INSN_STRES, "stres", "stres",
1913 { { MNEM, ' ', OP (U4), ',', '@', OP (RI), '+', 0 } },
1914 { 16, 16, 0xff00 }, 0xbd00,
1915 (PTR) 0,
1916 { 0, 0, { 0 } }
1917 },
1918 /* nop */
1919 {
1920 { 1, 1, 1, 1 },
1921 FR30_INSN_NOP, "nop", "nop",
1922 { { MNEM, 0 } },
1923 { 16, 16, 0xffff }, 0x9fa0,
1924 (PTR) 0,
1925 { 0, 0, { 0 } }
1926 },
1927 /* andccr $u8 */
1928 {
1929 { 1, 1, 1, 1 },
1930 FR30_INSN_ANDCCR, "andccr", "andccr",
1931 { { MNEM, ' ', OP (U8), 0 } },
1932 { 16, 16, 0xff00 }, 0x8300,
1933 (PTR) 0,
1934 { 0, 0, { 0 } }
1935 },
1936 /* orccr $u8 */
1937 {
1938 { 1, 1, 1, 1 },
1939 FR30_INSN_ORCCR, "orccr", "orccr",
1940 { { MNEM, ' ', OP (U8), 0 } },
1941 { 16, 16, 0xff00 }, 0x9300,
1942 (PTR) 0,
1943 { 0, 0, { 0 } }
1944 },
1945 /* stilm $u8 */
1946 {
1947 { 1, 1, 1, 1 },
1948 FR30_INSN_STILM, "stilm", "stilm",
1949 { { MNEM, ' ', OP (U8), 0 } },
1950 { 16, 16, 0xff00 }, 0x8700,
1951 (PTR) 0,
1952 { 0, 0, { 0 } }
1953 },
1954 /* addsp $s10 */
1955 {
1956 { 1, 1, 1, 1 },
1957 FR30_INSN_ADDSP, "addsp", "addsp",
1958 { { MNEM, ' ', OP (S10), 0 } },
1959 { 16, 16, 0xff00 }, 0xa300,
1960 (PTR) 0,
1961 { 0, 0, { 0 } }
1962 },
1963 /* extsb $Ri */
1964 {
1965 { 1, 1, 1, 1 },
1966 FR30_INSN_EXTSB, "extsb", "extsb",
1967 { { MNEM, ' ', OP (RI), 0 } },
1968 { 16, 16, 0xfff0 }, 0x9780,
1969 (PTR) 0,
1970 { 0, 0, { 0 } }
1971 },
1972 /* extub $Ri */
1973 {
1974 { 1, 1, 1, 1 },
1975 FR30_INSN_EXTUB, "extub", "extub",
1976 { { MNEM, ' ', OP (RI), 0 } },
1977 { 16, 16, 0xfff0 }, 0x9790,
1978 (PTR) 0,
1979 { 0, 0, { 0 } }
1980 },
1981 /* extsh $Ri */
1982 {
1983 { 1, 1, 1, 1 },
1984 FR30_INSN_EXTSH, "extsh", "extsh",
1985 { { MNEM, ' ', OP (RI), 0 } },
1986 { 16, 16, 0xfff0 }, 0x97a0,
1987 (PTR) 0,
1988 { 0, 0, { 0 } }
1989 },
1990 /* extuh $Ri */
1991 {
1992 { 1, 1, 1, 1 },
1993 FR30_INSN_EXTUH, "extuh", "extuh",
1994 { { MNEM, ' ', OP (RI), 0 } },
1995 { 16, 16, 0xfff0 }, 0x97b0,
1996 (PTR) 0,
1997 { 0, 0, { 0 } }
1998 },
1999 /* enter $u10 */
2000 {
2001 { 1, 1, 1, 1 },
2002 FR30_INSN_ENTER, "enter", "enter",
2003 { { MNEM, ' ', OP (U10), 0 } },
2004 { 16, 16, 0xff00 }, 0xf00,
2005 (PTR) 0,
2006 { 0, 0, { 0 } }
2007 },
2008 /* leave */
2009 {
2010 { 1, 1, 1, 1 },
2011 FR30_INSN_LEAVE, "leave", "leave",
2012 { { MNEM, 0 } },
2013 { 16, 16, 0xffff }, 0x9f90,
2014 (PTR) 0,
2015 { 0, 0, { 0 } }
2016 },
2017 /* xchb @$Rj,$Ri */
2018 {
2019 { 1, 1, 1, 1 },
2020 FR30_INSN_XCHB, "xchb", "xchb",
2021 { { MNEM, ' ', '@', OP (RJ), ',', OP (RI), 0 } },
2022 { 16, 16, 0xff00 }, 0x8a00,
2023 (PTR) 0,
2024 { 0, 0, { 0 } }
2025 },
2026 };
2027
2028 #undef A
2029 #undef MNEM
2030 #undef OP
2031
2032 static const CGEN_INSN_TABLE insn_table =
2033 {
2034 & fr30_cgen_insn_table_entries[0],
2035 sizeof (CGEN_INSN),
2036 MAX_INSNS,
2037 NULL
2038 };
2039
2040 /* Each non-simple macro entry points to an array of expansion possibilities. */
2041
2042 #define A(a) (1 << CONCAT2 (CGEN_INSN_,a))
2043 #define MNEM CGEN_SYNTAX_MNEMONIC /* syntax value for mnemonic */
2044 #define OP(field) CGEN_SYNTAX_MAKE_FIELD (OPERAND (field))
2045
2046 /* The macro instruction table. */
2047
2048 static const CGEN_INSN macro_insn_table_entries[] =
2049 {
2050 };
2051
2052 #undef A
2053 #undef MNEM
2054 #undef OP
2055
2056 static const CGEN_INSN_TABLE macro_insn_table =
2057 {
2058 & macro_insn_table_entries[0],
2059 sizeof (CGEN_INSN),
2060 (sizeof (macro_insn_table_entries) /
2061 sizeof (macro_insn_table_entries[0])),
2062 NULL
2063 };
2064
2065 static void
2066 init_tables ()
2067 {
2068 }
2069
2070 /* Return non-zero if INSN is to be added to the hash table.
2071 Targets are free to override CGEN_{ASM,DIS}_HASH_P in the .opc file. */
2072
2073 static int
2074 asm_hash_insn_p (insn)
2075 const CGEN_INSN * insn;
2076 {
2077 return CGEN_ASM_HASH_P (insn);
2078 }
2079
2080 static int
2081 dis_hash_insn_p (insn)
2082 const CGEN_INSN * insn;
2083 {
2084 /* If building the hash table and the NO-DIS attribute is present,
2085 ignore. */
2086 if (CGEN_INSN_ATTR (insn, CGEN_INSN_NO_DIS))
2087 return 0;
2088 return CGEN_DIS_HASH_P (insn);
2089 }
2090
2091 /* The result is the hash value of the insn.
2092 Targets are free to override CGEN_{ASM,DIS}_HASH in the .opc file. */
2093
2094 static unsigned int
2095 asm_hash_insn (mnem)
2096 const char * mnem;
2097 {
2098 return CGEN_ASM_HASH (mnem);
2099 }
2100
2101 /* BUF is a pointer to the insn's bytes in target order.
2102 VALUE is an integer of the first CGEN_BASE_INSN_BITSIZE bits,
2103 host order. */
2104
2105 static unsigned int
2106 dis_hash_insn (buf, value)
2107 const char * buf;
2108 CGEN_INSN_INT value;
2109 {
2110 return CGEN_DIS_HASH (buf, value);
2111 }
2112
2113 /* Initialize an opcode table and return a descriptor.
2114 It's much like opening a file, and must be the first function called. */
2115
2116 CGEN_OPCODE_DESC
2117 fr30_cgen_opcode_open (mach, endian)
2118 int mach;
2119 enum cgen_endian endian;
2120 {
2121 CGEN_OPCODE_TABLE * table = (CGEN_OPCODE_TABLE *) xmalloc (sizeof (CGEN_OPCODE_TABLE));
2122 static int init_p;
2123
2124 if (! init_p)
2125 {
2126 init_tables ();
2127 init_p = 1;
2128 }
2129
2130 memset (table, 0, sizeof (*table));
2131
2132 CGEN_OPCODE_MACH (table) = mach;
2133 CGEN_OPCODE_ENDIAN (table) = endian;
2134 /* FIXME: for the sparc case we can determine insn-endianness statically.
2135 The worry here is where both data and insn endian can be independently
2136 chosen, in which case this function will need another argument.
2137 Actually, will want to allow for more arguments in the future anyway. */
2138 CGEN_OPCODE_INSN_ENDIAN (table) = endian;
2139
2140 CGEN_OPCODE_HW_LIST (table) = & fr30_cgen_hw_entries[0];
2141
2142 CGEN_OPCODE_OPERAND_TABLE (table) = & fr30_cgen_operand_table[0];
2143
2144 * CGEN_OPCODE_INSN_TABLE (table) = insn_table;
2145
2146 * CGEN_OPCODE_MACRO_INSN_TABLE (table) = macro_insn_table;
2147
2148 CGEN_OPCODE_ASM_HASH_P (table) = asm_hash_insn_p;
2149 CGEN_OPCODE_ASM_HASH (table) = asm_hash_insn;
2150 CGEN_OPCODE_ASM_HASH_SIZE (table) = CGEN_ASM_HASH_SIZE;
2151
2152 CGEN_OPCODE_DIS_HASH_P (table) = dis_hash_insn_p;
2153 CGEN_OPCODE_DIS_HASH (table) = dis_hash_insn;
2154 CGEN_OPCODE_DIS_HASH_SIZE (table) = CGEN_DIS_HASH_SIZE;
2155
2156 return (CGEN_OPCODE_DESC) table;
2157 }
2158
2159 /* Close an opcode table. */
2160
2161 void
2162 fr30_cgen_opcode_close (desc)
2163 CGEN_OPCODE_DESC desc;
2164 {
2165 free (desc);
2166 }
2167
2168 /* Getting values from cgen_fields is handled by a collection of functions.
2169 They are distinguished by the type of the VALUE argument they return.
2170 TODO: floating point, inlining support, remove cases where result type
2171 not appropriate. */
2172
2173 int
2174 fr30_cgen_get_int_operand (opindex, fields)
2175 int opindex;
2176 const CGEN_FIELDS * fields;
2177 {
2178 int value;
2179
2180 switch (opindex)
2181 {
2182 case FR30_OPERAND_RI :
2183 value = fields->f_Ri;
2184 break;
2185 case FR30_OPERAND_RJ :
2186 value = fields->f_Rj;
2187 break;
2188 case FR30_OPERAND_RS1 :
2189 value = fields->f_Rs1;
2190 break;
2191 case FR30_OPERAND_RS2 :
2192 value = fields->f_Rs2;
2193 break;
2194 case FR30_OPERAND_R13 :
2195 value = fields->f_nil;
2196 break;
2197 case FR30_OPERAND_R14 :
2198 value = fields->f_nil;
2199 break;
2200 case FR30_OPERAND_R15 :
2201 value = fields->f_nil;
2202 break;
2203 case FR30_OPERAND_PS :
2204 value = fields->f_nil;
2205 break;
2206 case FR30_OPERAND_U4 :
2207 value = fields->f_u4;
2208 break;
2209 case FR30_OPERAND_M4 :
2210 value = fields->f_m4;
2211 break;
2212 case FR30_OPERAND_U8 :
2213 value = fields->f_u8;
2214 break;
2215 case FR30_OPERAND_I8 :
2216 value = fields->f_i8;
2217 break;
2218 case FR30_OPERAND_UDISP6 :
2219 value = fields->f_udisp6;
2220 break;
2221 case FR30_OPERAND_DISP8 :
2222 value = fields->f_disp8;
2223 break;
2224 case FR30_OPERAND_DISP9 :
2225 value = fields->f_disp9;
2226 break;
2227 case FR30_OPERAND_DISP10 :
2228 value = fields->f_disp10;
2229 break;
2230 case FR30_OPERAND_S10 :
2231 value = fields->f_s10;
2232 break;
2233 case FR30_OPERAND_U10 :
2234 value = fields->f_u10;
2235 break;
2236 case FR30_OPERAND_I32 :
2237 value = fields->f_i32;
2238 break;
2239 case FR30_OPERAND_DIR8 :
2240 value = fields->f_dir8;
2241 break;
2242 case FR30_OPERAND_DIR9 :
2243 value = fields->f_dir9;
2244 break;
2245 case FR30_OPERAND_DIR10 :
2246 value = fields->f_dir10;
2247 break;
2248 case FR30_OPERAND_LABEL9 :
2249 value = fields->f_rel9;
2250 break;
2251 case FR30_OPERAND_LABEL12 :
2252 value = fields->f_rel12;
2253 break;
2254 case FR30_OPERAND_CC :
2255 value = fields->f_cc;
2256 break;
2257
2258 default :
2259 /* xgettext:c-format */
2260 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
2261 opindex);
2262 abort ();
2263 }
2264
2265 return value;
2266 }
2267
2268 bfd_vma
2269 fr30_cgen_get_vma_operand (opindex, fields)
2270 int opindex;
2271 const CGEN_FIELDS * fields;
2272 {
2273 bfd_vma value;
2274
2275 switch (opindex)
2276 {
2277 case FR30_OPERAND_RI :
2278 value = fields->f_Ri;
2279 break;
2280 case FR30_OPERAND_RJ :
2281 value = fields->f_Rj;
2282 break;
2283 case FR30_OPERAND_RS1 :
2284 value = fields->f_Rs1;
2285 break;
2286 case FR30_OPERAND_RS2 :
2287 value = fields->f_Rs2;
2288 break;
2289 case FR30_OPERAND_R13 :
2290 value = fields->f_nil;
2291 break;
2292 case FR30_OPERAND_R14 :
2293 value = fields->f_nil;
2294 break;
2295 case FR30_OPERAND_R15 :
2296 value = fields->f_nil;
2297 break;
2298 case FR30_OPERAND_PS :
2299 value = fields->f_nil;
2300 break;
2301 case FR30_OPERAND_U4 :
2302 value = fields->f_u4;
2303 break;
2304 case FR30_OPERAND_M4 :
2305 value = fields->f_m4;
2306 break;
2307 case FR30_OPERAND_U8 :
2308 value = fields->f_u8;
2309 break;
2310 case FR30_OPERAND_I8 :
2311 value = fields->f_i8;
2312 break;
2313 case FR30_OPERAND_UDISP6 :
2314 value = fields->f_udisp6;
2315 break;
2316 case FR30_OPERAND_DISP8 :
2317 value = fields->f_disp8;
2318 break;
2319 case FR30_OPERAND_DISP9 :
2320 value = fields->f_disp9;
2321 break;
2322 case FR30_OPERAND_DISP10 :
2323 value = fields->f_disp10;
2324 break;
2325 case FR30_OPERAND_S10 :
2326 value = fields->f_s10;
2327 break;
2328 case FR30_OPERAND_U10 :
2329 value = fields->f_u10;
2330 break;
2331 case FR30_OPERAND_I32 :
2332 value = fields->f_i32;
2333 break;
2334 case FR30_OPERAND_DIR8 :
2335 value = fields->f_dir8;
2336 break;
2337 case FR30_OPERAND_DIR9 :
2338 value = fields->f_dir9;
2339 break;
2340 case FR30_OPERAND_DIR10 :
2341 value = fields->f_dir10;
2342 break;
2343 case FR30_OPERAND_LABEL9 :
2344 value = fields->f_rel9;
2345 break;
2346 case FR30_OPERAND_LABEL12 :
2347 value = fields->f_rel12;
2348 break;
2349 case FR30_OPERAND_CC :
2350 value = fields->f_cc;
2351 break;
2352
2353 default :
2354 /* xgettext:c-format */
2355 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
2356 opindex);
2357 abort ();
2358 }
2359
2360 return value;
2361 }
2362
2363 /* Stuffing values in cgen_fields is handled by a collection of functions.
2364 They are distinguished by the type of the VALUE argument they accept.
2365 TODO: floating point, inlining support, remove cases where argument type
2366 not appropriate. */
2367
2368 void
2369 fr30_cgen_set_int_operand (opindex, fields, value)
2370 int opindex;
2371 CGEN_FIELDS * fields;
2372 int value;
2373 {
2374 switch (opindex)
2375 {
2376 case FR30_OPERAND_RI :
2377 fields->f_Ri = value;
2378 break;
2379 case FR30_OPERAND_RJ :
2380 fields->f_Rj = value;
2381 break;
2382 case FR30_OPERAND_RS1 :
2383 fields->f_Rs1 = value;
2384 break;
2385 case FR30_OPERAND_RS2 :
2386 fields->f_Rs2 = value;
2387 break;
2388 case FR30_OPERAND_R13 :
2389 fields->f_nil = value;
2390 break;
2391 case FR30_OPERAND_R14 :
2392 fields->f_nil = value;
2393 break;
2394 case FR30_OPERAND_R15 :
2395 fields->f_nil = value;
2396 break;
2397 case FR30_OPERAND_PS :
2398 fields->f_nil = value;
2399 break;
2400 case FR30_OPERAND_U4 :
2401 fields->f_u4 = value;
2402 break;
2403 case FR30_OPERAND_M4 :
2404 fields->f_m4 = value;
2405 break;
2406 case FR30_OPERAND_U8 :
2407 fields->f_u8 = value;
2408 break;
2409 case FR30_OPERAND_I8 :
2410 fields->f_i8 = value;
2411 break;
2412 case FR30_OPERAND_UDISP6 :
2413 fields->f_udisp6 = value;
2414 break;
2415 case FR30_OPERAND_DISP8 :
2416 fields->f_disp8 = value;
2417 break;
2418 case FR30_OPERAND_DISP9 :
2419 fields->f_disp9 = value;
2420 break;
2421 case FR30_OPERAND_DISP10 :
2422 fields->f_disp10 = value;
2423 break;
2424 case FR30_OPERAND_S10 :
2425 fields->f_s10 = value;
2426 break;
2427 case FR30_OPERAND_U10 :
2428 fields->f_u10 = value;
2429 break;
2430 case FR30_OPERAND_I32 :
2431 fields->f_i32 = value;
2432 break;
2433 case FR30_OPERAND_DIR8 :
2434 fields->f_dir8 = value;
2435 break;
2436 case FR30_OPERAND_DIR9 :
2437 fields->f_dir9 = value;
2438 break;
2439 case FR30_OPERAND_DIR10 :
2440 fields->f_dir10 = value;
2441 break;
2442 case FR30_OPERAND_LABEL9 :
2443 fields->f_rel9 = value;
2444 break;
2445 case FR30_OPERAND_LABEL12 :
2446 fields->f_rel12 = value;
2447 break;
2448 case FR30_OPERAND_CC :
2449 fields->f_cc = value;
2450 break;
2451
2452 default :
2453 /* xgettext:c-format */
2454 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
2455 opindex);
2456 abort ();
2457 }
2458 }
2459
2460 void
2461 fr30_cgen_set_vma_operand (opindex, fields, value)
2462 int opindex;
2463 CGEN_FIELDS * fields;
2464 bfd_vma value;
2465 {
2466 switch (opindex)
2467 {
2468 case FR30_OPERAND_RI :
2469 fields->f_Ri = value;
2470 break;
2471 case FR30_OPERAND_RJ :
2472 fields->f_Rj = value;
2473 break;
2474 case FR30_OPERAND_RS1 :
2475 fields->f_Rs1 = value;
2476 break;
2477 case FR30_OPERAND_RS2 :
2478 fields->f_Rs2 = value;
2479 break;
2480 case FR30_OPERAND_R13 :
2481 fields->f_nil = value;
2482 break;
2483 case FR30_OPERAND_R14 :
2484 fields->f_nil = value;
2485 break;
2486 case FR30_OPERAND_R15 :
2487 fields->f_nil = value;
2488 break;
2489 case FR30_OPERAND_PS :
2490 fields->f_nil = value;
2491 break;
2492 case FR30_OPERAND_U4 :
2493 fields->f_u4 = value;
2494 break;
2495 case FR30_OPERAND_M4 :
2496 fields->f_m4 = value;
2497 break;
2498 case FR30_OPERAND_U8 :
2499 fields->f_u8 = value;
2500 break;
2501 case FR30_OPERAND_I8 :
2502 fields->f_i8 = value;
2503 break;
2504 case FR30_OPERAND_UDISP6 :
2505 fields->f_udisp6 = value;
2506 break;
2507 case FR30_OPERAND_DISP8 :
2508 fields->f_disp8 = value;
2509 break;
2510 case FR30_OPERAND_DISP9 :
2511 fields->f_disp9 = value;
2512 break;
2513 case FR30_OPERAND_DISP10 :
2514 fields->f_disp10 = value;
2515 break;
2516 case FR30_OPERAND_S10 :
2517 fields->f_s10 = value;
2518 break;
2519 case FR30_OPERAND_U10 :
2520 fields->f_u10 = value;
2521 break;
2522 case FR30_OPERAND_I32 :
2523 fields->f_i32 = value;
2524 break;
2525 case FR30_OPERAND_DIR8 :
2526 fields->f_dir8 = value;
2527 break;
2528 case FR30_OPERAND_DIR9 :
2529 fields->f_dir9 = value;
2530 break;
2531 case FR30_OPERAND_DIR10 :
2532 fields->f_dir10 = value;
2533 break;
2534 case FR30_OPERAND_LABEL9 :
2535 fields->f_rel9 = value;
2536 break;
2537 case FR30_OPERAND_LABEL12 :
2538 fields->f_rel12 = value;
2539 break;
2540 case FR30_OPERAND_CC :
2541 fields->f_cc = value;
2542 break;
2543
2544 default :
2545 /* xgettext:c-format */
2546 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
2547 opindex);
2548 abort ();
2549 }
2550 }
2551
This page took 0.087848 seconds and 5 git commands to generate.