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