1 /* m32c opcode support. -*- C -*-
3 Copyright 2005 Free Software Foundation, Inc.
5 Contributed by Red Hat Inc; developed under contract from Renesas
7 This file is part of the GNU Binutils.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
23 /* This file is an addendum to m32c.cpu. Heavy use of C code isn't
24 appropriate in .cpu files, so it resides here. This especially applies
25 to assembly/disassembly where parsing/printing can be quite involved.
26 Such things aren't really part of the specification of the cpu, per se,
27 so .cpu files provide the general framework and .opc files handle the
28 nitty-gritty details as necessary.
30 Each section is delimited with start and end markers.
32 <arch>-opc.h additions use: "-- opc.h"
33 <arch>-opc.c additions use: "-- opc.c"
34 <arch>-asm.c additions use: "-- asm.c"
35 <arch>-dis.c additions use: "-- dis.c"
36 <arch>-ibd.h additions use: "-- ibd.h". */
40 /* Needed for RTL's 'ext' and 'trunc' operators. */
41 #include "cgen-types.h"
44 /* We can't use the default hash size because many bits are used by
46 #define CGEN_DIS_HASH_SIZE 1
47 #define CGEN_DIS_HASH(buf, value) 0
48 #define CGEN_VERBOSE_ASSEMBLER_ERRORS
49 #define CGEN_VALIDATE_INSN_SUPPORTED
51 extern int m32c_cgen_insn_supported (CGEN_CPU_DESC, const CGEN_INSN *);
53 #define CGEN_ASM_HASH_SIZE 0xffff
54 #define CGEN_ASM_HASH(mnem) m32c_asm_hash ((mnem))
60 m32c_asm_hash (const char *mnem)
64 /* The length of the mnemonic for the Jcnd insns is 1. Hash jsri. */
65 if (mnem[0] == 'j' && mnem[1] != 's')
68 /* Don't hash scCND */
69 if (mnem[0] == 's' && mnem[1] == 'c')
72 /* Don't hash bmCND */
73 if (mnem[0] == 'b' && mnem[1] == 'm')
76 for (h = 0; *mnem && *mnem != ' ' && *mnem != ':'; ++mnem)
78 return h % CGEN_ASM_HASH_SIZE;
82 #include "safe-ctype.h"
84 #define MACH_M32C 5 /* Must match md_begin. */
87 m32c_cgen_isa_register (const char **strp)
90 const char *s = *strp;
91 static char * m32c_register_names [] =
93 "r0", "r1", "r2", "r3", "r0l", "r0h", "r1l", "r1h",
94 "a0", "a1", "r2r0", "r3r1", "sp", "fb", "dct0", "dct1", "flg", "svf",
95 "drc0", "drc1", "dmd0", "dmd1", "intb", "svp", "vct", "isp", "dma0",
96 "dma1", "dra0", "dra1", "dsa0", "dsa1", 0
99 for (u = 0; m32c_register_names[u]; u++)
101 int len = strlen (m32c_register_names[u]);
103 if (memcmp (m32c_register_names[u], s, len) == 0
104 && (s[len] == 0 || ! ISALNUM (s[len])))
110 #define PARSE_UNSIGNED \
113 /* Don't successfully parse literals beginning with '['. */ \
115 return "Invalid literal"; /* Anything -- will not be seen. */ \
117 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);\
123 #define PARSE_SIGNED \
126 /* Don't successfully parse literals beginning with '['. */ \
128 return "Invalid literal"; /* Anything -- will not be seen. */ \
130 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value); \
137 parse_unsigned6 (CGEN_CPU_DESC cd, const char **strp,
138 int opindex, unsigned long *valuep)
140 const char *errmsg = 0;
146 return _("imm:6 immediate is out of range");
153 parse_unsigned8 (CGEN_CPU_DESC cd, const char **strp,
154 int opindex, unsigned long *valuep)
156 const char *errmsg = 0;
160 if (strncasecmp (*strp, "%dsp8(", 6) == 0)
162 enum cgen_parse_operand_result result_type;
167 errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_8,
168 & result_type, & value);
170 return _("missing `)'");
174 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
176 return _("%dsp8() takes a symbolic address, not a number");
182 if (strncmp (*strp, "0x0", 3) == 0
183 || (**strp == '0' && *(*strp + 1) != 'x'))
189 return _("dsp:8 immediate is out of range");
191 /* If this field may require a relocation then use larger dsp16. */
192 if (! have_zero && value == 0)
193 return _("dsp:8 immediate is out of range");
200 parse_signed4 (CGEN_CPU_DESC cd, const char **strp,
201 int opindex, signed long *valuep)
203 const char *errmsg = 0;
207 if (strncmp (*strp, "0x0", 3) == 0
208 || (**strp == '0' && *(*strp + 1) != 'x'))
213 if (value < -8 || value > 7)
214 return _("Immediate is out of range -8 to 7");
216 /* If this field may require a relocation then use larger dsp16. */
217 if (! have_zero && value == 0)
218 return _("Immediate is out of range -8 to 7");
225 parse_signed4n (CGEN_CPU_DESC cd, const char **strp,
226 int opindex, signed long *valuep)
228 const char *errmsg = 0;
232 if (strncmp (*strp, "0x0", 3) == 0
233 || (**strp == '0' && *(*strp + 1) != 'x'))
238 if (value < -7 || value > 8)
239 return _("Immediate is out of range -7 to 8");
241 /* If this field may require a relocation then use larger dsp16. */
242 if (! have_zero && value == 0)
243 return _("Immediate is out of range -7 to 8");
250 parse_signed8 (CGEN_CPU_DESC cd, const char **strp,
251 int opindex, signed long *valuep)
253 const char *errmsg = 0;
256 if (strncasecmp (*strp, "%hi8(", 5) == 0)
258 enum cgen_parse_operand_result result_type;
263 errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_M32C_HI8,
264 & result_type, & value);
266 return _("missing `)'");
270 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
280 if (value <= 255 && value > 127)
283 if (value < -128 || value > 127)
284 return _("dsp:8 immediate is out of range");
291 parse_unsigned16 (CGEN_CPU_DESC cd, const char **strp,
292 int opindex, unsigned long *valuep)
294 const char *errmsg = 0;
298 if (strncasecmp (*strp, "%dsp16(", 7) == 0)
300 enum cgen_parse_operand_result result_type;
305 errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_16,
306 & result_type, & value);
308 return _("missing `)'");
312 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
314 return _("%dsp16() takes a symbolic address, not a number");
320 /* Don't successfully parse literals beginning with '['. */
322 return "Invalid literal"; /* Anything -- will not be seen. */
324 /* Don't successfully parse register names. */
325 if (m32c_cgen_isa_register (strp))
326 return "Invalid literal"; /* Anything -- will not be seen. */
328 if (strncmp (*strp, "0x0", 3) == 0
329 || (**strp == '0' && *(*strp + 1) != 'x'))
332 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
337 return _("dsp:16 immediate is out of range");
339 /* If this field may require a relocation then use larger dsp24. */
340 if (cd->machs == MACH_M32C && ! have_zero && value == 0
341 && (strncmp (*strp, "[a", 2) == 0
344 return _("dsp:16 immediate is out of range");
351 parse_signed16 (CGEN_CPU_DESC cd, const char **strp,
352 int opindex, signed long *valuep)
354 const char *errmsg = 0;
357 if (strncasecmp (*strp, "%lo16(", 6) == 0)
359 enum cgen_parse_operand_result result_type;
364 errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_LO16,
365 & result_type, & value);
367 return _("missing `)'");
371 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
379 if (strncasecmp (*strp, "%hi16(", 6) == 0)
381 enum cgen_parse_operand_result result_type;
386 errmsg = cgen_parse_address (cd, strp, opindex, BFD_RELOC_HI16,
387 & result_type, & value);
389 return _("missing `)'");
393 && result_type == CGEN_PARSE_OPERAND_RESULT_NUMBER)
403 if (value <= 65535 && value > 32767)
406 if (value < -32768 || value > 32767)
407 return _("dsp:16 immediate is out of range");
414 parse_unsigned20 (CGEN_CPU_DESC cd, const char **strp,
415 int opindex, unsigned long *valuep)
417 const char *errmsg = 0;
420 /* Don't successfully parse literals beginning with '['. */
422 return "Invalid literal"; /* Anything -- will not be seen. */
424 /* Don't successfully parse register names. */
425 if (m32c_cgen_isa_register (strp))
426 return "Invalid literal"; /* Anything -- will not be seen. */
428 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
433 return _("dsp:20 immediate is out of range");
440 parse_unsigned24 (CGEN_CPU_DESC cd, const char **strp,
441 int opindex, unsigned long *valuep)
443 const char *errmsg = 0;
446 /* Don't successfully parse literals beginning with '['. */
448 return "Invalid literal"; /* Anything -- will not be seen. */
450 /* Don't successfully parse register names. */
451 if (m32c_cgen_isa_register (strp))
452 return "Invalid literal"; /* Anything -- will not be seen. */
454 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
458 if (value > 0xffffff)
459 return _("dsp:24 immediate is out of range");
465 /* This should only be used for #imm->reg. */
467 parse_signed24 (CGEN_CPU_DESC cd, const char **strp,
468 int opindex, signed long *valuep)
470 const char *errmsg = 0;
475 if (value <= 0xffffff && value > 0x7fffff)
478 if (value > 0xffffff)
479 return _("dsp:24 immediate is out of range");
486 parse_signed32 (CGEN_CPU_DESC cd, const char **strp,
487 int opindex, signed long *valuep)
489 const char *errmsg = 0;
492 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
501 parse_imm1_S (CGEN_CPU_DESC cd, const char **strp,
502 int opindex, signed long *valuep)
504 const char *errmsg = 0;
507 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
511 if (value < 1 || value > 2)
512 return _("immediate is out of range 1-2");
519 parse_imm3_S (CGEN_CPU_DESC cd, const char **strp,
520 int opindex, signed long *valuep)
522 const char *errmsg = 0;
525 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
529 if (value < 1 || value > 8)
530 return _("immediate is out of range 1-8");
537 parse_bit3_S (CGEN_CPU_DESC cd, const char **strp,
538 int opindex, signed long *valuep)
540 const char *errmsg = 0;
543 errmsg = cgen_parse_signed_integer (cd, strp, opindex, & value);
547 if (value < 0 || value > 7)
548 return _("immediate is out of range 0-7");
555 parse_lab_5_3 (CGEN_CPU_DESC cd,
557 int opindex ATTRIBUTE_UNUSED,
559 enum cgen_parse_operand_result *type_addr,
562 const char *errmsg = 0;
564 enum cgen_parse_operand_result op_res;
566 errmsg = cgen_parse_address (cd, strp, M32C_OPERAND_LAB_5_3,
567 opinfo, & op_res, & value);
572 if (op_res == CGEN_PARSE_OPERAND_ADDRESS)
574 /* This is a hack; the field cannot handle near-zero signed
575 offsets that CGEN wants to put in to indicate an "empty"
583 if (value < 2 || value > 9)
584 return _("immediate is out of range 2-9");
591 parse_Bitno16R (CGEN_CPU_DESC cd, const char **strp,
592 int opindex, unsigned long *valuep)
594 const char *errmsg = 0;
597 errmsg = cgen_parse_unsigned_integer (cd, strp, opindex, & value);
602 return _("Bit number for indexing general register is out of range 0-15");
609 parse_unsigned_bitbase (CGEN_CPU_DESC cd, const char **strp,
610 int opindex, unsigned long *valuep,
613 const char *errmsg = 0;
616 const char *newp = *strp;
617 unsigned long long bitbase;
619 errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
624 return "Missing base for bit,base:8";
627 errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & base);
631 bitbase = (unsigned long long) bit + ((unsigned long long) base * 8);
633 if (bitbase >= (1ull << bits))
634 return _("bit,base is out of range");
642 parse_signed_bitbase (CGEN_CPU_DESC cd, const char **strp,
643 int opindex, signed long *valuep,
646 const char *errmsg = 0;
649 const char *newp = *strp;
653 errmsg = cgen_parse_unsigned_integer (cd, & newp, opindex, & bit);
658 return "Missing base for bit,base:8";
661 errmsg = cgen_parse_signed_integer (cd, & newp, opindex, & base);
665 bitbase = (long long)bit + ((long long)base * 8);
667 limit = 1ll << (bits - 1);
668 if (bitbase < -limit || bitbase >= limit)
669 return _("bit,base is out of range");
677 parse_unsigned_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
678 int opindex, unsigned long *valuep)
680 return parse_unsigned_bitbase (cd, strp, opindex, valuep, 8);
684 parse_unsigned_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
685 int opindex, unsigned long *valuep)
687 return parse_unsigned_bitbase (cd, strp, opindex, valuep, 11);
691 parse_unsigned_bitbase16 (CGEN_CPU_DESC cd, const char **strp,
692 int opindex, unsigned long *valuep)
694 return parse_unsigned_bitbase (cd, strp, opindex, valuep, 16);
698 parse_unsigned_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
699 int opindex, unsigned long *valuep)
701 return parse_unsigned_bitbase (cd, strp, opindex, valuep, 19);
705 parse_unsigned_bitbase27 (CGEN_CPU_DESC cd, const char **strp,
706 int opindex, unsigned long *valuep)
708 return parse_unsigned_bitbase (cd, strp, opindex, valuep, 27);
712 parse_signed_bitbase8 (CGEN_CPU_DESC cd, const char **strp,
713 int opindex, signed long *valuep)
715 return parse_signed_bitbase (cd, strp, opindex, valuep, 8);
719 parse_signed_bitbase11 (CGEN_CPU_DESC cd, const char **strp,
720 int opindex, signed long *valuep)
722 return parse_signed_bitbase (cd, strp, opindex, valuep, 11);
726 parse_signed_bitbase19 (CGEN_CPU_DESC cd, const char **strp,
727 int opindex, signed long *valuep)
729 return parse_signed_bitbase (cd, strp, opindex, valuep, 19);
732 /* Parse the suffix as :<char> or as nothing followed by a whitespace. */
735 parse_suffix (const char **strp, char suffix)
737 const char *newp = *strp;
739 if (**strp == ':' && TOLOWER (*(*strp + 1)) == suffix)
748 return "Invalid suffix"; /* Anything -- will not be seen. */
752 parse_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
753 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
755 return parse_suffix (strp, 's');
759 parse_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
760 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
762 return parse_suffix (strp, 'g');
766 parse_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
767 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
769 return parse_suffix (strp, 'q');
773 parse_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
774 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
776 return parse_suffix (strp, 'z');
779 /* Parse an empty suffix. Fail if the next char is ':'. */
782 parse_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
783 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
786 return "Unexpected suffix";
791 parse_r0l_r0h (CGEN_CPU_DESC cd, const char **strp,
792 int opindex ATTRIBUTE_UNUSED, signed long *valuep)
797 const char *newp = *strp;
800 errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l_r0h, & value);
805 return _("not a valid r0l/r0h pair");
808 /* Parse the second register in the pair. */
809 if (value == 0) /* r0l */
810 errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0h, & junk);
812 errmsg = cgen_parse_keyword (cd, & newp, & m32c_cgen_opval_h_r0l, & junk);
821 /* Accept .b or .w in any case. */
824 parse_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, const char **strp,
825 int opindex ATTRIBUTE_UNUSED, signed long *valuep ATTRIBUTE_UNUSED)
828 && (*(*strp + 1) == 'b' || *(*strp + 1) == 'B'
829 || *(*strp + 1) == 'w' || *(*strp + 1) == 'W'))
835 return _("Invalid size specifier");
838 /* Special check to ensure that instruction exists for given machine. */
841 m32c_cgen_insn_supported (CGEN_CPU_DESC cd,
842 const CGEN_INSN *insn)
844 int machs = CGEN_INSN_ATTR_VALUE (insn, CGEN_INSN_MACH);
845 CGEN_BITSET isas = CGEN_INSN_BITSET_ATTR_VALUE (insn, CGEN_INSN_ISA);
847 /* If attributes are absent, assume no restriction. */
851 return ((machs & cd->machs)
852 && cgen_bitset_intersect_p (& isas, cd->isas));
855 /* Parse a set of registers, R0,R1,A0,A1,SB,FB. */
858 parse_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
860 int opindex ATTRIBUTE_UNUSED,
861 unsigned long *valuep,
864 const char *errmsg = 0;
868 while (**strp && **strp != ')')
870 if (**strp == 'r' || **strp == 'R')
873 regno = **strp - '0';
875 errmsg = _("Register number is not valid");
877 else if (**strp == 'a' || **strp == 'A')
880 regno = **strp - '0';
882 errmsg = _("Register number is not valid");
883 regno = **strp - '0' + 4;
886 else if (strncasecmp (*strp, "sb", 2) == 0 || strncasecmp (*strp, "SB", 2) == 0)
892 else if (strncasecmp (*strp, "fb", 2) == 0 || strncasecmp (*strp, "FB", 2) == 0)
898 if (push) /* Mask is reversed for push. */
899 *valuep |= 0x80 >> regno;
901 *valuep |= 1 << regno;
906 if (*(*strp + 1) == ')')
913 errmsg = _("Register list is not valid");
922 parse_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
924 int opindex ATTRIBUTE_UNUSED,
925 unsigned long *valuep)
927 return parse_regset (cd, strp, opindex, valuep, POP);
931 parse_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
933 int opindex ATTRIBUTE_UNUSED,
934 unsigned long *valuep)
936 return parse_regset (cd, strp, opindex, valuep, PUSH);
941 #include "elf/m32c.h"
944 /* Always print the short insn format suffix as ':<char>'. */
947 print_suffix (void * dis_info, char suffix)
949 disassemble_info *info = dis_info;
951 (*info->fprintf_func) (info->stream, ":%c", suffix);
955 print_S (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
957 long value ATTRIBUTE_UNUSED,
958 unsigned int attrs ATTRIBUTE_UNUSED,
959 bfd_vma pc ATTRIBUTE_UNUSED,
960 int length ATTRIBUTE_UNUSED)
962 print_suffix (dis_info, 's');
967 print_G (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
969 long value ATTRIBUTE_UNUSED,
970 unsigned int attrs ATTRIBUTE_UNUSED,
971 bfd_vma pc ATTRIBUTE_UNUSED,
972 int length ATTRIBUTE_UNUSED)
974 print_suffix (dis_info, 'g');
978 print_Q (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
980 long value ATTRIBUTE_UNUSED,
981 unsigned int attrs ATTRIBUTE_UNUSED,
982 bfd_vma pc ATTRIBUTE_UNUSED,
983 int length ATTRIBUTE_UNUSED)
985 print_suffix (dis_info, 'q');
989 print_Z (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
991 long value ATTRIBUTE_UNUSED,
992 unsigned int attrs ATTRIBUTE_UNUSED,
993 bfd_vma pc ATTRIBUTE_UNUSED,
994 int length ATTRIBUTE_UNUSED)
996 print_suffix (dis_info, 'z');
999 /* Print the empty suffix. */
1002 print_X (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1003 void * dis_info ATTRIBUTE_UNUSED,
1004 long value ATTRIBUTE_UNUSED,
1005 unsigned int attrs ATTRIBUTE_UNUSED,
1006 bfd_vma pc ATTRIBUTE_UNUSED,
1007 int length ATTRIBUTE_UNUSED)
1013 print_r0l_r0h (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1016 unsigned int attrs ATTRIBUTE_UNUSED,
1017 bfd_vma pc ATTRIBUTE_UNUSED,
1018 int length ATTRIBUTE_UNUSED)
1020 disassemble_info *info = dis_info;
1023 (*info->fprintf_func) (info->stream, "r0h,r0l");
1025 (*info->fprintf_func) (info->stream, "r0l,r0h");
1029 print_unsigned_bitbase (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1031 unsigned long value,
1032 unsigned int attrs ATTRIBUTE_UNUSED,
1033 bfd_vma pc ATTRIBUTE_UNUSED,
1034 int length ATTRIBUTE_UNUSED)
1036 disassemble_info *info = dis_info;
1038 (*info->fprintf_func) (info->stream, "%ld,0x%lx", value & 0x7, value >> 3);
1042 print_signed_bitbase (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1045 unsigned int attrs ATTRIBUTE_UNUSED,
1046 bfd_vma pc ATTRIBUTE_UNUSED,
1047 int length ATTRIBUTE_UNUSED)
1049 disassemble_info *info = dis_info;
1051 (*info->fprintf_func) (info->stream, "%ld,%ld", value & 0x7, value >> 3);
1055 print_size (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1057 long value ATTRIBUTE_UNUSED,
1058 unsigned int attrs ATTRIBUTE_UNUSED,
1059 bfd_vma pc ATTRIBUTE_UNUSED,
1060 int length ATTRIBUTE_UNUSED)
1062 /* Always print the size as '.w'. */
1063 disassemble_info *info = dis_info;
1065 (*info->fprintf_func) (info->stream, ".w");
1071 static void print_pop_regset (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
1072 static void print_push_regset (CGEN_CPU_DESC, void *, long, unsigned int, bfd_vma, int);
1074 /* Print a set of registers, R0,R1,A0,A1,SB,FB. */
1077 print_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1080 unsigned int attrs ATTRIBUTE_UNUSED,
1081 bfd_vma pc ATTRIBUTE_UNUSED,
1082 int length ATTRIBUTE_UNUSED,
1085 static char * m16c_register_names [] =
1087 "r0", "r1", "r2", "r3", "a0", "a1", "sb", "fb"
1089 disassemble_info *info = dis_info;
1101 (*info->fprintf_func) (info->stream, "%s", m16c_register_names [0]);
1105 for (index = 1; index <= 7; ++index)
1114 (*info->fprintf_func) (info->stream, "%s%s", comma,
1115 m16c_register_names [index]);
1122 print_pop_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1125 unsigned int attrs ATTRIBUTE_UNUSED,
1126 bfd_vma pc ATTRIBUTE_UNUSED,
1127 int length ATTRIBUTE_UNUSED)
1129 print_regset (cd, dis_info, value, attrs, pc, length, POP);
1133 print_push_regset (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1136 unsigned int attrs ATTRIBUTE_UNUSED,
1137 bfd_vma pc ATTRIBUTE_UNUSED,
1138 int length ATTRIBUTE_UNUSED)
1140 print_regset (cd, dis_info, value, attrs, pc, length, PUSH);
1144 print_signed4n (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1147 unsigned int attrs ATTRIBUTE_UNUSED,
1148 bfd_vma pc ATTRIBUTE_UNUSED,
1149 int length ATTRIBUTE_UNUSED)
1151 disassemble_info *info = dis_info;
1153 (*info->fprintf_func) (info->stream, "%ld", -value);