1 /* Disassembler interface for targets using CGEN. -*- C -*-
2 CGEN: Cpu tools GENerator
4 THIS FILE IS USED TO GENERATE fr30-dis.c.
6 Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
8 This file is part of the GNU Binutils and GDB, the GNU debugger.
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)
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.
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. */
35 #define INLINE __inline__
40 /* Default text to print if an instruction isn't recognized. */
41 #define UNKNOWN_INSN_MSG _("*unknown*")
43 static int extract_normal
44 PARAMS ((CGEN_OPCODE_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_BYTES,
45 unsigned int, int, int, int, long *));
46 static void print_normal
47 PARAMS ((CGEN_OPCODE_DESC, PTR, long, unsigned int, bfd_vma, int));
48 static void print_address
49 PARAMS ((CGEN_OPCODE_DESC, PTR, bfd_vma, unsigned int, bfd_vma, int));
50 static void print_keyword
51 PARAMS ((CGEN_OPCODE_DESC, PTR, CGEN_KEYWORD *, long, unsigned int));
52 static int extract_insn_normal
53 PARAMS ((CGEN_OPCODE_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
54 unsigned long, CGEN_FIELDS *, bfd_vma));
55 static void print_insn_normal
56 PARAMS ((CGEN_OPCODE_DESC, PTR, const CGEN_INSN *, CGEN_FIELDS *,
58 static int print_insn PARAMS ((CGEN_OPCODE_DESC, bfd_vma,
59 disassemble_info *, char *, int));
60 static int default_print_insn
61 PARAMS ((CGEN_OPCODE_DESC, bfd_vma, disassemble_info *));
63 /* -- disassembler routines inserted here */
65 /* Main entry point for operand extraction.
67 This function is basically just a big switch statement. Earlier versions
68 used tables to look up the function to use, but
69 - if the table contains both assembler and disassembler functions then
70 the disassembler contains much of the assembler and vice-versa,
71 - there's a lot of inlining possibilities as things grow,
72 - using a switch statement avoids the function call overhead.
74 This function could be moved into `print_insn_normal', but keeping it
75 separate makes clear the interface between `print_insn_normal' and each of
80 fr30_cgen_extract_operand (od, opindex, ex_info, insn_value, fields, pc)
83 CGEN_EXTRACT_INFO *ex_info;
84 CGEN_INSN_BYTES insn_value;
92 case FR30_OPERAND_RI :
93 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_Ri);
95 case FR30_OPERAND_RJ :
96 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_Rj);
98 case FR30_OPERAND_RS1 :
99 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_Rs1);
101 case FR30_OPERAND_RS2 :
102 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 12, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_Rs2);
104 case FR30_OPERAND_R13 :
105 length = extract_normal (od, ex_info, insn_value, 0, 0, 0, CGEN_FIELDS_BITSIZE (fields), & fields->f_nil);
107 case FR30_OPERAND_R14 :
108 length = extract_normal (od, ex_info, insn_value, 0, 0, 0, CGEN_FIELDS_BITSIZE (fields), & fields->f_nil);
110 case FR30_OPERAND_R15 :
111 length = extract_normal (od, ex_info, insn_value, 0, 0, 0, CGEN_FIELDS_BITSIZE (fields), & fields->f_nil);
113 case FR30_OPERAND_PS :
114 length = extract_normal (od, ex_info, insn_value, 0, 0, 0, CGEN_FIELDS_BITSIZE (fields), & fields->f_nil);
116 case FR30_OPERAND_U4 :
117 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 8, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_u4);
119 case FR30_OPERAND_M4 :
122 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 8, 4, CGEN_FIELDS_BITSIZE (fields), & value);
123 value = ((value) | ((! (15))));
124 fields->f_m4 = value;
127 case FR30_OPERAND_U8 :
128 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & fields->f_u8);
130 case FR30_OPERAND_I8 :
131 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 4, 8, CGEN_FIELDS_BITSIZE (fields), & fields->f_i8);
133 case FR30_OPERAND_UDISP6 :
136 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 8, 4, CGEN_FIELDS_BITSIZE (fields), & value);
137 value = ((value) << (2));
138 fields->f_udisp6 = value;
141 case FR30_OPERAND_DISP8 :
142 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), 4, 8, CGEN_FIELDS_BITSIZE (fields), & fields->f_disp8);
144 case FR30_OPERAND_DISP9 :
147 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), 4, 8, CGEN_FIELDS_BITSIZE (fields), & value);
148 value = ((value) << (1));
149 fields->f_disp9 = value;
152 case FR30_OPERAND_DISP10 :
155 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), 4, 8, CGEN_FIELDS_BITSIZE (fields), & value);
156 value = ((value) << (2));
157 fields->f_disp10 = value;
160 case FR30_OPERAND_S10 :
163 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & value);
164 value = ((value) << (2));
165 fields->f_s10 = value;
168 case FR30_OPERAND_U10 :
171 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & value);
172 value = ((value) << (2));
173 fields->f_u10 = value;
176 case FR30_OPERAND_DIR8 :
177 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & fields->f_dir8);
179 case FR30_OPERAND_DIR9 :
182 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & value);
183 value = ((value) << (1));
184 fields->f_dir9 = value;
187 case FR30_OPERAND_DIR10 :
190 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & value);
191 value = ((value) << (2));
192 fields->f_dir10 = value;
195 case FR30_OPERAND_LABEL9 :
198 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_SIGNED), 8, 8, CGEN_FIELDS_BITSIZE (fields), & value);
199 value = ((((value) << (1))) + (((pc) & (-2))));
200 fields->f_rel9 = value;
203 case FR30_OPERAND_LABEL12 :
206 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_SIGNED), 5, 11, CGEN_FIELDS_BITSIZE (fields), & value);
207 value = ((((value) << (1))) + (((pc) & (-2))));
208 fields->f_rel12 = value;
211 case FR30_OPERAND_CC :
212 length = extract_normal (od, ex_info, insn_value, 0|(1<<CGEN_OPERAND_UNSIGNED), 4, 4, CGEN_FIELDS_BITSIZE (fields), & fields->f_cc);
216 /* xgettext:c-format */
217 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
225 /* Main entry point for printing operands.
227 This function is basically just a big switch statement. Earlier versions
228 used tables to look up the function to use, but
229 - if the table contains both assembler and disassembler functions then
230 the disassembler contains much of the assembler and vice-versa,
231 - there's a lot of inlining possibilities as things grow,
232 - using a switch statement avoids the function call overhead.
234 This function could be moved into `print_insn_normal', but keeping it
235 separate makes clear the interface between `print_insn_normal' and each of
240 fr30_cgen_print_operand (od, opindex, info, fields, attrs, pc, length)
243 disassemble_info * info;
244 CGEN_FIELDS * fields;
251 case FR30_OPERAND_RI :
252 print_keyword (od, info, & fr30_cgen_opval_h_gr, fields->f_Ri, 0|(1<<CGEN_OPERAND_UNSIGNED));
254 case FR30_OPERAND_RJ :
255 print_keyword (od, info, & fr30_cgen_opval_h_gr, fields->f_Rj, 0|(1<<CGEN_OPERAND_UNSIGNED));
257 case FR30_OPERAND_RS1 :
258 print_keyword (od, info, & fr30_cgen_opval_h_dr, fields->f_Rs1, 0|(1<<CGEN_OPERAND_UNSIGNED));
260 case FR30_OPERAND_RS2 :
261 print_keyword (od, info, & fr30_cgen_opval_h_dr, fields->f_Rs2, 0|(1<<CGEN_OPERAND_UNSIGNED));
263 case FR30_OPERAND_R13 :
264 print_keyword (od, info, & fr30_cgen_opval_h_r13, fields->f_nil, 0);
266 case FR30_OPERAND_R14 :
267 print_keyword (od, info, & fr30_cgen_opval_h_r14, fields->f_nil, 0);
269 case FR30_OPERAND_R15 :
270 print_keyword (od, info, & fr30_cgen_opval_h_r15, fields->f_nil, 0);
272 case FR30_OPERAND_PS :
273 print_keyword (od, info, & fr30_cgen_opval_h_ps, fields->f_nil, 0);
275 case FR30_OPERAND_U4 :
276 print_normal (od, info, fields->f_u4, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
278 case FR30_OPERAND_M4 :
279 print_normal (od, info, fields->f_m4, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
281 case FR30_OPERAND_U8 :
282 print_normal (od, info, fields->f_u8, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
284 case FR30_OPERAND_I8 :
285 print_normal (od, info, fields->f_i8, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
287 case FR30_OPERAND_UDISP6 :
288 print_normal (od, info, fields->f_udisp6, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
290 case FR30_OPERAND_DISP8 :
291 print_normal (od, info, fields->f_disp8, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), pc, length);
293 case FR30_OPERAND_DISP9 :
294 print_normal (od, info, fields->f_disp9, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), pc, length);
296 case FR30_OPERAND_DISP10 :
297 print_normal (od, info, fields->f_disp10, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), pc, length);
299 case FR30_OPERAND_S10 :
300 print_normal (od, info, fields->f_s10, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_SIGNED), pc, length);
302 case FR30_OPERAND_U10 :
303 print_normal (od, info, fields->f_u10, 0|(1<<CGEN_OPERAND_HASH_PREFIX)|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
305 case FR30_OPERAND_DIR8 :
306 print_normal (od, info, fields->f_dir8, 0|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
308 case FR30_OPERAND_DIR9 :
309 print_normal (od, info, fields->f_dir9, 0|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
311 case FR30_OPERAND_DIR10 :
312 print_normal (od, info, fields->f_dir10, 0|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
314 case FR30_OPERAND_LABEL9 :
315 print_normal (od, info, fields->f_rel9, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
317 case FR30_OPERAND_LABEL12 :
318 print_normal (od, info, fields->f_rel12, 0|(1<<CGEN_OPERAND_SIGNED), pc, length);
320 case FR30_OPERAND_CC :
321 print_normal (od, info, fields->f_cc, 0|(1<<CGEN_OPERAND_UNSIGNED), pc, length);
325 /* xgettext:c-format */
326 fprintf (stderr, _("Unrecognized field %d while printing insn.\n"),
332 cgen_extract_fn * const fr30_cgen_extract_handlers[] =
338 cgen_print_fn * const fr30_cgen_print_handlers[] =
346 fr30_cgen_init_dis (od)
352 #if ! CGEN_INT_INSN_P
354 /* Subroutine of extract_normal. */
357 extract_1 (od, ex_info, start, length, word_length, bufp)
359 CGEN_EXTRACT_INFO *info;
360 int start,length,word_length;
363 unsigned long x,mask;
365 int big_p = CGEN_OPCODE_INSN_ENDIAN (od) == CGEN_ENDIAN_BIG;
367 /* FIXME: Need to use ex_info to ensure bytes have been fetched. */
376 x = bfd_getb16 (bufp);
378 x = bfd_getl16 (bufp);
381 /* ??? This may need reworking as these cases don't necessarily
382 want the first byte and the last two bytes handled like this. */
384 x = (bfd_getb8 (bufp) << 16) | bfd_getb16 (bufp + 1);
386 x = bfd_getl16 (bufp) | (bfd_getb8 (bufp + 2) << 16);
390 x = bfd_getb32 (bufp);
392 x = bfd_getl32 (bufp);
398 /* Written this way to avoid undefined behaviour. */
399 mask = (((1L << (length - 1)) - 1) << 1) | 1;
400 if (CGEN_INSN_LSB0_P)
403 shift = (word_length - (start + length));
404 return (x >> shift) & mask;
407 #endif /* ! CGEN_INT_INSN_P */
409 /* Default extraction routine.
411 ATTRS is a mask of the boolean attributes. We only need `unsigned',
412 but for generality we take a bitmask of all of them. */
414 /* ??? This doesn't handle bfd_vma's. Create another function when
418 extract_normal (od, ex_info, insn_value, attrs, start, length, total_length, valuep)
420 CGEN_EXTRACT_INFO *ex_info;
421 CGEN_INSN_BYTES insn_value;
423 int start, length, total_length;
428 /* If LENGTH is zero, this operand doesn't contribute to the value
429 so give it a standard value of zero. */
439 /* Written this way to avoid undefined behaviour. */
440 unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
442 if (CGEN_INSN_LSB0_P)
443 value = insn_value >> start;
445 value = insn_value >> (total_length - (start + length));
448 if (! (attrs & CGEN_ATTR_MASK (CGEN_OPERAND_UNSIGNED))
449 && (value & (1L << (length - 1))))
455 /* The hard case is probably too slow for the normal cases.
456 It's certainly more difficult to understand than the normal case.
457 Thus this is split into two. Keep it that way. The hard case is defined
458 to be when a field straddles a (loosely defined) word boundary
459 (??? which may require target specific help to determine). */
463 #define HARD_CASE_P 0 /* FIXME:wip */
471 unsigned char *bufp = (unsigned char *) insn_value;
476 /* Adjust start,total_length,bufp to point to the pseudo-word that holds
477 the value. For example in a 48 bit insn where the value to insert
478 (say an immediate value) is the last 16 bits then word_length here
479 would be 16. To handle a 24 bit insn with an 18 bit immediate,
480 extract_1 handles 24 bits (using a combination of bfd_get8,16). */
482 if (total_length > 32)
484 int needed_width = start % 8 + length;
485 int fetch_length = (needed_width <= 8 ? 8
486 : needed_width <= 16 ? 16
489 if (CGEN_INSN_LSB0_P)
491 if (CGEN_INSN_WORD_ENDIAN (od) == CGEN_ENDIAN_BIG)
497 int offset = start & ~7;
501 total_length -= offset;
506 if (CGEN_INSN_WORD_ENDIAN (od) == CGEN_ENDIAN_BIG)
508 int offset = start & ~7;
512 total_length -= offset;
521 /* FIXME: which bytes are being extracted have been lost. */
522 value = extract_1 (od, ex_info, start, length, total_length, bufp);
525 #endif /* ! CGEN_INT_INSN_P */
533 /* Default print handler. */
536 print_normal (od, dis_info, value, attrs, pc, length)
544 disassemble_info *info = (disassemble_info *) dis_info;
546 #ifdef CGEN_PRINT_NORMAL
547 CGEN_PRINT_NORMAL (od, info, value, attrs, pc, length);
550 /* Print the operand as directed by the attributes. */
551 if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
552 ; /* nothing to do */
553 else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_UNSIGNED))
554 (*info->fprintf_func) (info->stream, "0x%lx", value);
556 (*info->fprintf_func) (info->stream, "%ld", value);
559 /* Default address handler. */
562 print_address (od, dis_info, value, attrs, pc, length)
570 disassemble_info *info = (disassemble_info *) dis_info;
572 #ifdef CGEN_PRINT_ADDRESS
573 CGEN_PRINT_ADDRESS (od, info, value, attrs, pc, length);
576 /* Print the operand as directed by the attributes. */
577 if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_SEM_ONLY))
578 ; /* nothing to do */
579 else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_PCREL_ADDR))
580 (*info->print_address_func) (value, info);
581 else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_ABS_ADDR))
582 (*info->print_address_func) (value, info);
583 else if (CGEN_BOOL_ATTR (attrs, CGEN_OPERAND_UNSIGNED))
584 (*info->fprintf_func) (info->stream, "0x%lx", (long) value);
586 (*info->fprintf_func) (info->stream, "%ld", (long) value);
589 /* Keyword print handler. */
592 print_keyword (od, dis_info, keyword_table, value, attrs)
595 CGEN_KEYWORD *keyword_table;
599 disassemble_info *info = (disassemble_info *) dis_info;
600 const CGEN_KEYWORD_ENTRY *ke;
602 ke = cgen_keyword_lookup_value (keyword_table, value);
604 (*info->fprintf_func) (info->stream, "%s", ke->name);
606 (*info->fprintf_func) (info->stream, "???");
609 /* Default insn extractor.
611 INSN_VALUE is the first CGEN_BASE_INSN_SIZE bytes, translated to host order.
612 The extracted fields are stored in FIELDS.
613 EX_INFO is used to handle reading variable length insns.
614 Return the length of the insn in bits, or 0 if no match,
615 or -1 if an error occurs fetching data (memory_error_func will have
619 extract_insn_normal (od, insn, ex_info, insn_value, fields, pc)
621 const CGEN_INSN *insn;
622 CGEN_EXTRACT_INFO *ex_info;
623 unsigned long insn_value;
627 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
628 const unsigned char *syn;
630 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
632 CGEN_INIT_EXTRACT (od);
634 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
638 if (CGEN_SYNTAX_CHAR_P (*syn))
641 length = fr30_cgen_extract_operand (od, CGEN_SYNTAX_FIELD (*syn),
642 ex_info, insn_value, fields, pc);
647 /* We recognized and successfully extracted this insn. */
648 return CGEN_INSN_BITSIZE (insn);
651 /* Default insn printer.
653 DIS_INFO is defined as `PTR' so the disassembler needn't know anything
654 about disassemble_info. */
657 print_insn_normal (od, dis_info, insn, fields, pc, length)
660 const CGEN_INSN *insn;
665 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
666 disassemble_info *info = (disassemble_info *) dis_info;
667 const unsigned char *syn;
669 CGEN_INIT_PRINT (od);
671 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
673 if (CGEN_SYNTAX_MNEMONIC_P (*syn))
675 (*info->fprintf_func) (info->stream, "%s", CGEN_INSN_MNEMONIC (insn));
678 if (CGEN_SYNTAX_CHAR_P (*syn))
680 (*info->fprintf_func) (info->stream, "%c", CGEN_SYNTAX_CHAR (*syn));
684 /* We have an operand. */
685 fr30_cgen_print_operand (od, CGEN_SYNTAX_FIELD (*syn), info,
686 fields, CGEN_INSN_ATTRS (insn), pc, length);
690 /* Utility to print an insn.
691 BUF is the base part of the insn, target byte order, BUFLEN bytes long.
692 The result is the size of the insn in bytes or zero for an unknown insn
693 or -1 if an error occurs fetching data (memory_error_func will have
697 print_insn (od, pc, info, buf, buflen)
700 disassemble_info *info;
704 unsigned long insn_value;
705 const CGEN_INSN_LIST *insn_list;
706 CGEN_EXTRACT_INFO ex_info;
708 ex_info.dis_info = info;
709 ex_info.valid = (1 << CGEN_BASE_INSN_SIZE) - 1;
718 insn_value = info->endian == BFD_ENDIAN_BIG ? bfd_getb16 (buf) : bfd_getl16 (buf);
721 insn_value = info->endian == BFD_ENDIAN_BIG ? bfd_getb32 (buf) : bfd_getl32 (buf);
727 /* The instructions are stored in hash lists.
728 Pick the first one and keep trying until we find the right one. */
730 insn_list = CGEN_DIS_LOOKUP_INSN (od, buf, insn_value);
731 while (insn_list != NULL)
733 const CGEN_INSN *insn = insn_list->insn;
737 #if 0 /* not needed as insn shouldn't be in hash lists if not supported */
738 /* Supported by this cpu? */
739 if (! fr30_cgen_insn_supported (od, insn))
743 /* Basic bit mask must be correct. */
744 /* ??? May wish to allow target to defer this check until the extract
746 if ((insn_value & CGEN_INSN_MASK (insn)) == CGEN_INSN_VALUE (insn))
748 /* Printing is handled in two passes. The first pass parses the
749 machine insn and extracts the fields. The second pass prints
752 length = (*CGEN_EXTRACT_FN (insn)) (od, insn, &ex_info, insn_value,
754 /* length < 0 -> error */
759 (*CGEN_PRINT_FN (insn)) (od, info, insn, &fields, pc, length);
760 /* length is in bits, result is in bytes */
765 insn_list = CGEN_DIS_NEXT_INSN (insn_list);
771 /* Default value for CGEN_PRINT_INSN.
772 The result is the size of the insn in bytes or zero for an unknown insn
773 or -1 if an error occured fetching bytes. */
775 #ifndef CGEN_PRINT_INSN
776 #define CGEN_PRINT_INSN default_print_insn
780 default_print_insn (od, pc, info)
783 disassemble_info *info;
785 char buf[CGEN_MAX_INSN_SIZE];
788 /* Read the base part of the insn. */
790 status = (*info->read_memory_func) (pc, buf, CGEN_BASE_INSN_SIZE, info);
793 (*info->memory_error_func) (status, pc, info);
797 return print_insn (od, pc, info, buf, CGEN_BASE_INSN_SIZE);
801 Print one instruction from PC on INFO->STREAM.
802 Return the size of the instruction (in bytes). */
805 print_insn_fr30 (pc, info)
807 disassemble_info *info;
810 static CGEN_OPCODE_DESC od = 0;
811 int mach = info->mach;
812 int big_p = info->endian == BFD_ENDIAN_BIG;
814 /* If we haven't initialized yet, initialize the opcode table. */
817 od = fr30_cgen_opcode_open (mach,
820 : CGEN_ENDIAN_LITTLE);
821 fr30_cgen_init_dis (od);
823 /* If we've switched cpu's, re-initialize. */
824 /* ??? Perhaps we should use BFD_ENDIAN. */
825 else if (mach != CGEN_OPCODE_MACH (od)
826 || (CGEN_OPCODE_ENDIAN (od)
827 != (big_p ? CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE)))
829 cgen_set_cpu (od, mach, big_p ? CGEN_ENDIAN_BIG : CGEN_ENDIAN_LITTLE);
832 /* We try to have as much common code as possible.
833 But at this point some targets need to take over. */
834 /* ??? Some targets may need a hook elsewhere. Try to avoid this,
835 but if not possible try to move this hook elsewhere rather than
837 length = CGEN_PRINT_INSN (od, pc, info);
843 (*info->fprintf_func) (info->stream, UNKNOWN_INSN_MSG);
844 return CGEN_DEFAULT_INSN_SIZE;