xref: /openbsd-src/gnu/usr.bin/binutils-2.17/cpu/xc16x.opc (revision 3d8817e467ea46cf4772788d6804dd293abfb01a)
1*3d8817e4Smiod/* XC16X opcode support.  -*- C -*-
2*3d8817e4Smiod
3*3d8817e4Smiod   Copyright 2006 Free Software Foundation, Inc.
4*3d8817e4Smiod
5*3d8817e4Smiod   Contributed by KPIT Cummins Infosystems Ltd.; developed under contract
6*3d8817e4Smiod   from Infineon Systems, GMBH , Germany.
7*3d8817e4Smiod
8*3d8817e4Smiod   This file is part of the GNU Binutils.
9*3d8817e4Smiod
10*3d8817e4Smiod   This program is free software; you can redistribute it and/or modify
11*3d8817e4Smiod   it under the terms of the GNU General Public License as published by
12*3d8817e4Smiod   the Free Software Foundation; either version 2 of the License, or
13*3d8817e4Smiod   (at your option) any later version.
14*3d8817e4Smiod
15*3d8817e4Smiod   This program is distributed in the hope that it will be useful,
16*3d8817e4Smiod   but WITHOUT ANY WARRANTY; without even the implied warranty of
17*3d8817e4Smiod   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18*3d8817e4Smiod   GNU General Public License for more details.
19*3d8817e4Smiod
20*3d8817e4Smiod   You should have received a copy of the GNU General Public License
21*3d8817e4Smiod   along with this program; if not, write to the Free Software
22*3d8817e4Smiod   Foundation, 51 Franklin Street - Fifth Floor, Boston, MA
23*3d8817e4Smiod   02110-1301, USA.  */
24*3d8817e4Smiod
25*3d8817e4Smiod
26*3d8817e4Smiod/* This file is an addendum to xc16x.cpu.  Heavy use of C code isn't
27*3d8817e4Smiod   appropriate in .cpu files, so it resides here.  This especially applies
28*3d8817e4Smiod   to assembly/disassembly where parsing/printing can be quite involved.
29*3d8817e4Smiod   Such things aren't really part of the specification of the cpu, per se,
30*3d8817e4Smiod   so .cpu files provide the general framework and .opc files handle the
31*3d8817e4Smiod   nitty-gritty details as necessary.
32*3d8817e4Smiod
33*3d8817e4Smiod   Each section is delimited with start and end markers.
34*3d8817e4Smiod
35*3d8817e4Smiod   <arch>-opc.h additions use: "-- opc.h"
36*3d8817e4Smiod   <arch>-opc.c additions use: "-- opc.c"
37*3d8817e4Smiod   <arch>-asm.c additions use: "-- asm.c"
38*3d8817e4Smiod   <arch>-dis.c additions use: "-- dis.c"
39*3d8817e4Smiod   <arch>-ibd.h additions use: "-- ibd.h"  */
40*3d8817e4Smiod
41*3d8817e4Smiod/* -- opc.h */
42*3d8817e4Smiod
43*3d8817e4Smiod#define CGEN_DIS_HASH_SIZE 8
44*3d8817e4Smiod#define CGEN_DIS_HASH(buf,value) (((* (unsigned char*) (buf)) >> 3) % CGEN_DIS_HASH_SIZE)
45*3d8817e4Smiod
46*3d8817e4Smiod/* -- */
47*3d8817e4Smiod
48*3d8817e4Smiod/* -- opc.c */
49*3d8817e4Smiod
50*3d8817e4Smiod/* -- */
51*3d8817e4Smiod
52*3d8817e4Smiod/* -- asm.c */
53*3d8817e4Smiod/* Handle '#' prefixes (i.e. skip over them).  */
54*3d8817e4Smiod
55*3d8817e4Smiodstatic const char *
56*3d8817e4Smiodparse_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
57*3d8817e4Smiod	    const char **strp,
58*3d8817e4Smiod	    int opindex ATTRIBUTE_UNUSED,
59*3d8817e4Smiod	    long *valuep ATTRIBUTE_UNUSED)
60*3d8817e4Smiod{
61*3d8817e4Smiod  if (**strp == '#')
62*3d8817e4Smiod    {
63*3d8817e4Smiod      ++*strp;
64*3d8817e4Smiod      return NULL;
65*3d8817e4Smiod    }
66*3d8817e4Smiod  return _("Missing '#' prefix");
67*3d8817e4Smiod}
68*3d8817e4Smiod
69*3d8817e4Smiod/* Handle '.' prefixes (i.e. skip over them).  */
70*3d8817e4Smiod
71*3d8817e4Smiodstatic const char *
72*3d8817e4Smiodparse_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
73*3d8817e4Smiod	   const char **strp,
74*3d8817e4Smiod	   int opindex ATTRIBUTE_UNUSED,
75*3d8817e4Smiod	   long *valuep ATTRIBUTE_UNUSED)
76*3d8817e4Smiod{
77*3d8817e4Smiod  if (**strp == '.')
78*3d8817e4Smiod    {
79*3d8817e4Smiod      ++*strp;
80*3d8817e4Smiod      return NULL;
81*3d8817e4Smiod    }
82*3d8817e4Smiod  return _("Missing '.' prefix");
83*3d8817e4Smiod}
84*3d8817e4Smiod
85*3d8817e4Smiod/* Handle 'pof:' prefixes (i.e. skip over them).  */
86*3d8817e4Smiod
87*3d8817e4Smiodstatic const char *
88*3d8817e4Smiodparse_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
89*3d8817e4Smiod	   const char **strp,
90*3d8817e4Smiod	   int opindex ATTRIBUTE_UNUSED,
91*3d8817e4Smiod	   long *valuep ATTRIBUTE_UNUSED)
92*3d8817e4Smiod{
93*3d8817e4Smiod  if (strncasecmp (*strp, "pof:", 4) == 0)
94*3d8817e4Smiod    {
95*3d8817e4Smiod      *strp += 4;
96*3d8817e4Smiod      return NULL;
97*3d8817e4Smiod    }
98*3d8817e4Smiod  return _("Missing 'pof:' prefix");
99*3d8817e4Smiod}
100*3d8817e4Smiod
101*3d8817e4Smiod/* Handle 'pag:' prefixes (i.e. skip over them).  */
102*3d8817e4Smiod
103*3d8817e4Smiodstatic const char *
104*3d8817e4Smiodparse_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
105*3d8817e4Smiod	   const char **strp,
106*3d8817e4Smiod	   int opindex ATTRIBUTE_UNUSED,
107*3d8817e4Smiod	   long *valuep ATTRIBUTE_UNUSED)
108*3d8817e4Smiod{
109*3d8817e4Smiod  if (strncasecmp (*strp, "pag:", 4) == 0)
110*3d8817e4Smiod    {
111*3d8817e4Smiod      *strp += 4;
112*3d8817e4Smiod      return NULL;
113*3d8817e4Smiod    }
114*3d8817e4Smiod  return _("Missing 'pag:' prefix");
115*3d8817e4Smiod}
116*3d8817e4Smiod
117*3d8817e4Smiod/* Handle 'sof' prefixes (i.e. skip over them).  */
118*3d8817e4Smiod
119*3d8817e4Smiodstatic const char *
120*3d8817e4Smiodparse_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
121*3d8817e4Smiod	   const char **strp,
122*3d8817e4Smiod	   int opindex ATTRIBUTE_UNUSED,
123*3d8817e4Smiod	   long *valuep ATTRIBUTE_UNUSED)
124*3d8817e4Smiod{
125*3d8817e4Smiod  if (strncasecmp (*strp, "sof:", 4) == 0)
126*3d8817e4Smiod    {
127*3d8817e4Smiod      *strp += 4;
128*3d8817e4Smiod      return NULL;
129*3d8817e4Smiod    }
130*3d8817e4Smiod  return _("Missing 'sof:' prefix");
131*3d8817e4Smiod}
132*3d8817e4Smiod
133*3d8817e4Smiod/* Handle 'seg' prefixes (i.e. skip over them).  */
134*3d8817e4Smiod
135*3d8817e4Smiodstatic const char *
136*3d8817e4Smiodparse_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
137*3d8817e4Smiod	   const char **strp,
138*3d8817e4Smiod	   int opindex ATTRIBUTE_UNUSED,
139*3d8817e4Smiod	   long *valuep ATTRIBUTE_UNUSED)
140*3d8817e4Smiod{
141*3d8817e4Smiod  if (strncasecmp (*strp, "seg:", 4) == 0)
142*3d8817e4Smiod    {
143*3d8817e4Smiod      *strp += 4;
144*3d8817e4Smiod      return NULL;
145*3d8817e4Smiod    }
146*3d8817e4Smiod  return _("Missing 'seg:' prefix");
147*3d8817e4Smiod}
148*3d8817e4Smiod/* -- */
149*3d8817e4Smiod
150*3d8817e4Smiod/* -- dis.c */
151*3d8817e4Smiod
152*3d8817e4Smiod#define CGEN_PRINT_NORMAL(cd, info, value, attrs, pc, length)	\
153*3d8817e4Smiod  do								\
154*3d8817e4Smiod    {								\
155*3d8817e4Smiod      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_DOT_PREFIX))	\
156*3d8817e4Smiod        info->fprintf_func (info->stream, ".");			\
157*3d8817e4Smiod      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_POF_PREFIX))	\
158*3d8817e4Smiod        info->fprintf_func (info->stream, "#pof:");		\
159*3d8817e4Smiod      if (CGEN_BOOL_ATTR ((attrs), CGEN_OPERAND_PAG_PREFIX))	\
160*3d8817e4Smiod        info->fprintf_func (info->stream, "#pag:");		\
161*3d8817e4Smiod    }								\
162*3d8817e4Smiod  while (0)
163*3d8817e4Smiod
164*3d8817e4Smiod/* Print a 'pof:' prefix to an operand.  */
165*3d8817e4Smiod
166*3d8817e4Smiodstatic void
167*3d8817e4Smiodprint_pof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
168*3d8817e4Smiod	   void * dis_info ATTRIBUTE_UNUSED,
169*3d8817e4Smiod	   long value ATTRIBUTE_UNUSED,
170*3d8817e4Smiod	   unsigned int attrs ATTRIBUTE_UNUSED,
171*3d8817e4Smiod	   bfd_vma pc ATTRIBUTE_UNUSED,
172*3d8817e4Smiod	   int length ATTRIBUTE_UNUSED)
173*3d8817e4Smiod{
174*3d8817e4Smiod}
175*3d8817e4Smiod
176*3d8817e4Smiod/* Print a 'pag:' prefix to an operand.  */
177*3d8817e4Smiod
178*3d8817e4Smiodstatic void
179*3d8817e4Smiodprint_pag (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
180*3d8817e4Smiod	   void * dis_info ATTRIBUTE_UNUSED,
181*3d8817e4Smiod	   long value ATTRIBUTE_UNUSED,
182*3d8817e4Smiod	   unsigned int attrs ATTRIBUTE_UNUSED,
183*3d8817e4Smiod	   bfd_vma pc ATTRIBUTE_UNUSED,
184*3d8817e4Smiod	   int length ATTRIBUTE_UNUSED)
185*3d8817e4Smiod{
186*3d8817e4Smiod}
187*3d8817e4Smiod
188*3d8817e4Smiod/* Print a 'sof:' prefix to an operand.  */
189*3d8817e4Smiod
190*3d8817e4Smiodstatic void
191*3d8817e4Smiodprint_sof (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
192*3d8817e4Smiod	   void * dis_info,
193*3d8817e4Smiod	   long value ATTRIBUTE_UNUSED,
194*3d8817e4Smiod	   unsigned int attrs ATTRIBUTE_UNUSED,
195*3d8817e4Smiod	   bfd_vma pc ATTRIBUTE_UNUSED,
196*3d8817e4Smiod	   int length ATTRIBUTE_UNUSED)
197*3d8817e4Smiod{
198*3d8817e4Smiod  disassemble_info *info = (disassemble_info *) dis_info;
199*3d8817e4Smiod
200*3d8817e4Smiod  info->fprintf_func (info->stream, "sof:");
201*3d8817e4Smiod}
202*3d8817e4Smiod
203*3d8817e4Smiod/* Print a 'seg:' prefix to an operand.  */
204*3d8817e4Smiod
205*3d8817e4Smiodstatic void
206*3d8817e4Smiodprint_seg (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
207*3d8817e4Smiod	   void * dis_info,
208*3d8817e4Smiod	   long value ATTRIBUTE_UNUSED,
209*3d8817e4Smiod	   unsigned int attrs ATTRIBUTE_UNUSED,
210*3d8817e4Smiod	   bfd_vma pc ATTRIBUTE_UNUSED,
211*3d8817e4Smiod	   int length ATTRIBUTE_UNUSED)
212*3d8817e4Smiod{
213*3d8817e4Smiod  disassemble_info *info = (disassemble_info *) dis_info;
214*3d8817e4Smiod
215*3d8817e4Smiod  info->fprintf_func (info->stream, "seg:");
216*3d8817e4Smiod}
217*3d8817e4Smiod
218*3d8817e4Smiod/* Print a '#' prefix to an operand.  */
219*3d8817e4Smiod
220*3d8817e4Smiodstatic void
221*3d8817e4Smiodprint_hash (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
222*3d8817e4Smiod	    void * dis_info,
223*3d8817e4Smiod	    long value ATTRIBUTE_UNUSED,
224*3d8817e4Smiod	    unsigned int attrs ATTRIBUTE_UNUSED,
225*3d8817e4Smiod	    bfd_vma pc ATTRIBUTE_UNUSED,
226*3d8817e4Smiod	    int length ATTRIBUTE_UNUSED)
227*3d8817e4Smiod{
228*3d8817e4Smiod  disassemble_info *info = (disassemble_info *) dis_info;
229*3d8817e4Smiod
230*3d8817e4Smiod  info->fprintf_func (info->stream, "#");
231*3d8817e4Smiod}
232*3d8817e4Smiod
233*3d8817e4Smiod/* Print a '.' prefix to an operand.  */
234*3d8817e4Smiod
235*3d8817e4Smiodstatic void
236*3d8817e4Smiodprint_dot (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
237*3d8817e4Smiod	   void * dis_info ATTRIBUTE_UNUSED,
238*3d8817e4Smiod	   long value ATTRIBUTE_UNUSED,
239*3d8817e4Smiod	   unsigned int attrs ATTRIBUTE_UNUSED,
240*3d8817e4Smiod	   bfd_vma pc ATTRIBUTE_UNUSED,
241*3d8817e4Smiod	   int length ATTRIBUTE_UNUSED)
242*3d8817e4Smiod{
243*3d8817e4Smiod}
244*3d8817e4Smiod
245*3d8817e4Smiod/* -- */
246