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