1 /* XC16X opcode support. -*- C -*-
3 Copyright 2006 Free Software Foundation, Inc.
5 Contributed by KPIT Cummins Infosystems Ltd.; developed under contract
6 from Infineon Systems, GMBH , Germany.
8 This file is part of the GNU Binutils.
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 of the License, or
13 (at your option) any later version.
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
22 Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
26 /* This file is an addendum to xc16x.cpu. Heavy use of C code isn't
27 appropriate in .cpu files, so it resides here. This especially applies
28 to assembly/disassembly where parsing/printing can be quite involved.
29 Such things aren't really part of the specification of the cpu, per se,
30 so .cpu files provide the general framework and .opc files handle the
31 nitty-gritty details as necessary.
33 Each section is delimited with start and end markers.
35 <arch>-opc.h additions use: "-- opc.h"
36 <arch>-opc.c additions use: "-- opc.c"
37 <arch>-asm.c additions use: "-- asm.c"
38 <arch>-dis.c additions use: "-- dis.c"
39 <arch>-ibd.h additions use: "-- ibd.h" */
43 #define CGEN_DIS_HASH_SIZE 8
44 #define CGEN_DIS_HASH(buf,value) (((* (unsigned char*) (buf)) >> 3) % CGEN_DIS_HASH_SIZE)
53 /* Handle '#' prefixes (i.e. skip over them). */
56 parse_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
58 int opindex ATTRIBUTE_UNUSED,
59 long *valuep ATTRIBUTE_UNUSED)
66 /* Handle '.' prefixes (i.e. skip over them). */
69 parse_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
71 int opindex ATTRIBUTE_UNUSED,
72 long *valuep ATTRIBUTE_UNUSED)
79 /* Handle '.' prefixes (i.e. skip over them). */
82 parse_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
84 int opindex ATTRIBUTE_UNUSED,
85 long *valuep ATTRIBUTE_UNUSED)
87 if (!strncasecmp (*strp, "pof:", 4))
92 /* Handle '.' prefixes (i.e. skip over them). */
95 parse_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
97 int opindex ATTRIBUTE_UNUSED,
98 long *valuep ATTRIBUTE_UNUSED)
100 if (!strncasecmp (*strp, "pag:", 4))
105 /* Handle 'sof' prefixes (i.e. skip over them). */
107 parse_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
109 int opindex ATTRIBUTE_UNUSED,
110 long *valuep ATTRIBUTE_UNUSED)
112 if (!strncasecmp (*strp, "sof:", 4))
117 /* Handle 'seg' prefixes (i.e. skip over them). */
119 parse_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
121 int opindex ATTRIBUTE_UNUSED,
122 long *valuep ATTRIBUTE_UNUSED)
124 if (!strncasecmp (*strp, "seg:", 4))
132 #define CGEN_PRINT_NORMAL(cd, info, value, attrs, pc, length) \
135 if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_DOT_PREFIX)) \
136 info->fprintf_func (info->stream, "."); \
137 if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_POF_PREFIX)) \
138 info->fprintf_func (info->stream, "#pof:"); \
139 if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_PAG_PREFIX)) \
140 info->fprintf_func (info->stream, "#pag:"); \
144 /* Handle '.' prefixes as operands. */
147 print_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
148 void * dis_info ATTRIBUTE_UNUSED,
149 long value ATTRIBUTE_UNUSED,
150 unsigned int attrs ATTRIBUTE_UNUSED,
151 bfd_vma pc ATTRIBUTE_UNUSED,
152 int length ATTRIBUTE_UNUSED)
156 /* Handle '.' prefixes as operands. */
159 print_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
160 void * dis_info ATTRIBUTE_UNUSED,
161 long value ATTRIBUTE_UNUSED,
162 unsigned int attrs ATTRIBUTE_UNUSED,
163 bfd_vma pc ATTRIBUTE_UNUSED,
164 int length ATTRIBUTE_UNUSED)
168 /* Handle '.' prefixes as operands. */
171 print_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
173 long value ATTRIBUTE_UNUSED,
174 unsigned int attrs ATTRIBUTE_UNUSED,
175 bfd_vma pc ATTRIBUTE_UNUSED,
176 int length ATTRIBUTE_UNUSED)
178 disassemble_info *info = (disassemble_info *) dis_info;
180 info->fprintf_func (info->stream, "sof:");
183 /* Handle '.' prefixes as operands. */
186 print_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
188 long value ATTRIBUTE_UNUSED,
189 unsigned int attrs ATTRIBUTE_UNUSED,
190 bfd_vma pc ATTRIBUTE_UNUSED,
191 int length ATTRIBUTE_UNUSED)
193 disassemble_info *info = (disassemble_info *) dis_info;
195 info->fprintf_func (info->stream, "seg:");
198 /* Handle '#' prefixes as operands. */
201 print_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
203 long value ATTRIBUTE_UNUSED,
204 unsigned int attrs ATTRIBUTE_UNUSED,
205 bfd_vma pc ATTRIBUTE_UNUSED,
206 int length ATTRIBUTE_UNUSED)
208 disassemble_info *info = (disassemble_info *) dis_info;
210 info->fprintf_func (info->stream, "#");
213 /* Handle '.' prefixes as operands. */
216 print_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
217 void * dis_info ATTRIBUTE_UNUSED,
218 long value ATTRIBUTE_UNUSED,
219 unsigned int attrs ATTRIBUTE_UNUSED,
220 bfd_vma pc ATTRIBUTE_UNUSED,
221 int length ATTRIBUTE_UNUSED)