1/* XC16X opcode support.  -*- C -*-
2
3   Copyright 2006 Free Software Foundation, Inc.
4
5   Contributed by KPIT Cummins Infosystems Ltd.; developed under contract
6   from Infineon Systems, GMBH , Germany.
7
8   This file is part of the GNU Binutils.
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 of the License, or
13   (at your option) 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
22   Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23   02110-1301, USA.  */
24
25
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.
32
33   Each section is delimited with start and end markers.
34
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"  */
40
41/* -- opc.h */
42
43#define CGEN_DIS_HASH_SIZE 8
44#define CGEN_DIS_HASH(buf,value) (((* (unsigned char*) (buf)) >> 3) % CGEN_DIS_HASH_SIZE)
45
46/* -- */
47
48/* -- opc.c */
49
50/* -- */
51
52/* -- asm.c */
53/* Handle '#' prefixes (i.e. skip over them).  */
54
55static const char *
56parse_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
57	    const char **strp,
58	    int opindex ATTRIBUTE_UNUSED,
59	    long *valuep ATTRIBUTE_UNUSED)
60{
61  if (**strp == '#')
62    {
63      ++*strp;
64      return NULL;
65    }
66  return _("Missing '#' prefix");
67}
68
69/* Handle '.' prefixes (i.e. skip over them).  */
70
71static const char *
72parse_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
73	   const char **strp,
74	   int opindex ATTRIBUTE_UNUSED,
75	   long *valuep ATTRIBUTE_UNUSED)
76{
77  if (**strp == '.')
78    {
79      ++*strp;
80      return NULL;
81    }
82  return _("Missing '.' prefix");
83}
84
85/* Handle 'pof:' prefixes (i.e. skip over them).  */
86
87static const char *
88parse_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
89	   const char **strp,
90	   int opindex ATTRIBUTE_UNUSED,
91	   long *valuep ATTRIBUTE_UNUSED)
92{
93  if (strncasecmp (*strp, "pof:", 4) == 0)
94    {
95      *strp += 4;
96      return NULL;
97    }
98  return _("Missing 'pof:' prefix");
99}
100
101/* Handle 'pag:' prefixes (i.e. skip over them).  */
102
103static const char *
104parse_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
105	   const char **strp,
106	   int opindex ATTRIBUTE_UNUSED,
107	   long *valuep ATTRIBUTE_UNUSED)
108{
109  if (strncasecmp (*strp, "pag:", 4) == 0)
110    {
111      *strp += 4;
112      return NULL;
113    }
114  return _("Missing 'pag:' prefix");
115}
116
117/* Handle 'sof' prefixes (i.e. skip over them).  */
118
119static const char *
120parse_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
121	   const char **strp,
122	   int opindex ATTRIBUTE_UNUSED,
123	   long *valuep ATTRIBUTE_UNUSED)
124{
125  if (strncasecmp (*strp, "sof:", 4) == 0)
126    {
127      *strp += 4;
128      return NULL;
129    }
130  return _("Missing 'sof:' prefix");
131}
132
133/* Handle 'seg' prefixes (i.e. skip over them).  */
134
135static const char *
136parse_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
137	   const char **strp,
138	   int opindex ATTRIBUTE_UNUSED,
139	   long *valuep ATTRIBUTE_UNUSED)
140{
141  if (strncasecmp (*strp, "seg:", 4) == 0)
142    {
143      *strp += 4;
144      return NULL;
145    }
146  return _("Missing 'seg:' prefix");
147}
148/* -- */
149
150/* -- dis.c */
151
152#define CGEN_PRINT_NORMAL(cd, info, value, attrs, pc, length)	\
153  do								\
154    {								\
155      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_DOT_PREFIX))	\
156        info->fprintf_func (info->stream, ".");			\
157      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_POF_PREFIX))	\
158        info->fprintf_func (info->stream, "#pof:");		\
159      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_PAG_PREFIX))	\
160        info->fprintf_func (info->stream, "#pag:");		\
161    }								\
162  while (0)
163
164/* Print a 'pof:' prefix to an operand.  */
165
166static void
167print_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
168	   void * dis_info ATTRIBUTE_UNUSED,
169	   long value ATTRIBUTE_UNUSED,
170	   unsigned int attrs ATTRIBUTE_UNUSED,
171	   bfd_vma pc ATTRIBUTE_UNUSED,
172	   int length ATTRIBUTE_UNUSED)
173{
174}
175
176/* Print a 'pag:' prefix to an operand.  */
177
178static void
179print_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
180	   void * dis_info ATTRIBUTE_UNUSED,
181	   long value ATTRIBUTE_UNUSED,
182	   unsigned int attrs ATTRIBUTE_UNUSED,
183	   bfd_vma pc ATTRIBUTE_UNUSED,
184	   int length ATTRIBUTE_UNUSED)
185{
186}
187
188/* Print a 'sof:' prefix to an operand.  */
189
190static void
191print_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
192	   void * dis_info,
193	   long value ATTRIBUTE_UNUSED,
194	   unsigned int attrs ATTRIBUTE_UNUSED,
195	   bfd_vma pc ATTRIBUTE_UNUSED,
196	   int length ATTRIBUTE_UNUSED)
197{
198  disassemble_info *info = (disassemble_info *) dis_info;
199
200  info->fprintf_func (info->stream, "sof:");
201}
202
203/* Print a 'seg:' prefix to an operand.  */
204
205static void
206print_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
207	   void * dis_info,
208	   long value ATTRIBUTE_UNUSED,
209	   unsigned int attrs ATTRIBUTE_UNUSED,
210	   bfd_vma pc ATTRIBUTE_UNUSED,
211	   int length ATTRIBUTE_UNUSED)
212{
213  disassemble_info *info = (disassemble_info *) dis_info;
214
215  info->fprintf_func (info->stream, "seg:");
216}
217
218/* Print a '#' prefix to an operand.  */
219
220static void
221print_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
222	    void * dis_info,
223	    long value ATTRIBUTE_UNUSED,
224	    unsigned int attrs ATTRIBUTE_UNUSED,
225	    bfd_vma pc ATTRIBUTE_UNUSED,
226	    int length ATTRIBUTE_UNUSED)
227{
228  disassemble_info *info = (disassemble_info *) dis_info;
229
230  info->fprintf_func (info->stream, "#");
231}
232
233/* Print a '.' prefix to an operand.  */
234
235static void
236print_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
237	   void * dis_info ATTRIBUTE_UNUSED,
238	   long value ATTRIBUTE_UNUSED,
239	   unsigned int attrs ATTRIBUTE_UNUSED,
240	   bfd_vma pc ATTRIBUTE_UNUSED,
241	   int length ATTRIBUTE_UNUSED)
242{
243}
244
245/* -- */
246