1214571Sdim/* Instruction building/extraction support for mep. -*- C -*- 2214571Sdim 3214571Sdim THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator. 4214571Sdim - the resultant file is machine generated, cgen-ibld.in isn't 5214571Sdim 6214571Sdim Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006 7214571Sdim Free Software Foundation, Inc. 8214571Sdim 9214571Sdim This file is part of the GNU Binutils and GDB, the GNU debugger. 10214571Sdim 11214571Sdim This program is free software; you can redistribute it and/or modify 12214571Sdim it under the terms of the GNU General Public License as published by 13214571Sdim the Free Software Foundation; either version 2, or (at your option) 14214571Sdim any later version. 15214571Sdim 16214571Sdim This program is distributed in the hope that it will be useful, 17214571Sdim but WITHOUT ANY WARRANTY; without even the implied warranty of 18214571Sdim MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19214571Sdim GNU General Public License for more details. 20214571Sdim 21214571Sdim You should have received a copy of the GNU General Public License 22214571Sdim along with this program; if not, write to the Free Software Foundation, Inc., 23214571Sdim 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 24214571Sdim 25214571Sdim/* ??? Eventually more and more of this stuff can go to cpu-independent files. 26214571Sdim Keep that in mind. */ 27214571Sdim 28214571Sdim#include "sysdep.h" 29214571Sdim#include <stdio.h> 30214571Sdim#include "ansidecl.h" 31214571Sdim#include "dis-asm.h" 32214571Sdim#include "bfd.h" 33214571Sdim#include "symcat.h" 34214571Sdim#include "mep-desc.h" 35214571Sdim#include "mep-opc.h" 36214571Sdim#include "opintl.h" 37214571Sdim#include "safe-ctype.h" 38214571Sdim 39214571Sdim#undef min 40214571Sdim#define min(a,b) ((a) < (b) ? (a) : (b)) 41214571Sdim#undef max 42214571Sdim#define max(a,b) ((a) > (b) ? (a) : (b)) 43214571Sdim 44214571Sdim/* Used by the ifield rtx function. */ 45214571Sdim#define FLD(f) (fields->f) 46214571Sdim 47214571Sdimstatic const char * insert_normal 48214571Sdim (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int, 49214571Sdim unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR); 50214571Sdimstatic const char * insert_insn_normal 51214571Sdim (CGEN_CPU_DESC, const CGEN_INSN *, 52214571Sdim CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma); 53214571Sdimstatic int extract_normal 54214571Sdim (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, 55214571Sdim unsigned int, unsigned int, unsigned int, unsigned int, 56214571Sdim unsigned int, unsigned int, bfd_vma, long *); 57214571Sdimstatic int extract_insn_normal 58214571Sdim (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *, 59214571Sdim CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma); 60214571Sdim#if CGEN_INT_INSN_P 61214571Sdimstatic void put_insn_int_value 62214571Sdim (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT); 63214571Sdim#endif 64214571Sdim#if ! CGEN_INT_INSN_P 65214571Sdimstatic CGEN_INLINE void insert_1 66214571Sdim (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *); 67214571Sdimstatic CGEN_INLINE int fill_cache 68214571Sdim (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma); 69214571Sdimstatic CGEN_INLINE long extract_1 70214571Sdim (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma); 71214571Sdim#endif 72214571Sdim 73214571Sdim/* Operand insertion. */ 74214571Sdim 75214571Sdim#if ! CGEN_INT_INSN_P 76214571Sdim 77214571Sdim/* Subroutine of insert_normal. */ 78214571Sdim 79214571Sdimstatic CGEN_INLINE void 80214571Sdiminsert_1 (CGEN_CPU_DESC cd, 81214571Sdim unsigned long value, 82214571Sdim int start, 83214571Sdim int length, 84214571Sdim int word_length, 85214571Sdim unsigned char *bufp) 86214571Sdim{ 87214571Sdim unsigned long x,mask; 88214571Sdim int shift; 89214571Sdim 90214571Sdim x = cgen_get_insn_value (cd, bufp, word_length); 91214571Sdim 92214571Sdim /* Written this way to avoid undefined behaviour. */ 93214571Sdim mask = (((1L << (length - 1)) - 1) << 1) | 1; 94214571Sdim if (CGEN_INSN_LSB0_P) 95214571Sdim shift = (start + 1) - length; 96214571Sdim else 97214571Sdim shift = (word_length - (start + length)); 98214571Sdim x = (x & ~(mask << shift)) | ((value & mask) << shift); 99214571Sdim 100214571Sdim cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x); 101214571Sdim} 102214571Sdim 103214571Sdim#endif /* ! CGEN_INT_INSN_P */ 104214571Sdim 105214571Sdim/* Default insertion routine. 106214571Sdim 107214571Sdim ATTRS is a mask of the boolean attributes. 108214571Sdim WORD_OFFSET is the offset in bits from the start of the insn of the value. 109214571Sdim WORD_LENGTH is the length of the word in bits in which the value resides. 110214571Sdim START is the starting bit number in the word, architecture origin. 111214571Sdim LENGTH is the length of VALUE in bits. 112214571Sdim TOTAL_LENGTH is the total length of the insn in bits. 113214571Sdim 114214571Sdim The result is an error message or NULL if success. */ 115214571Sdim 116214571Sdim/* ??? This duplicates functionality with bfd's howto table and 117214571Sdim bfd_install_relocation. */ 118214571Sdim/* ??? This doesn't handle bfd_vma's. Create another function when 119214571Sdim necessary. */ 120214571Sdim 121214571Sdimstatic const char * 122214571Sdiminsert_normal (CGEN_CPU_DESC cd, 123214571Sdim long value, 124214571Sdim unsigned int attrs, 125214571Sdim unsigned int word_offset, 126214571Sdim unsigned int start, 127214571Sdim unsigned int length, 128214571Sdim unsigned int word_length, 129214571Sdim unsigned int total_length, 130214571Sdim CGEN_INSN_BYTES_PTR buffer) 131214571Sdim{ 132214571Sdim static char errbuf[100]; 133214571Sdim /* Written this way to avoid undefined behaviour. */ 134214571Sdim unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1; 135214571Sdim 136214571Sdim /* If LENGTH is zero, this operand doesn't contribute to the value. */ 137214571Sdim if (length == 0) 138214571Sdim return NULL; 139214571Sdim 140214571Sdim if (word_length > 32) 141214571Sdim abort (); 142214571Sdim 143214571Sdim /* For architectures with insns smaller than the base-insn-bitsize, 144214571Sdim word_length may be too big. */ 145214571Sdim if (cd->min_insn_bitsize < cd->base_insn_bitsize) 146214571Sdim { 147214571Sdim if (word_offset == 0 148214571Sdim && word_length > total_length) 149214571Sdim word_length = total_length; 150214571Sdim } 151214571Sdim 152214571Sdim /* Ensure VALUE will fit. */ 153214571Sdim if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT)) 154214571Sdim { 155214571Sdim long minval = - (1L << (length - 1)); 156214571Sdim unsigned long maxval = mask; 157214571Sdim 158214571Sdim if ((value > 0 && (unsigned long) value > maxval) 159214571Sdim || value < minval) 160214571Sdim { 161214571Sdim /* xgettext:c-format */ 162214571Sdim sprintf (errbuf, 163214571Sdim _("operand out of range (%ld not between %ld and %lu)"), 164214571Sdim value, minval, maxval); 165214571Sdim return errbuf; 166214571Sdim } 167214571Sdim } 168214571Sdim else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)) 169214571Sdim { 170214571Sdim unsigned long maxval = mask; 171214571Sdim unsigned long val = (unsigned long) value; 172214571Sdim 173214571Sdim /* For hosts with a word size > 32 check to see if value has been sign 174214571Sdim extended beyond 32 bits. If so then ignore these higher sign bits 175214571Sdim as the user is attempting to store a 32-bit signed value into an 176214571Sdim unsigned 32-bit field which is allowed. */ 177214571Sdim if (sizeof (unsigned long) > 4 && ((value >> 32) == -1)) 178214571Sdim val &= 0xFFFFFFFF; 179214571Sdim 180214571Sdim if (val > maxval) 181214571Sdim { 182214571Sdim /* xgettext:c-format */ 183214571Sdim sprintf (errbuf, 184214571Sdim _("operand out of range (0x%lx not between 0 and 0x%lx)"), 185214571Sdim val, maxval); 186214571Sdim return errbuf; 187214571Sdim } 188214571Sdim } 189214571Sdim else 190214571Sdim { 191214571Sdim if (! cgen_signed_overflow_ok_p (cd)) 192214571Sdim { 193214571Sdim long minval = - (1L << (length - 1)); 194214571Sdim long maxval = (1L << (length - 1)) - 1; 195214571Sdim 196214571Sdim if (value < minval || value > maxval) 197214571Sdim { 198214571Sdim sprintf 199214571Sdim /* xgettext:c-format */ 200214571Sdim (errbuf, _("operand out of range (%ld not between %ld and %ld)"), 201214571Sdim value, minval, maxval); 202214571Sdim return errbuf; 203214571Sdim } 204214571Sdim } 205214571Sdim } 206214571Sdim 207214571Sdim#if CGEN_INT_INSN_P 208214571Sdim 209214571Sdim { 210214571Sdim int shift; 211214571Sdim 212214571Sdim if (CGEN_INSN_LSB0_P) 213214571Sdim shift = (word_offset + start + 1) - length; 214214571Sdim else 215214571Sdim shift = total_length - (word_offset + start + length); 216214571Sdim *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift); 217214571Sdim } 218214571Sdim 219214571Sdim#else /* ! CGEN_INT_INSN_P */ 220214571Sdim 221214571Sdim { 222214571Sdim unsigned char *bufp = (unsigned char *) buffer + word_offset / 8; 223214571Sdim 224214571Sdim insert_1 (cd, value, start, length, word_length, bufp); 225214571Sdim } 226214571Sdim 227214571Sdim#endif /* ! CGEN_INT_INSN_P */ 228214571Sdim 229214571Sdim return NULL; 230214571Sdim} 231214571Sdim 232214571Sdim/* Default insn builder (insert handler). 233214571Sdim The instruction is recorded in CGEN_INT_INSN_P byte order (meaning 234214571Sdim that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is 235214571Sdim recorded in host byte order, otherwise BUFFER is an array of bytes 236214571Sdim and the value is recorded in target byte order). 237214571Sdim The result is an error message or NULL if success. */ 238214571Sdim 239214571Sdimstatic const char * 240214571Sdiminsert_insn_normal (CGEN_CPU_DESC cd, 241214571Sdim const CGEN_INSN * insn, 242214571Sdim CGEN_FIELDS * fields, 243214571Sdim CGEN_INSN_BYTES_PTR buffer, 244214571Sdim bfd_vma pc) 245214571Sdim{ 246214571Sdim const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 247214571Sdim unsigned long value; 248214571Sdim const CGEN_SYNTAX_CHAR_TYPE * syn; 249214571Sdim 250214571Sdim CGEN_INIT_INSERT (cd); 251214571Sdim value = CGEN_INSN_BASE_VALUE (insn); 252214571Sdim 253214571Sdim /* If we're recording insns as numbers (rather than a string of bytes), 254214571Sdim target byte order handling is deferred until later. */ 255214571Sdim 256214571Sdim#if CGEN_INT_INSN_P 257214571Sdim 258214571Sdim put_insn_int_value (cd, buffer, cd->base_insn_bitsize, 259214571Sdim CGEN_FIELDS_BITSIZE (fields), value); 260214571Sdim 261214571Sdim#else 262214571Sdim 263214571Sdim cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize, 264214571Sdim (unsigned) CGEN_FIELDS_BITSIZE (fields)), 265214571Sdim value); 266214571Sdim 267214571Sdim#endif /* ! CGEN_INT_INSN_P */ 268214571Sdim 269214571Sdim /* ??? It would be better to scan the format's fields. 270214571Sdim Still need to be able to insert a value based on the operand though; 271214571Sdim e.g. storing a branch displacement that got resolved later. 272214571Sdim Needs more thought first. */ 273214571Sdim 274214571Sdim for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn) 275214571Sdim { 276214571Sdim const char *errmsg; 277214571Sdim 278214571Sdim if (CGEN_SYNTAX_CHAR_P (* syn)) 279214571Sdim continue; 280214571Sdim 281214571Sdim errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 282214571Sdim fields, buffer, pc); 283214571Sdim if (errmsg) 284214571Sdim return errmsg; 285214571Sdim } 286214571Sdim 287214571Sdim return NULL; 288214571Sdim} 289214571Sdim 290214571Sdim#if CGEN_INT_INSN_P 291214571Sdim/* Cover function to store an insn value into an integral insn. Must go here 292214571Sdim because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */ 293214571Sdim 294214571Sdimstatic void 295214571Sdimput_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 296214571Sdim CGEN_INSN_BYTES_PTR buf, 297214571Sdim int length, 298214571Sdim int insn_length, 299214571Sdim CGEN_INSN_INT value) 300214571Sdim{ 301214571Sdim /* For architectures with insns smaller than the base-insn-bitsize, 302214571Sdim length may be too big. */ 303214571Sdim if (length > insn_length) 304214571Sdim *buf = value; 305214571Sdim else 306214571Sdim { 307214571Sdim int shift = insn_length - length; 308214571Sdim /* Written this way to avoid undefined behaviour. */ 309214571Sdim CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1; 310214571Sdim 311214571Sdim *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift); 312214571Sdim } 313214571Sdim} 314214571Sdim#endif 315214571Sdim 316214571Sdim/* Operand extraction. */ 317214571Sdim 318214571Sdim#if ! CGEN_INT_INSN_P 319214571Sdim 320214571Sdim/* Subroutine of extract_normal. 321214571Sdim Ensure sufficient bytes are cached in EX_INFO. 322214571Sdim OFFSET is the offset in bytes from the start of the insn of the value. 323214571Sdim BYTES is the length of the needed value. 324214571Sdim Returns 1 for success, 0 for failure. */ 325214571Sdim 326214571Sdimstatic CGEN_INLINE int 327214571Sdimfill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 328214571Sdim CGEN_EXTRACT_INFO *ex_info, 329214571Sdim int offset, 330214571Sdim int bytes, 331214571Sdim bfd_vma pc) 332214571Sdim{ 333214571Sdim /* It's doubtful that the middle part has already been fetched so 334214571Sdim we don't optimize that case. kiss. */ 335214571Sdim unsigned int mask; 336214571Sdim disassemble_info *info = (disassemble_info *) ex_info->dis_info; 337214571Sdim 338214571Sdim /* First do a quick check. */ 339214571Sdim mask = (1 << bytes) - 1; 340214571Sdim if (((ex_info->valid >> offset) & mask) == mask) 341214571Sdim return 1; 342214571Sdim 343214571Sdim /* Search for the first byte we need to read. */ 344214571Sdim for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1) 345214571Sdim if (! (mask & ex_info->valid)) 346214571Sdim break; 347214571Sdim 348214571Sdim if (bytes) 349214571Sdim { 350214571Sdim int status; 351214571Sdim 352214571Sdim pc += offset; 353214571Sdim status = (*info->read_memory_func) 354214571Sdim (pc, ex_info->insn_bytes + offset, bytes, info); 355214571Sdim 356214571Sdim if (status != 0) 357214571Sdim { 358214571Sdim (*info->memory_error_func) (status, pc, info); 359214571Sdim return 0; 360214571Sdim } 361214571Sdim 362214571Sdim ex_info->valid |= ((1 << bytes) - 1) << offset; 363214571Sdim } 364214571Sdim 365214571Sdim return 1; 366214571Sdim} 367214571Sdim 368214571Sdim/* Subroutine of extract_normal. */ 369214571Sdim 370214571Sdimstatic CGEN_INLINE long 371214571Sdimextract_1 (CGEN_CPU_DESC cd, 372214571Sdim CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 373214571Sdim int start, 374214571Sdim int length, 375214571Sdim int word_length, 376214571Sdim unsigned char *bufp, 377214571Sdim bfd_vma pc ATTRIBUTE_UNUSED) 378214571Sdim{ 379214571Sdim unsigned long x; 380214571Sdim int shift; 381214571Sdim 382214571Sdim x = cgen_get_insn_value (cd, bufp, word_length); 383214571Sdim 384214571Sdim if (CGEN_INSN_LSB0_P) 385214571Sdim shift = (start + 1) - length; 386214571Sdim else 387214571Sdim shift = (word_length - (start + length)); 388214571Sdim return x >> shift; 389214571Sdim} 390214571Sdim 391214571Sdim#endif /* ! CGEN_INT_INSN_P */ 392214571Sdim 393214571Sdim/* Default extraction routine. 394214571Sdim 395214571Sdim INSN_VALUE is the first base_insn_bitsize bits of the insn in host order, 396214571Sdim or sometimes less for cases like the m32r where the base insn size is 32 397214571Sdim but some insns are 16 bits. 398214571Sdim ATTRS is a mask of the boolean attributes. We only need `SIGNED', 399214571Sdim but for generality we take a bitmask of all of them. 400214571Sdim WORD_OFFSET is the offset in bits from the start of the insn of the value. 401214571Sdim WORD_LENGTH is the length of the word in bits in which the value resides. 402214571Sdim START is the starting bit number in the word, architecture origin. 403214571Sdim LENGTH is the length of VALUE in bits. 404214571Sdim TOTAL_LENGTH is the total length of the insn in bits. 405214571Sdim 406214571Sdim Returns 1 for success, 0 for failure. */ 407214571Sdim 408214571Sdim/* ??? The return code isn't properly used. wip. */ 409214571Sdim 410214571Sdim/* ??? This doesn't handle bfd_vma's. Create another function when 411214571Sdim necessary. */ 412214571Sdim 413214571Sdimstatic int 414214571Sdimextract_normal (CGEN_CPU_DESC cd, 415214571Sdim#if ! CGEN_INT_INSN_P 416214571Sdim CGEN_EXTRACT_INFO *ex_info, 417214571Sdim#else 418214571Sdim CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 419214571Sdim#endif 420214571Sdim CGEN_INSN_INT insn_value, 421214571Sdim unsigned int attrs, 422214571Sdim unsigned int word_offset, 423214571Sdim unsigned int start, 424214571Sdim unsigned int length, 425214571Sdim unsigned int word_length, 426214571Sdim unsigned int total_length, 427214571Sdim#if ! CGEN_INT_INSN_P 428214571Sdim bfd_vma pc, 429214571Sdim#else 430214571Sdim bfd_vma pc ATTRIBUTE_UNUSED, 431214571Sdim#endif 432214571Sdim long *valuep) 433214571Sdim{ 434214571Sdim long value, mask; 435214571Sdim 436214571Sdim /* If LENGTH is zero, this operand doesn't contribute to the value 437214571Sdim so give it a standard value of zero. */ 438214571Sdim if (length == 0) 439214571Sdim { 440214571Sdim *valuep = 0; 441214571Sdim return 1; 442214571Sdim } 443214571Sdim 444214571Sdim if (word_length > 32) 445214571Sdim abort (); 446214571Sdim 447214571Sdim /* For architectures with insns smaller than the insn-base-bitsize, 448214571Sdim word_length may be too big. */ 449214571Sdim if (cd->min_insn_bitsize < cd->base_insn_bitsize) 450214571Sdim { 451214571Sdim if (word_offset + word_length > total_length) 452214571Sdim word_length = total_length - word_offset; 453214571Sdim } 454214571Sdim 455214571Sdim /* Does the value reside in INSN_VALUE, and at the right alignment? */ 456214571Sdim 457214571Sdim if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length)) 458214571Sdim { 459214571Sdim if (CGEN_INSN_LSB0_P) 460214571Sdim value = insn_value >> ((word_offset + start + 1) - length); 461214571Sdim else 462214571Sdim value = insn_value >> (total_length - ( word_offset + start + length)); 463214571Sdim } 464214571Sdim 465214571Sdim#if ! CGEN_INT_INSN_P 466214571Sdim 467214571Sdim else 468214571Sdim { 469214571Sdim unsigned char *bufp = ex_info->insn_bytes + word_offset / 8; 470214571Sdim 471214571Sdim if (word_length > 32) 472214571Sdim abort (); 473214571Sdim 474214571Sdim if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0) 475214571Sdim return 0; 476214571Sdim 477214571Sdim value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc); 478214571Sdim } 479214571Sdim 480214571Sdim#endif /* ! CGEN_INT_INSN_P */ 481214571Sdim 482214571Sdim /* Written this way to avoid undefined behaviour. */ 483214571Sdim mask = (((1L << (length - 1)) - 1) << 1) | 1; 484214571Sdim 485214571Sdim value &= mask; 486214571Sdim /* sign extend? */ 487214571Sdim if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED) 488214571Sdim && (value & (1L << (length - 1)))) 489214571Sdim value |= ~mask; 490214571Sdim 491214571Sdim *valuep = value; 492214571Sdim 493214571Sdim return 1; 494214571Sdim} 495214571Sdim 496214571Sdim/* Default insn extractor. 497214571Sdim 498214571Sdim INSN_VALUE is the first base_insn_bitsize bits, translated to host order. 499214571Sdim The extracted fields are stored in FIELDS. 500214571Sdim EX_INFO is used to handle reading variable length insns. 501214571Sdim Return the length of the insn in bits, or 0 if no match, 502214571Sdim or -1 if an error occurs fetching data (memory_error_func will have 503214571Sdim been called). */ 504214571Sdim 505214571Sdimstatic int 506214571Sdimextract_insn_normal (CGEN_CPU_DESC cd, 507214571Sdim const CGEN_INSN *insn, 508214571Sdim CGEN_EXTRACT_INFO *ex_info, 509214571Sdim CGEN_INSN_INT insn_value, 510214571Sdim CGEN_FIELDS *fields, 511214571Sdim bfd_vma pc) 512214571Sdim{ 513214571Sdim const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 514214571Sdim const CGEN_SYNTAX_CHAR_TYPE *syn; 515214571Sdim 516214571Sdim CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn); 517214571Sdim 518214571Sdim CGEN_INIT_EXTRACT (cd); 519214571Sdim 520214571Sdim for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn) 521214571Sdim { 522214571Sdim int length; 523214571Sdim 524214571Sdim if (CGEN_SYNTAX_CHAR_P (*syn)) 525214571Sdim continue; 526214571Sdim 527214571Sdim length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 528214571Sdim ex_info, insn_value, fields, pc); 529214571Sdim if (length <= 0) 530214571Sdim return length; 531214571Sdim } 532214571Sdim 533214571Sdim /* We recognized and successfully extracted this insn. */ 534214571Sdim return CGEN_INSN_BITSIZE (insn); 535214571Sdim} 536214571Sdim 537214571Sdim/* Machine generated code added here. */ 538214571Sdim 539214571Sdimconst char * mep_cgen_insert_operand 540214571Sdim (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma); 541214571Sdim 542214571Sdim/* Main entry point for operand insertion. 543214571Sdim 544214571Sdim This function is basically just a big switch statement. Earlier versions 545214571Sdim used tables to look up the function to use, but 546214571Sdim - if the table contains both assembler and disassembler functions then 547214571Sdim the disassembler contains much of the assembler and vice-versa, 548214571Sdim - there's a lot of inlining possibilities as things grow, 549214571Sdim - using a switch statement avoids the function call overhead. 550214571Sdim 551214571Sdim This function could be moved into `parse_insn_normal', but keeping it 552214571Sdim separate makes clear the interface between `parse_insn_normal' and each of 553214571Sdim the handlers. It's also needed by GAS to insert operands that couldn't be 554214571Sdim resolved during parsing. */ 555214571Sdim 556214571Sdimconst char * 557214571Sdimmep_cgen_insert_operand (CGEN_CPU_DESC cd, 558214571Sdim int opindex, 559214571Sdim CGEN_FIELDS * fields, 560214571Sdim CGEN_INSN_BYTES_PTR buffer, 561214571Sdim bfd_vma pc ATTRIBUTE_UNUSED) 562214571Sdim{ 563214571Sdim const char * errmsg = NULL; 564214571Sdim unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 565214571Sdim 566214571Sdim switch (opindex) 567214571Sdim { 568214571Sdim case MEP_OPERAND_ADDR24A4 : 569214571Sdim { 570214571Sdim{ 571214571Sdim FLD (f_24u8a4n_hi) = ((unsigned int) (FLD (f_24u8a4n)) >> (8)); 572214571Sdim FLD (f_24u8a4n_lo) = ((unsigned int) (((FLD (f_24u8a4n)) & (252))) >> (2)); 573214571Sdim} 574214571Sdim errmsg = insert_normal (cd, fields->f_24u8a4n_hi, 0, 0, 16, 16, 32, total_length, buffer); 575214571Sdim if (errmsg) 576214571Sdim break; 577214571Sdim errmsg = insert_normal (cd, fields->f_24u8a4n_lo, 0, 0, 8, 6, 32, total_length, buffer); 578214571Sdim if (errmsg) 579214571Sdim break; 580214571Sdim } 581214571Sdim break; 582214571Sdim case MEP_OPERAND_CALLNUM : 583214571Sdim { 584214571Sdim{ 585214571Sdim FLD (f_5) = ((((unsigned int) (FLD (f_callnum)) >> (3))) & (1)); 586214571Sdim FLD (f_6) = ((((unsigned int) (FLD (f_callnum)) >> (2))) & (1)); 587214571Sdim FLD (f_7) = ((((unsigned int) (FLD (f_callnum)) >> (1))) & (1)); 588214571Sdim FLD (f_11) = ((FLD (f_callnum)) & (1)); 589214571Sdim} 590214571Sdim errmsg = insert_normal (cd, fields->f_5, 0, 0, 5, 1, 32, total_length, buffer); 591214571Sdim if (errmsg) 592214571Sdim break; 593214571Sdim errmsg = insert_normal (cd, fields->f_6, 0, 0, 6, 1, 32, total_length, buffer); 594214571Sdim if (errmsg) 595214571Sdim break; 596214571Sdim errmsg = insert_normal (cd, fields->f_7, 0, 0, 7, 1, 32, total_length, buffer); 597214571Sdim if (errmsg) 598214571Sdim break; 599214571Sdim errmsg = insert_normal (cd, fields->f_11, 0, 0, 11, 1, 32, total_length, buffer); 600214571Sdim if (errmsg) 601214571Sdim break; 602214571Sdim } 603214571Sdim break; 604214571Sdim case MEP_OPERAND_CCCC : 605214571Sdim errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 606214571Sdim break; 607214571Sdim case MEP_OPERAND_CCRN : 608214571Sdim { 609214571Sdim{ 610214571Sdim FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3)); 611214571Sdim FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15)); 612214571Sdim} 613214571Sdim errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer); 614214571Sdim if (errmsg) 615214571Sdim break; 616214571Sdim errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer); 617214571Sdim if (errmsg) 618214571Sdim break; 619214571Sdim } 620214571Sdim break; 621214571Sdim case MEP_OPERAND_CDISP8 : 622214571Sdim errmsg = insert_normal (cd, fields->f_8s24, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, buffer); 623214571Sdim break; 624214571Sdim case MEP_OPERAND_CDISP8A2 : 625214571Sdim { 626214571Sdim long value = fields->f_8s24a2; 627214571Sdim value = ((int) (value) >> (1)); 628214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, buffer); 629214571Sdim } 630214571Sdim break; 631214571Sdim case MEP_OPERAND_CDISP8A4 : 632214571Sdim { 633214571Sdim long value = fields->f_8s24a4; 634214571Sdim value = ((int) (value) >> (2)); 635214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, buffer); 636214571Sdim } 637214571Sdim break; 638214571Sdim case MEP_OPERAND_CDISP8A8 : 639214571Sdim { 640214571Sdim long value = fields->f_8s24a8; 641214571Sdim value = ((int) (value) >> (3)); 642214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, buffer); 643214571Sdim } 644214571Sdim break; 645214571Sdim case MEP_OPERAND_CIMM4 : 646214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 647214571Sdim break; 648214571Sdim case MEP_OPERAND_CIMM5 : 649214571Sdim errmsg = insert_normal (cd, fields->f_5u24, 0, 0, 24, 5, 32, total_length, buffer); 650214571Sdim break; 651214571Sdim case MEP_OPERAND_CODE16 : 652214571Sdim errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer); 653214571Sdim break; 654214571Sdim case MEP_OPERAND_CODE24 : 655214571Sdim { 656214571Sdim{ 657214571Sdim FLD (f_24u4n_hi) = ((unsigned int) (FLD (f_24u4n)) >> (16)); 658214571Sdim FLD (f_24u4n_lo) = ((FLD (f_24u4n)) & (65535)); 659214571Sdim} 660214571Sdim errmsg = insert_normal (cd, fields->f_24u4n_hi, 0, 0, 4, 8, 32, total_length, buffer); 661214571Sdim if (errmsg) 662214571Sdim break; 663214571Sdim errmsg = insert_normal (cd, fields->f_24u4n_lo, 0, 0, 16, 16, 32, total_length, buffer); 664214571Sdim if (errmsg) 665214571Sdim break; 666214571Sdim } 667214571Sdim break; 668214571Sdim case MEP_OPERAND_CP_FLAG : 669214571Sdim break; 670214571Sdim case MEP_OPERAND_CRN : 671214571Sdim errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer); 672214571Sdim break; 673214571Sdim case MEP_OPERAND_CRN64 : 674214571Sdim errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer); 675214571Sdim break; 676214571Sdim case MEP_OPERAND_CRNX : 677214571Sdim { 678214571Sdim{ 679214571Sdim FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15)); 680214571Sdim FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4)); 681214571Sdim} 682214571Sdim errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer); 683214571Sdim if (errmsg) 684214571Sdim break; 685214571Sdim errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer); 686214571Sdim if (errmsg) 687214571Sdim break; 688214571Sdim } 689214571Sdim break; 690214571Sdim case MEP_OPERAND_CRNX64 : 691214571Sdim { 692214571Sdim{ 693214571Sdim FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15)); 694214571Sdim FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4)); 695214571Sdim} 696214571Sdim errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer); 697214571Sdim if (errmsg) 698214571Sdim break; 699214571Sdim errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer); 700214571Sdim if (errmsg) 701214571Sdim break; 702214571Sdim } 703214571Sdim break; 704214571Sdim case MEP_OPERAND_CSRN : 705214571Sdim { 706214571Sdim{ 707214571Sdim FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15)); 708214571Sdim FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4)); 709214571Sdim} 710214571Sdim errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer); 711214571Sdim if (errmsg) 712214571Sdim break; 713214571Sdim errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer); 714214571Sdim if (errmsg) 715214571Sdim break; 716214571Sdim } 717214571Sdim break; 718214571Sdim case MEP_OPERAND_CSRN_IDX : 719214571Sdim { 720214571Sdim{ 721214571Sdim FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15)); 722214571Sdim FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4)); 723214571Sdim} 724214571Sdim errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer); 725214571Sdim if (errmsg) 726214571Sdim break; 727214571Sdim errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer); 728214571Sdim if (errmsg) 729214571Sdim break; 730214571Sdim } 731214571Sdim break; 732214571Sdim case MEP_OPERAND_DBG : 733214571Sdim break; 734214571Sdim case MEP_OPERAND_DEPC : 735214571Sdim break; 736214571Sdim case MEP_OPERAND_EPC : 737214571Sdim break; 738214571Sdim case MEP_OPERAND_EXC : 739214571Sdim break; 740214571Sdim case MEP_OPERAND_FMAX_CCRN : 741214571Sdim errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 742214571Sdim break; 743214571Sdim case MEP_OPERAND_FMAX_FRD : 744214571Sdim { 745214571Sdim{ 746214571Sdim FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15)); 747214571Sdim FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4)); 748214571Sdim} 749214571Sdim errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer); 750214571Sdim if (errmsg) 751214571Sdim break; 752214571Sdim errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 753214571Sdim if (errmsg) 754214571Sdim break; 755214571Sdim } 756214571Sdim break; 757214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 758214571Sdim { 759214571Sdim{ 760214571Sdim FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15)); 761214571Sdim FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4)); 762214571Sdim} 763214571Sdim errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer); 764214571Sdim if (errmsg) 765214571Sdim break; 766214571Sdim errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 767214571Sdim if (errmsg) 768214571Sdim break; 769214571Sdim } 770214571Sdim break; 771214571Sdim case MEP_OPERAND_FMAX_FRM : 772214571Sdim { 773214571Sdim{ 774214571Sdim FLD (f_fmax_24_4) = ((FLD (f_fmax_frm)) & (15)); 775214571Sdim FLD (f_fmax_30_1) = ((unsigned int) (FLD (f_fmax_frm)) >> (4)); 776214571Sdim} 777214571Sdim errmsg = insert_normal (cd, fields->f_fmax_30_1, 0, 0, 30, 1, 32, total_length, buffer); 778214571Sdim if (errmsg) 779214571Sdim break; 780214571Sdim errmsg = insert_normal (cd, fields->f_fmax_24_4, 0, 0, 24, 4, 32, total_length, buffer); 781214571Sdim if (errmsg) 782214571Sdim break; 783214571Sdim } 784214571Sdim break; 785214571Sdim case MEP_OPERAND_FMAX_FRN : 786214571Sdim { 787214571Sdim{ 788214571Sdim FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15)); 789214571Sdim FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4)); 790214571Sdim} 791214571Sdim errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer); 792214571Sdim if (errmsg) 793214571Sdim break; 794214571Sdim errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer); 795214571Sdim if (errmsg) 796214571Sdim break; 797214571Sdim } 798214571Sdim break; 799214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 800214571Sdim { 801214571Sdim{ 802214571Sdim FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15)); 803214571Sdim FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4)); 804214571Sdim} 805214571Sdim errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer); 806214571Sdim if (errmsg) 807214571Sdim break; 808214571Sdim errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer); 809214571Sdim if (errmsg) 810214571Sdim break; 811214571Sdim } 812214571Sdim break; 813214571Sdim case MEP_OPERAND_FMAX_RM : 814214571Sdim errmsg = insert_normal (cd, fields->f_fmax_rm, 0, 0, 8, 4, 32, total_length, buffer); 815214571Sdim break; 816214571Sdim case MEP_OPERAND_HI : 817214571Sdim break; 818214571Sdim case MEP_OPERAND_LO : 819214571Sdim break; 820214571Sdim case MEP_OPERAND_LP : 821214571Sdim break; 822214571Sdim case MEP_OPERAND_MB0 : 823214571Sdim break; 824214571Sdim case MEP_OPERAND_MB1 : 825214571Sdim break; 826214571Sdim case MEP_OPERAND_ME0 : 827214571Sdim break; 828214571Sdim case MEP_OPERAND_ME1 : 829214571Sdim break; 830214571Sdim case MEP_OPERAND_NPC : 831214571Sdim break; 832214571Sdim case MEP_OPERAND_OPT : 833214571Sdim break; 834214571Sdim case MEP_OPERAND_PCABS24A2 : 835214571Sdim { 836214571Sdim{ 837214571Sdim FLD (f_24u5a2n_lo) = ((unsigned int) (((FLD (f_24u5a2n)) & (255))) >> (1)); 838214571Sdim FLD (f_24u5a2n_hi) = ((unsigned int) (FLD (f_24u5a2n)) >> (8)); 839214571Sdim} 840214571Sdim errmsg = insert_normal (cd, fields->f_24u5a2n_hi, 0, 0, 16, 16, 32, total_length, buffer); 841214571Sdim if (errmsg) 842214571Sdim break; 843214571Sdim errmsg = insert_normal (cd, fields->f_24u5a2n_lo, 0, 0, 5, 7, 32, total_length, buffer); 844214571Sdim if (errmsg) 845214571Sdim break; 846214571Sdim } 847214571Sdim break; 848214571Sdim case MEP_OPERAND_PCREL12A2 : 849214571Sdim { 850214571Sdim long value = fields->f_12s4a2; 851214571Sdim value = ((int) (((value) - (pc))) >> (1)); 852214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, buffer); 853214571Sdim } 854214571Sdim break; 855214571Sdim case MEP_OPERAND_PCREL17A2 : 856214571Sdim { 857214571Sdim long value = fields->f_17s16a2; 858214571Sdim value = ((int) (((value) - (pc))) >> (1)); 859214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer); 860214571Sdim } 861214571Sdim break; 862214571Sdim case MEP_OPERAND_PCREL24A2 : 863214571Sdim { 864214571Sdim{ 865214571Sdim FLD (f_24s5a2n) = ((FLD (f_24s5a2n)) - (pc)); 866214571Sdim FLD (f_24s5a2n_lo) = ((unsigned int) (((FLD (f_24s5a2n)) & (254))) >> (1)); 867214571Sdim FLD (f_24s5a2n_hi) = ((int) (FLD (f_24s5a2n)) >> (8)); 868214571Sdim} 869214571Sdim errmsg = insert_normal (cd, fields->f_24s5a2n_hi, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer); 870214571Sdim if (errmsg) 871214571Sdim break; 872214571Sdim errmsg = insert_normal (cd, fields->f_24s5a2n_lo, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, buffer); 873214571Sdim if (errmsg) 874214571Sdim break; 875214571Sdim } 876214571Sdim break; 877214571Sdim case MEP_OPERAND_PCREL8A2 : 878214571Sdim { 879214571Sdim long value = fields->f_8s8a2; 880214571Sdim value = ((int) (((value) - (pc))) >> (1)); 881214571Sdim errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, buffer); 882214571Sdim } 883214571Sdim break; 884214571Sdim case MEP_OPERAND_PSW : 885214571Sdim break; 886214571Sdim case MEP_OPERAND_R0 : 887214571Sdim break; 888214571Sdim case MEP_OPERAND_R1 : 889214571Sdim break; 890214571Sdim case MEP_OPERAND_RL : 891214571Sdim errmsg = insert_normal (cd, fields->f_rl, 0, 0, 12, 4, 32, total_length, buffer); 892214571Sdim break; 893214571Sdim case MEP_OPERAND_RM : 894214571Sdim errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 895214571Sdim break; 896214571Sdim case MEP_OPERAND_RMA : 897214571Sdim errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 898214571Sdim break; 899214571Sdim case MEP_OPERAND_RN : 900214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 901214571Sdim break; 902214571Sdim case MEP_OPERAND_RN3 : 903214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 904214571Sdim break; 905214571Sdim case MEP_OPERAND_RN3C : 906214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 907214571Sdim break; 908214571Sdim case MEP_OPERAND_RN3L : 909214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 910214571Sdim break; 911214571Sdim case MEP_OPERAND_RN3S : 912214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 913214571Sdim break; 914214571Sdim case MEP_OPERAND_RN3UC : 915214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 916214571Sdim break; 917214571Sdim case MEP_OPERAND_RN3UL : 918214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 919214571Sdim break; 920214571Sdim case MEP_OPERAND_RN3US : 921214571Sdim errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 922214571Sdim break; 923214571Sdim case MEP_OPERAND_RNC : 924214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 925214571Sdim break; 926214571Sdim case MEP_OPERAND_RNL : 927214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 928214571Sdim break; 929214571Sdim case MEP_OPERAND_RNS : 930214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 931214571Sdim break; 932214571Sdim case MEP_OPERAND_RNUC : 933214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 934214571Sdim break; 935214571Sdim case MEP_OPERAND_RNUL : 936214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 937214571Sdim break; 938214571Sdim case MEP_OPERAND_RNUS : 939214571Sdim errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 940214571Sdim break; 941214571Sdim case MEP_OPERAND_SAR : 942214571Sdim break; 943214571Sdim case MEP_OPERAND_SDISP16 : 944214571Sdim errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer); 945214571Sdim break; 946214571Sdim case MEP_OPERAND_SIMM16 : 947214571Sdim errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer); 948214571Sdim break; 949214571Sdim case MEP_OPERAND_SIMM6 : 950214571Sdim errmsg = insert_normal (cd, fields->f_6s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, buffer); 951214571Sdim break; 952214571Sdim case MEP_OPERAND_SIMM8 : 953214571Sdim errmsg = insert_normal (cd, fields->f_8s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer); 954214571Sdim break; 955214571Sdim case MEP_OPERAND_SP : 956214571Sdim break; 957214571Sdim case MEP_OPERAND_SPR : 958214571Sdim break; 959214571Sdim case MEP_OPERAND_TP : 960214571Sdim break; 961214571Sdim case MEP_OPERAND_TPR : 962214571Sdim break; 963214571Sdim case MEP_OPERAND_UDISP2 : 964214571Sdim errmsg = insert_normal (cd, fields->f_2u6, 0, 0, 6, 2, 32, total_length, buffer); 965214571Sdim break; 966214571Sdim case MEP_OPERAND_UDISP7 : 967214571Sdim errmsg = insert_normal (cd, fields->f_7u9, 0, 0, 9, 7, 32, total_length, buffer); 968214571Sdim break; 969214571Sdim case MEP_OPERAND_UDISP7A2 : 970214571Sdim { 971214571Sdim long value = fields->f_7u9a2; 972214571Sdim value = ((unsigned int) (value) >> (1)); 973214571Sdim errmsg = insert_normal (cd, value, 0, 0, 9, 6, 32, total_length, buffer); 974214571Sdim } 975214571Sdim break; 976214571Sdim case MEP_OPERAND_UDISP7A4 : 977214571Sdim { 978214571Sdim long value = fields->f_7u9a4; 979214571Sdim value = ((unsigned int) (value) >> (2)); 980214571Sdim errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer); 981214571Sdim } 982214571Sdim break; 983214571Sdim case MEP_OPERAND_UIMM16 : 984214571Sdim errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer); 985214571Sdim break; 986214571Sdim case MEP_OPERAND_UIMM2 : 987214571Sdim errmsg = insert_normal (cd, fields->f_2u10, 0, 0, 10, 2, 32, total_length, buffer); 988214571Sdim break; 989214571Sdim case MEP_OPERAND_UIMM24 : 990214571Sdim { 991214571Sdim{ 992214571Sdim FLD (f_24u8n_hi) = ((unsigned int) (FLD (f_24u8n)) >> (8)); 993214571Sdim FLD (f_24u8n_lo) = ((FLD (f_24u8n)) & (255)); 994214571Sdim} 995214571Sdim errmsg = insert_normal (cd, fields->f_24u8n_hi, 0, 0, 16, 16, 32, total_length, buffer); 996214571Sdim if (errmsg) 997214571Sdim break; 998214571Sdim errmsg = insert_normal (cd, fields->f_24u8n_lo, 0, 0, 8, 8, 32, total_length, buffer); 999214571Sdim if (errmsg) 1000214571Sdim break; 1001214571Sdim } 1002214571Sdim break; 1003214571Sdim case MEP_OPERAND_UIMM3 : 1004214571Sdim errmsg = insert_normal (cd, fields->f_3u5, 0, 0, 5, 3, 32, total_length, buffer); 1005214571Sdim break; 1006214571Sdim case MEP_OPERAND_UIMM4 : 1007214571Sdim errmsg = insert_normal (cd, fields->f_4u8, 0, 0, 8, 4, 32, total_length, buffer); 1008214571Sdim break; 1009214571Sdim case MEP_OPERAND_UIMM5 : 1010214571Sdim errmsg = insert_normal (cd, fields->f_5u8, 0, 0, 8, 5, 32, total_length, buffer); 1011214571Sdim break; 1012214571Sdim case MEP_OPERAND_UIMM7A4 : 1013214571Sdim { 1014214571Sdim long value = fields->f_7u9a4; 1015214571Sdim value = ((unsigned int) (value) >> (2)); 1016214571Sdim errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer); 1017214571Sdim } 1018214571Sdim break; 1019214571Sdim case MEP_OPERAND_ZERO : 1020214571Sdim break; 1021214571Sdim 1022214571Sdim default : 1023214571Sdim /* xgettext:c-format */ 1024214571Sdim fprintf (stderr, _("Unrecognized field %d while building insn.\n"), 1025214571Sdim opindex); 1026214571Sdim abort (); 1027214571Sdim } 1028214571Sdim 1029214571Sdim return errmsg; 1030214571Sdim} 1031214571Sdim 1032214571Sdimint mep_cgen_extract_operand 1033214571Sdim (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma); 1034214571Sdim 1035214571Sdim/* Main entry point for operand extraction. 1036214571Sdim The result is <= 0 for error, >0 for success. 1037214571Sdim ??? Actual values aren't well defined right now. 1038214571Sdim 1039214571Sdim This function is basically just a big switch statement. Earlier versions 1040214571Sdim used tables to look up the function to use, but 1041214571Sdim - if the table contains both assembler and disassembler functions then 1042214571Sdim the disassembler contains much of the assembler and vice-versa, 1043214571Sdim - there's a lot of inlining possibilities as things grow, 1044214571Sdim - using a switch statement avoids the function call overhead. 1045214571Sdim 1046214571Sdim This function could be moved into `print_insn_normal', but keeping it 1047214571Sdim separate makes clear the interface between `print_insn_normal' and each of 1048214571Sdim the handlers. */ 1049214571Sdim 1050214571Sdimint 1051214571Sdimmep_cgen_extract_operand (CGEN_CPU_DESC cd, 1052214571Sdim int opindex, 1053214571Sdim CGEN_EXTRACT_INFO *ex_info, 1054214571Sdim CGEN_INSN_INT insn_value, 1055214571Sdim CGEN_FIELDS * fields, 1056214571Sdim bfd_vma pc) 1057214571Sdim{ 1058214571Sdim /* Assume success (for those operands that are nops). */ 1059214571Sdim int length = 1; 1060214571Sdim unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 1061214571Sdim 1062214571Sdim switch (opindex) 1063214571Sdim { 1064214571Sdim case MEP_OPERAND_ADDR24A4 : 1065214571Sdim { 1066214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8a4n_hi); 1067214571Sdim if (length <= 0) break; 1068214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 6, 32, total_length, pc, & fields->f_24u8a4n_lo); 1069214571Sdim if (length <= 0) break; 1070214571Sdim FLD (f_24u8a4n) = ((((FLD (f_24u8a4n_hi)) << (8))) | (((FLD (f_24u8a4n_lo)) << (2)))); 1071214571Sdim } 1072214571Sdim break; 1073214571Sdim case MEP_OPERAND_CALLNUM : 1074214571Sdim { 1075214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_5); 1076214571Sdim if (length <= 0) break; 1077214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_6); 1078214571Sdim if (length <= 0) break; 1079214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_7); 1080214571Sdim if (length <= 0) break; 1081214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_11); 1082214571Sdim if (length <= 0) break; 1083214571Sdim FLD (f_callnum) = ((((FLD (f_5)) << (3))) | (((((FLD (f_6)) << (2))) | (((((FLD (f_7)) << (1))) | (FLD (f_11))))))); 1084214571Sdim } 1085214571Sdim break; 1086214571Sdim case MEP_OPERAND_CCCC : 1087214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 1088214571Sdim break; 1089214571Sdim case MEP_OPERAND_CCRN : 1090214571Sdim { 1091214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi); 1092214571Sdim if (length <= 0) break; 1093214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo); 1094214571Sdim if (length <= 0) break; 1095214571Sdim FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo))); 1096214571Sdim } 1097214571Sdim break; 1098214571Sdim case MEP_OPERAND_CDISP8 : 1099214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, pc, & fields->f_8s24); 1100214571Sdim break; 1101214571Sdim case MEP_OPERAND_CDISP8A2 : 1102214571Sdim { 1103214571Sdim long value; 1104214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, pc, & value); 1105214571Sdim value = ((value) << (1)); 1106214571Sdim fields->f_8s24a2 = value; 1107214571Sdim } 1108214571Sdim break; 1109214571Sdim case MEP_OPERAND_CDISP8A4 : 1110214571Sdim { 1111214571Sdim long value; 1112214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, pc, & value); 1113214571Sdim value = ((value) << (2)); 1114214571Sdim fields->f_8s24a4 = value; 1115214571Sdim } 1116214571Sdim break; 1117214571Sdim case MEP_OPERAND_CDISP8A8 : 1118214571Sdim { 1119214571Sdim long value; 1120214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, pc, & value); 1121214571Sdim value = ((value) << (3)); 1122214571Sdim fields->f_8s24a8 = value; 1123214571Sdim } 1124214571Sdim break; 1125214571Sdim case MEP_OPERAND_CIMM4 : 1126214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1127214571Sdim break; 1128214571Sdim case MEP_OPERAND_CIMM5 : 1129214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 5, 32, total_length, pc, & fields->f_5u24); 1130214571Sdim break; 1131214571Sdim case MEP_OPERAND_CODE16 : 1132214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16); 1133214571Sdim break; 1134214571Sdim case MEP_OPERAND_CODE24 : 1135214571Sdim { 1136214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_24u4n_hi); 1137214571Sdim if (length <= 0) break; 1138214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u4n_lo); 1139214571Sdim if (length <= 0) break; 1140214571Sdim FLD (f_24u4n) = ((((FLD (f_24u4n_hi)) << (16))) | (FLD (f_24u4n_lo))); 1141214571Sdim } 1142214571Sdim break; 1143214571Sdim case MEP_OPERAND_CP_FLAG : 1144214571Sdim break; 1145214571Sdim case MEP_OPERAND_CRN : 1146214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn); 1147214571Sdim break; 1148214571Sdim case MEP_OPERAND_CRN64 : 1149214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn); 1150214571Sdim break; 1151214571Sdim case MEP_OPERAND_CRNX : 1152214571Sdim { 1153214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi); 1154214571Sdim if (length <= 0) break; 1155214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo); 1156214571Sdim if (length <= 0) break; 1157214571Sdim FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo))); 1158214571Sdim } 1159214571Sdim break; 1160214571Sdim case MEP_OPERAND_CRNX64 : 1161214571Sdim { 1162214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi); 1163214571Sdim if (length <= 0) break; 1164214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo); 1165214571Sdim if (length <= 0) break; 1166214571Sdim FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo))); 1167214571Sdim } 1168214571Sdim break; 1169214571Sdim case MEP_OPERAND_CSRN : 1170214571Sdim { 1171214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi); 1172214571Sdim if (length <= 0) break; 1173214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo); 1174214571Sdim if (length <= 0) break; 1175214571Sdim FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo))); 1176214571Sdim } 1177214571Sdim break; 1178214571Sdim case MEP_OPERAND_CSRN_IDX : 1179214571Sdim { 1180214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi); 1181214571Sdim if (length <= 0) break; 1182214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo); 1183214571Sdim if (length <= 0) break; 1184214571Sdim FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo))); 1185214571Sdim } 1186214571Sdim break; 1187214571Sdim case MEP_OPERAND_DBG : 1188214571Sdim break; 1189214571Sdim case MEP_OPERAND_DEPC : 1190214571Sdim break; 1191214571Sdim case MEP_OPERAND_EPC : 1192214571Sdim break; 1193214571Sdim case MEP_OPERAND_EXC : 1194214571Sdim break; 1195214571Sdim case MEP_OPERAND_FMAX_CCRN : 1196214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 1197214571Sdim break; 1198214571Sdim case MEP_OPERAND_FMAX_FRD : 1199214571Sdim { 1200214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1); 1201214571Sdim if (length <= 0) break; 1202214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 1203214571Sdim if (length <= 0) break; 1204214571Sdim FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4))); 1205214571Sdim } 1206214571Sdim break; 1207214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 1208214571Sdim { 1209214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1); 1210214571Sdim if (length <= 0) break; 1211214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 1212214571Sdim if (length <= 0) break; 1213214571Sdim FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4))); 1214214571Sdim } 1215214571Sdim break; 1216214571Sdim case MEP_OPERAND_FMAX_FRM : 1217214571Sdim { 1218214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 1, 32, total_length, pc, & fields->f_fmax_30_1); 1219214571Sdim if (length <= 0) break; 1220214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 4, 32, total_length, pc, & fields->f_fmax_24_4); 1221214571Sdim if (length <= 0) break; 1222214571Sdim FLD (f_fmax_frm) = ((((FLD (f_fmax_30_1)) << (4))) | (FLD (f_fmax_24_4))); 1223214571Sdim } 1224214571Sdim break; 1225214571Sdim case MEP_OPERAND_FMAX_FRN : 1226214571Sdim { 1227214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1); 1228214571Sdim if (length <= 0) break; 1229214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4); 1230214571Sdim if (length <= 0) break; 1231214571Sdim FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4))); 1232214571Sdim } 1233214571Sdim break; 1234214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 1235214571Sdim { 1236214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1); 1237214571Sdim if (length <= 0) break; 1238214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4); 1239214571Sdim if (length <= 0) break; 1240214571Sdim FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4))); 1241214571Sdim } 1242214571Sdim break; 1243214571Sdim case MEP_OPERAND_FMAX_RM : 1244214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_fmax_rm); 1245214571Sdim break; 1246214571Sdim case MEP_OPERAND_HI : 1247214571Sdim break; 1248214571Sdim case MEP_OPERAND_LO : 1249214571Sdim break; 1250214571Sdim case MEP_OPERAND_LP : 1251214571Sdim break; 1252214571Sdim case MEP_OPERAND_MB0 : 1253214571Sdim break; 1254214571Sdim case MEP_OPERAND_MB1 : 1255214571Sdim break; 1256214571Sdim case MEP_OPERAND_ME0 : 1257214571Sdim break; 1258214571Sdim case MEP_OPERAND_ME1 : 1259214571Sdim break; 1260214571Sdim case MEP_OPERAND_NPC : 1261214571Sdim break; 1262214571Sdim case MEP_OPERAND_OPT : 1263214571Sdim break; 1264214571Sdim case MEP_OPERAND_PCABS24A2 : 1265214571Sdim { 1266214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u5a2n_hi); 1267214571Sdim if (length <= 0) break; 1268214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 7, 32, total_length, pc, & fields->f_24u5a2n_lo); 1269214571Sdim if (length <= 0) break; 1270214571Sdim FLD (f_24u5a2n) = ((((FLD (f_24u5a2n_hi)) << (8))) | (((FLD (f_24u5a2n_lo)) << (1)))); 1271214571Sdim } 1272214571Sdim break; 1273214571Sdim case MEP_OPERAND_PCREL12A2 : 1274214571Sdim { 1275214571Sdim long value; 1276214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, pc, & value); 1277214571Sdim value = ((((value) << (1))) + (pc)); 1278214571Sdim fields->f_12s4a2 = value; 1279214571Sdim } 1280214571Sdim break; 1281214571Sdim case MEP_OPERAND_PCREL17A2 : 1282214571Sdim { 1283214571Sdim long value; 1284214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, pc, & value); 1285214571Sdim value = ((((value) << (1))) + (pc)); 1286214571Sdim fields->f_17s16a2 = value; 1287214571Sdim } 1288214571Sdim break; 1289214571Sdim case MEP_OPERAND_PCREL24A2 : 1290214571Sdim { 1291214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, pc, & fields->f_24s5a2n_hi); 1292214571Sdim if (length <= 0) break; 1293214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, pc, & fields->f_24s5a2n_lo); 1294214571Sdim if (length <= 0) break; 1295214571Sdim FLD (f_24s5a2n) = ((((((FLD (f_24s5a2n_hi)) << (8))) | (((FLD (f_24s5a2n_lo)) << (1))))) + (pc)); 1296214571Sdim } 1297214571Sdim break; 1298214571Sdim case MEP_OPERAND_PCREL8A2 : 1299214571Sdim { 1300214571Sdim long value; 1301214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, pc, & value); 1302214571Sdim value = ((((value) << (1))) + (pc)); 1303214571Sdim fields->f_8s8a2 = value; 1304214571Sdim } 1305214571Sdim break; 1306214571Sdim case MEP_OPERAND_PSW : 1307214571Sdim break; 1308214571Sdim case MEP_OPERAND_R0 : 1309214571Sdim break; 1310214571Sdim case MEP_OPERAND_R1 : 1311214571Sdim break; 1312214571Sdim case MEP_OPERAND_RL : 1313214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_rl); 1314214571Sdim break; 1315214571Sdim case MEP_OPERAND_RM : 1316214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 1317214571Sdim break; 1318214571Sdim case MEP_OPERAND_RMA : 1319214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 1320214571Sdim break; 1321214571Sdim case MEP_OPERAND_RN : 1322214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1323214571Sdim break; 1324214571Sdim case MEP_OPERAND_RN3 : 1325214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1326214571Sdim break; 1327214571Sdim case MEP_OPERAND_RN3C : 1328214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1329214571Sdim break; 1330214571Sdim case MEP_OPERAND_RN3L : 1331214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1332214571Sdim break; 1333214571Sdim case MEP_OPERAND_RN3S : 1334214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1335214571Sdim break; 1336214571Sdim case MEP_OPERAND_RN3UC : 1337214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1338214571Sdim break; 1339214571Sdim case MEP_OPERAND_RN3UL : 1340214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1341214571Sdim break; 1342214571Sdim case MEP_OPERAND_RN3US : 1343214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 1344214571Sdim break; 1345214571Sdim case MEP_OPERAND_RNC : 1346214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1347214571Sdim break; 1348214571Sdim case MEP_OPERAND_RNL : 1349214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1350214571Sdim break; 1351214571Sdim case MEP_OPERAND_RNS : 1352214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1353214571Sdim break; 1354214571Sdim case MEP_OPERAND_RNUC : 1355214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1356214571Sdim break; 1357214571Sdim case MEP_OPERAND_RNUL : 1358214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1359214571Sdim break; 1360214571Sdim case MEP_OPERAND_RNUS : 1361214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1362214571Sdim break; 1363214571Sdim case MEP_OPERAND_SAR : 1364214571Sdim break; 1365214571Sdim case MEP_OPERAND_SDISP16 : 1366214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16); 1367214571Sdim break; 1368214571Sdim case MEP_OPERAND_SIMM16 : 1369214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16); 1370214571Sdim break; 1371214571Sdim case MEP_OPERAND_SIMM6 : 1372214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, pc, & fields->f_6s8); 1373214571Sdim break; 1374214571Sdim case MEP_OPERAND_SIMM8 : 1375214571Sdim length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_8s8); 1376214571Sdim break; 1377214571Sdim case MEP_OPERAND_SP : 1378214571Sdim break; 1379214571Sdim case MEP_OPERAND_SPR : 1380214571Sdim break; 1381214571Sdim case MEP_OPERAND_TP : 1382214571Sdim break; 1383214571Sdim case MEP_OPERAND_TPR : 1384214571Sdim break; 1385214571Sdim case MEP_OPERAND_UDISP2 : 1386214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_2u6); 1387214571Sdim break; 1388214571Sdim case MEP_OPERAND_UDISP7 : 1389214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_7u9); 1390214571Sdim break; 1391214571Sdim case MEP_OPERAND_UDISP7A2 : 1392214571Sdim { 1393214571Sdim long value; 1394214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 6, 32, total_length, pc, & value); 1395214571Sdim value = ((value) << (1)); 1396214571Sdim fields->f_7u9a2 = value; 1397214571Sdim } 1398214571Sdim break; 1399214571Sdim case MEP_OPERAND_UDISP7A4 : 1400214571Sdim { 1401214571Sdim long value; 1402214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value); 1403214571Sdim value = ((value) << (2)); 1404214571Sdim fields->f_7u9a4 = value; 1405214571Sdim } 1406214571Sdim break; 1407214571Sdim case MEP_OPERAND_UIMM16 : 1408214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16); 1409214571Sdim break; 1410214571Sdim case MEP_OPERAND_UIMM2 : 1411214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 2, 32, total_length, pc, & fields->f_2u10); 1412214571Sdim break; 1413214571Sdim case MEP_OPERAND_UIMM24 : 1414214571Sdim { 1415214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8n_hi); 1416214571Sdim if (length <= 0) break; 1417214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_24u8n_lo); 1418214571Sdim if (length <= 0) break; 1419214571Sdim FLD (f_24u8n) = ((((FLD (f_24u8n_hi)) << (8))) | (FLD (f_24u8n_lo))); 1420214571Sdim } 1421214571Sdim break; 1422214571Sdim case MEP_OPERAND_UIMM3 : 1423214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_3u5); 1424214571Sdim break; 1425214571Sdim case MEP_OPERAND_UIMM4 : 1426214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_4u8); 1427214571Sdim break; 1428214571Sdim case MEP_OPERAND_UIMM5 : 1429214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_5u8); 1430214571Sdim break; 1431214571Sdim case MEP_OPERAND_UIMM7A4 : 1432214571Sdim { 1433214571Sdim long value; 1434214571Sdim length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value); 1435214571Sdim value = ((value) << (2)); 1436214571Sdim fields->f_7u9a4 = value; 1437214571Sdim } 1438214571Sdim break; 1439214571Sdim case MEP_OPERAND_ZERO : 1440214571Sdim break; 1441214571Sdim 1442214571Sdim default : 1443214571Sdim /* xgettext:c-format */ 1444214571Sdim fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"), 1445214571Sdim opindex); 1446214571Sdim abort (); 1447214571Sdim } 1448214571Sdim 1449214571Sdim return length; 1450214571Sdim} 1451214571Sdim 1452214571Sdimcgen_insert_fn * const mep_cgen_insert_handlers[] = 1453214571Sdim{ 1454214571Sdim insert_insn_normal, 1455214571Sdim}; 1456214571Sdim 1457214571Sdimcgen_extract_fn * const mep_cgen_extract_handlers[] = 1458214571Sdim{ 1459214571Sdim extract_insn_normal, 1460214571Sdim}; 1461214571Sdim 1462214571Sdimint mep_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 1463214571Sdimbfd_vma mep_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 1464214571Sdim 1465214571Sdim/* Getting values from cgen_fields is handled by a collection of functions. 1466214571Sdim They are distinguished by the type of the VALUE argument they return. 1467214571Sdim TODO: floating point, inlining support, remove cases where result type 1468214571Sdim not appropriate. */ 1469214571Sdim 1470214571Sdimint 1471214571Sdimmep_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1472214571Sdim int opindex, 1473214571Sdim const CGEN_FIELDS * fields) 1474214571Sdim{ 1475214571Sdim int value; 1476214571Sdim 1477214571Sdim switch (opindex) 1478214571Sdim { 1479214571Sdim case MEP_OPERAND_ADDR24A4 : 1480214571Sdim value = fields->f_24u8a4n; 1481214571Sdim break; 1482214571Sdim case MEP_OPERAND_CALLNUM : 1483214571Sdim value = fields->f_callnum; 1484214571Sdim break; 1485214571Sdim case MEP_OPERAND_CCCC : 1486214571Sdim value = fields->f_rm; 1487214571Sdim break; 1488214571Sdim case MEP_OPERAND_CCRN : 1489214571Sdim value = fields->f_ccrn; 1490214571Sdim break; 1491214571Sdim case MEP_OPERAND_CDISP8 : 1492214571Sdim value = fields->f_8s24; 1493214571Sdim break; 1494214571Sdim case MEP_OPERAND_CDISP8A2 : 1495214571Sdim value = fields->f_8s24a2; 1496214571Sdim break; 1497214571Sdim case MEP_OPERAND_CDISP8A4 : 1498214571Sdim value = fields->f_8s24a4; 1499214571Sdim break; 1500214571Sdim case MEP_OPERAND_CDISP8A8 : 1501214571Sdim value = fields->f_8s24a8; 1502214571Sdim break; 1503214571Sdim case MEP_OPERAND_CIMM4 : 1504214571Sdim value = fields->f_rn; 1505214571Sdim break; 1506214571Sdim case MEP_OPERAND_CIMM5 : 1507214571Sdim value = fields->f_5u24; 1508214571Sdim break; 1509214571Sdim case MEP_OPERAND_CODE16 : 1510214571Sdim value = fields->f_16u16; 1511214571Sdim break; 1512214571Sdim case MEP_OPERAND_CODE24 : 1513214571Sdim value = fields->f_24u4n; 1514214571Sdim break; 1515214571Sdim case MEP_OPERAND_CP_FLAG : 1516214571Sdim value = 0; 1517214571Sdim break; 1518214571Sdim case MEP_OPERAND_CRN : 1519214571Sdim value = fields->f_crn; 1520214571Sdim break; 1521214571Sdim case MEP_OPERAND_CRN64 : 1522214571Sdim value = fields->f_crn; 1523214571Sdim break; 1524214571Sdim case MEP_OPERAND_CRNX : 1525214571Sdim value = fields->f_crnx; 1526214571Sdim break; 1527214571Sdim case MEP_OPERAND_CRNX64 : 1528214571Sdim value = fields->f_crnx; 1529214571Sdim break; 1530214571Sdim case MEP_OPERAND_CSRN : 1531214571Sdim value = fields->f_csrn; 1532214571Sdim break; 1533214571Sdim case MEP_OPERAND_CSRN_IDX : 1534214571Sdim value = fields->f_csrn; 1535214571Sdim break; 1536214571Sdim case MEP_OPERAND_DBG : 1537214571Sdim value = 0; 1538214571Sdim break; 1539214571Sdim case MEP_OPERAND_DEPC : 1540214571Sdim value = 0; 1541214571Sdim break; 1542214571Sdim case MEP_OPERAND_EPC : 1543214571Sdim value = 0; 1544214571Sdim break; 1545214571Sdim case MEP_OPERAND_EXC : 1546214571Sdim value = 0; 1547214571Sdim break; 1548214571Sdim case MEP_OPERAND_FMAX_CCRN : 1549214571Sdim value = fields->f_fmax_4_4; 1550214571Sdim break; 1551214571Sdim case MEP_OPERAND_FMAX_FRD : 1552214571Sdim value = fields->f_fmax_frd; 1553214571Sdim break; 1554214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 1555214571Sdim value = fields->f_fmax_frd; 1556214571Sdim break; 1557214571Sdim case MEP_OPERAND_FMAX_FRM : 1558214571Sdim value = fields->f_fmax_frm; 1559214571Sdim break; 1560214571Sdim case MEP_OPERAND_FMAX_FRN : 1561214571Sdim value = fields->f_fmax_frn; 1562214571Sdim break; 1563214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 1564214571Sdim value = fields->f_fmax_frn; 1565214571Sdim break; 1566214571Sdim case MEP_OPERAND_FMAX_RM : 1567214571Sdim value = fields->f_fmax_rm; 1568214571Sdim break; 1569214571Sdim case MEP_OPERAND_HI : 1570214571Sdim value = 0; 1571214571Sdim break; 1572214571Sdim case MEP_OPERAND_LO : 1573214571Sdim value = 0; 1574214571Sdim break; 1575214571Sdim case MEP_OPERAND_LP : 1576214571Sdim value = 0; 1577214571Sdim break; 1578214571Sdim case MEP_OPERAND_MB0 : 1579214571Sdim value = 0; 1580214571Sdim break; 1581214571Sdim case MEP_OPERAND_MB1 : 1582214571Sdim value = 0; 1583214571Sdim break; 1584214571Sdim case MEP_OPERAND_ME0 : 1585214571Sdim value = 0; 1586214571Sdim break; 1587214571Sdim case MEP_OPERAND_ME1 : 1588214571Sdim value = 0; 1589214571Sdim break; 1590214571Sdim case MEP_OPERAND_NPC : 1591214571Sdim value = 0; 1592214571Sdim break; 1593214571Sdim case MEP_OPERAND_OPT : 1594214571Sdim value = 0; 1595214571Sdim break; 1596214571Sdim case MEP_OPERAND_PCABS24A2 : 1597214571Sdim value = fields->f_24u5a2n; 1598214571Sdim break; 1599214571Sdim case MEP_OPERAND_PCREL12A2 : 1600214571Sdim value = fields->f_12s4a2; 1601214571Sdim break; 1602214571Sdim case MEP_OPERAND_PCREL17A2 : 1603214571Sdim value = fields->f_17s16a2; 1604214571Sdim break; 1605214571Sdim case MEP_OPERAND_PCREL24A2 : 1606214571Sdim value = fields->f_24s5a2n; 1607214571Sdim break; 1608214571Sdim case MEP_OPERAND_PCREL8A2 : 1609214571Sdim value = fields->f_8s8a2; 1610214571Sdim break; 1611214571Sdim case MEP_OPERAND_PSW : 1612214571Sdim value = 0; 1613214571Sdim break; 1614214571Sdim case MEP_OPERAND_R0 : 1615214571Sdim value = 0; 1616214571Sdim break; 1617214571Sdim case MEP_OPERAND_R1 : 1618214571Sdim value = 0; 1619214571Sdim break; 1620214571Sdim case MEP_OPERAND_RL : 1621214571Sdim value = fields->f_rl; 1622214571Sdim break; 1623214571Sdim case MEP_OPERAND_RM : 1624214571Sdim value = fields->f_rm; 1625214571Sdim break; 1626214571Sdim case MEP_OPERAND_RMA : 1627214571Sdim value = fields->f_rm; 1628214571Sdim break; 1629214571Sdim case MEP_OPERAND_RN : 1630214571Sdim value = fields->f_rn; 1631214571Sdim break; 1632214571Sdim case MEP_OPERAND_RN3 : 1633214571Sdim value = fields->f_rn3; 1634214571Sdim break; 1635214571Sdim case MEP_OPERAND_RN3C : 1636214571Sdim value = fields->f_rn3; 1637214571Sdim break; 1638214571Sdim case MEP_OPERAND_RN3L : 1639214571Sdim value = fields->f_rn3; 1640214571Sdim break; 1641214571Sdim case MEP_OPERAND_RN3S : 1642214571Sdim value = fields->f_rn3; 1643214571Sdim break; 1644214571Sdim case MEP_OPERAND_RN3UC : 1645214571Sdim value = fields->f_rn3; 1646214571Sdim break; 1647214571Sdim case MEP_OPERAND_RN3UL : 1648214571Sdim value = fields->f_rn3; 1649214571Sdim break; 1650214571Sdim case MEP_OPERAND_RN3US : 1651214571Sdim value = fields->f_rn3; 1652214571Sdim break; 1653214571Sdim case MEP_OPERAND_RNC : 1654214571Sdim value = fields->f_rn; 1655214571Sdim break; 1656214571Sdim case MEP_OPERAND_RNL : 1657214571Sdim value = fields->f_rn; 1658214571Sdim break; 1659214571Sdim case MEP_OPERAND_RNS : 1660214571Sdim value = fields->f_rn; 1661214571Sdim break; 1662214571Sdim case MEP_OPERAND_RNUC : 1663214571Sdim value = fields->f_rn; 1664214571Sdim break; 1665214571Sdim case MEP_OPERAND_RNUL : 1666214571Sdim value = fields->f_rn; 1667214571Sdim break; 1668214571Sdim case MEP_OPERAND_RNUS : 1669214571Sdim value = fields->f_rn; 1670214571Sdim break; 1671214571Sdim case MEP_OPERAND_SAR : 1672214571Sdim value = 0; 1673214571Sdim break; 1674214571Sdim case MEP_OPERAND_SDISP16 : 1675214571Sdim value = fields->f_16s16; 1676214571Sdim break; 1677214571Sdim case MEP_OPERAND_SIMM16 : 1678214571Sdim value = fields->f_16s16; 1679214571Sdim break; 1680214571Sdim case MEP_OPERAND_SIMM6 : 1681214571Sdim value = fields->f_6s8; 1682214571Sdim break; 1683214571Sdim case MEP_OPERAND_SIMM8 : 1684214571Sdim value = fields->f_8s8; 1685214571Sdim break; 1686214571Sdim case MEP_OPERAND_SP : 1687214571Sdim value = 0; 1688214571Sdim break; 1689214571Sdim case MEP_OPERAND_SPR : 1690214571Sdim value = 0; 1691214571Sdim break; 1692214571Sdim case MEP_OPERAND_TP : 1693214571Sdim value = 0; 1694214571Sdim break; 1695214571Sdim case MEP_OPERAND_TPR : 1696214571Sdim value = 0; 1697214571Sdim break; 1698214571Sdim case MEP_OPERAND_UDISP2 : 1699214571Sdim value = fields->f_2u6; 1700214571Sdim break; 1701214571Sdim case MEP_OPERAND_UDISP7 : 1702214571Sdim value = fields->f_7u9; 1703214571Sdim break; 1704214571Sdim case MEP_OPERAND_UDISP7A2 : 1705214571Sdim value = fields->f_7u9a2; 1706214571Sdim break; 1707214571Sdim case MEP_OPERAND_UDISP7A4 : 1708214571Sdim value = fields->f_7u9a4; 1709214571Sdim break; 1710214571Sdim case MEP_OPERAND_UIMM16 : 1711214571Sdim value = fields->f_16u16; 1712214571Sdim break; 1713214571Sdim case MEP_OPERAND_UIMM2 : 1714214571Sdim value = fields->f_2u10; 1715214571Sdim break; 1716214571Sdim case MEP_OPERAND_UIMM24 : 1717214571Sdim value = fields->f_24u8n; 1718214571Sdim break; 1719214571Sdim case MEP_OPERAND_UIMM3 : 1720214571Sdim value = fields->f_3u5; 1721214571Sdim break; 1722214571Sdim case MEP_OPERAND_UIMM4 : 1723214571Sdim value = fields->f_4u8; 1724214571Sdim break; 1725214571Sdim case MEP_OPERAND_UIMM5 : 1726214571Sdim value = fields->f_5u8; 1727214571Sdim break; 1728214571Sdim case MEP_OPERAND_UIMM7A4 : 1729214571Sdim value = fields->f_7u9a4; 1730214571Sdim break; 1731214571Sdim case MEP_OPERAND_ZERO : 1732214571Sdim value = 0; 1733214571Sdim break; 1734214571Sdim 1735214571Sdim default : 1736214571Sdim /* xgettext:c-format */ 1737214571Sdim fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"), 1738214571Sdim opindex); 1739214571Sdim abort (); 1740214571Sdim } 1741214571Sdim 1742214571Sdim return value; 1743214571Sdim} 1744214571Sdim 1745214571Sdimbfd_vma 1746214571Sdimmep_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1747214571Sdim int opindex, 1748214571Sdim const CGEN_FIELDS * fields) 1749214571Sdim{ 1750214571Sdim bfd_vma value; 1751214571Sdim 1752214571Sdim switch (opindex) 1753214571Sdim { 1754214571Sdim case MEP_OPERAND_ADDR24A4 : 1755214571Sdim value = fields->f_24u8a4n; 1756214571Sdim break; 1757214571Sdim case MEP_OPERAND_CALLNUM : 1758214571Sdim value = fields->f_callnum; 1759214571Sdim break; 1760214571Sdim case MEP_OPERAND_CCCC : 1761214571Sdim value = fields->f_rm; 1762214571Sdim break; 1763214571Sdim case MEP_OPERAND_CCRN : 1764214571Sdim value = fields->f_ccrn; 1765214571Sdim break; 1766214571Sdim case MEP_OPERAND_CDISP8 : 1767214571Sdim value = fields->f_8s24; 1768214571Sdim break; 1769214571Sdim case MEP_OPERAND_CDISP8A2 : 1770214571Sdim value = fields->f_8s24a2; 1771214571Sdim break; 1772214571Sdim case MEP_OPERAND_CDISP8A4 : 1773214571Sdim value = fields->f_8s24a4; 1774214571Sdim break; 1775214571Sdim case MEP_OPERAND_CDISP8A8 : 1776214571Sdim value = fields->f_8s24a8; 1777214571Sdim break; 1778214571Sdim case MEP_OPERAND_CIMM4 : 1779214571Sdim value = fields->f_rn; 1780214571Sdim break; 1781214571Sdim case MEP_OPERAND_CIMM5 : 1782214571Sdim value = fields->f_5u24; 1783214571Sdim break; 1784214571Sdim case MEP_OPERAND_CODE16 : 1785214571Sdim value = fields->f_16u16; 1786214571Sdim break; 1787214571Sdim case MEP_OPERAND_CODE24 : 1788214571Sdim value = fields->f_24u4n; 1789214571Sdim break; 1790214571Sdim case MEP_OPERAND_CP_FLAG : 1791214571Sdim value = 0; 1792214571Sdim break; 1793214571Sdim case MEP_OPERAND_CRN : 1794214571Sdim value = fields->f_crn; 1795214571Sdim break; 1796214571Sdim case MEP_OPERAND_CRN64 : 1797214571Sdim value = fields->f_crn; 1798214571Sdim break; 1799214571Sdim case MEP_OPERAND_CRNX : 1800214571Sdim value = fields->f_crnx; 1801214571Sdim break; 1802214571Sdim case MEP_OPERAND_CRNX64 : 1803214571Sdim value = fields->f_crnx; 1804214571Sdim break; 1805214571Sdim case MEP_OPERAND_CSRN : 1806214571Sdim value = fields->f_csrn; 1807214571Sdim break; 1808214571Sdim case MEP_OPERAND_CSRN_IDX : 1809214571Sdim value = fields->f_csrn; 1810214571Sdim break; 1811214571Sdim case MEP_OPERAND_DBG : 1812214571Sdim value = 0; 1813214571Sdim break; 1814214571Sdim case MEP_OPERAND_DEPC : 1815214571Sdim value = 0; 1816214571Sdim break; 1817214571Sdim case MEP_OPERAND_EPC : 1818214571Sdim value = 0; 1819214571Sdim break; 1820214571Sdim case MEP_OPERAND_EXC : 1821214571Sdim value = 0; 1822214571Sdim break; 1823214571Sdim case MEP_OPERAND_FMAX_CCRN : 1824214571Sdim value = fields->f_fmax_4_4; 1825214571Sdim break; 1826214571Sdim case MEP_OPERAND_FMAX_FRD : 1827214571Sdim value = fields->f_fmax_frd; 1828214571Sdim break; 1829214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 1830214571Sdim value = fields->f_fmax_frd; 1831214571Sdim break; 1832214571Sdim case MEP_OPERAND_FMAX_FRM : 1833214571Sdim value = fields->f_fmax_frm; 1834214571Sdim break; 1835214571Sdim case MEP_OPERAND_FMAX_FRN : 1836214571Sdim value = fields->f_fmax_frn; 1837214571Sdim break; 1838214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 1839214571Sdim value = fields->f_fmax_frn; 1840214571Sdim break; 1841214571Sdim case MEP_OPERAND_FMAX_RM : 1842214571Sdim value = fields->f_fmax_rm; 1843214571Sdim break; 1844214571Sdim case MEP_OPERAND_HI : 1845214571Sdim value = 0; 1846214571Sdim break; 1847214571Sdim case MEP_OPERAND_LO : 1848214571Sdim value = 0; 1849214571Sdim break; 1850214571Sdim case MEP_OPERAND_LP : 1851214571Sdim value = 0; 1852214571Sdim break; 1853214571Sdim case MEP_OPERAND_MB0 : 1854214571Sdim value = 0; 1855214571Sdim break; 1856214571Sdim case MEP_OPERAND_MB1 : 1857214571Sdim value = 0; 1858214571Sdim break; 1859214571Sdim case MEP_OPERAND_ME0 : 1860214571Sdim value = 0; 1861214571Sdim break; 1862214571Sdim case MEP_OPERAND_ME1 : 1863214571Sdim value = 0; 1864214571Sdim break; 1865214571Sdim case MEP_OPERAND_NPC : 1866214571Sdim value = 0; 1867214571Sdim break; 1868214571Sdim case MEP_OPERAND_OPT : 1869214571Sdim value = 0; 1870214571Sdim break; 1871214571Sdim case MEP_OPERAND_PCABS24A2 : 1872214571Sdim value = fields->f_24u5a2n; 1873214571Sdim break; 1874214571Sdim case MEP_OPERAND_PCREL12A2 : 1875214571Sdim value = fields->f_12s4a2; 1876214571Sdim break; 1877214571Sdim case MEP_OPERAND_PCREL17A2 : 1878214571Sdim value = fields->f_17s16a2; 1879214571Sdim break; 1880214571Sdim case MEP_OPERAND_PCREL24A2 : 1881214571Sdim value = fields->f_24s5a2n; 1882214571Sdim break; 1883214571Sdim case MEP_OPERAND_PCREL8A2 : 1884214571Sdim value = fields->f_8s8a2; 1885214571Sdim break; 1886214571Sdim case MEP_OPERAND_PSW : 1887214571Sdim value = 0; 1888214571Sdim break; 1889214571Sdim case MEP_OPERAND_R0 : 1890214571Sdim value = 0; 1891214571Sdim break; 1892214571Sdim case MEP_OPERAND_R1 : 1893214571Sdim value = 0; 1894214571Sdim break; 1895214571Sdim case MEP_OPERAND_RL : 1896214571Sdim value = fields->f_rl; 1897214571Sdim break; 1898214571Sdim case MEP_OPERAND_RM : 1899214571Sdim value = fields->f_rm; 1900214571Sdim break; 1901214571Sdim case MEP_OPERAND_RMA : 1902214571Sdim value = fields->f_rm; 1903214571Sdim break; 1904214571Sdim case MEP_OPERAND_RN : 1905214571Sdim value = fields->f_rn; 1906214571Sdim break; 1907214571Sdim case MEP_OPERAND_RN3 : 1908214571Sdim value = fields->f_rn3; 1909214571Sdim break; 1910214571Sdim case MEP_OPERAND_RN3C : 1911214571Sdim value = fields->f_rn3; 1912214571Sdim break; 1913214571Sdim case MEP_OPERAND_RN3L : 1914214571Sdim value = fields->f_rn3; 1915214571Sdim break; 1916214571Sdim case MEP_OPERAND_RN3S : 1917214571Sdim value = fields->f_rn3; 1918214571Sdim break; 1919214571Sdim case MEP_OPERAND_RN3UC : 1920214571Sdim value = fields->f_rn3; 1921214571Sdim break; 1922214571Sdim case MEP_OPERAND_RN3UL : 1923214571Sdim value = fields->f_rn3; 1924214571Sdim break; 1925214571Sdim case MEP_OPERAND_RN3US : 1926214571Sdim value = fields->f_rn3; 1927214571Sdim break; 1928214571Sdim case MEP_OPERAND_RNC : 1929214571Sdim value = fields->f_rn; 1930214571Sdim break; 1931214571Sdim case MEP_OPERAND_RNL : 1932214571Sdim value = fields->f_rn; 1933214571Sdim break; 1934214571Sdim case MEP_OPERAND_RNS : 1935214571Sdim value = fields->f_rn; 1936214571Sdim break; 1937214571Sdim case MEP_OPERAND_RNUC : 1938214571Sdim value = fields->f_rn; 1939214571Sdim break; 1940214571Sdim case MEP_OPERAND_RNUL : 1941214571Sdim value = fields->f_rn; 1942214571Sdim break; 1943214571Sdim case MEP_OPERAND_RNUS : 1944214571Sdim value = fields->f_rn; 1945214571Sdim break; 1946214571Sdim case MEP_OPERAND_SAR : 1947214571Sdim value = 0; 1948214571Sdim break; 1949214571Sdim case MEP_OPERAND_SDISP16 : 1950214571Sdim value = fields->f_16s16; 1951214571Sdim break; 1952214571Sdim case MEP_OPERAND_SIMM16 : 1953214571Sdim value = fields->f_16s16; 1954214571Sdim break; 1955214571Sdim case MEP_OPERAND_SIMM6 : 1956214571Sdim value = fields->f_6s8; 1957214571Sdim break; 1958214571Sdim case MEP_OPERAND_SIMM8 : 1959214571Sdim value = fields->f_8s8; 1960214571Sdim break; 1961214571Sdim case MEP_OPERAND_SP : 1962214571Sdim value = 0; 1963214571Sdim break; 1964214571Sdim case MEP_OPERAND_SPR : 1965214571Sdim value = 0; 1966214571Sdim break; 1967214571Sdim case MEP_OPERAND_TP : 1968214571Sdim value = 0; 1969214571Sdim break; 1970214571Sdim case MEP_OPERAND_TPR : 1971214571Sdim value = 0; 1972214571Sdim break; 1973214571Sdim case MEP_OPERAND_UDISP2 : 1974214571Sdim value = fields->f_2u6; 1975214571Sdim break; 1976214571Sdim case MEP_OPERAND_UDISP7 : 1977214571Sdim value = fields->f_7u9; 1978214571Sdim break; 1979214571Sdim case MEP_OPERAND_UDISP7A2 : 1980214571Sdim value = fields->f_7u9a2; 1981214571Sdim break; 1982214571Sdim case MEP_OPERAND_UDISP7A4 : 1983214571Sdim value = fields->f_7u9a4; 1984214571Sdim break; 1985214571Sdim case MEP_OPERAND_UIMM16 : 1986214571Sdim value = fields->f_16u16; 1987214571Sdim break; 1988214571Sdim case MEP_OPERAND_UIMM2 : 1989214571Sdim value = fields->f_2u10; 1990214571Sdim break; 1991214571Sdim case MEP_OPERAND_UIMM24 : 1992214571Sdim value = fields->f_24u8n; 1993214571Sdim break; 1994214571Sdim case MEP_OPERAND_UIMM3 : 1995214571Sdim value = fields->f_3u5; 1996214571Sdim break; 1997214571Sdim case MEP_OPERAND_UIMM4 : 1998214571Sdim value = fields->f_4u8; 1999214571Sdim break; 2000214571Sdim case MEP_OPERAND_UIMM5 : 2001214571Sdim value = fields->f_5u8; 2002214571Sdim break; 2003214571Sdim case MEP_OPERAND_UIMM7A4 : 2004214571Sdim value = fields->f_7u9a4; 2005214571Sdim break; 2006214571Sdim case MEP_OPERAND_ZERO : 2007214571Sdim value = 0; 2008214571Sdim break; 2009214571Sdim 2010214571Sdim default : 2011214571Sdim /* xgettext:c-format */ 2012214571Sdim fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"), 2013214571Sdim opindex); 2014214571Sdim abort (); 2015214571Sdim } 2016214571Sdim 2017214571Sdim return value; 2018214571Sdim} 2019214571Sdim 2020214571Sdimvoid mep_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int); 2021214571Sdimvoid mep_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma); 2022214571Sdim 2023214571Sdim/* Stuffing values in cgen_fields is handled by a collection of functions. 2024214571Sdim They are distinguished by the type of the VALUE argument they accept. 2025214571Sdim TODO: floating point, inlining support, remove cases where argument type 2026214571Sdim not appropriate. */ 2027214571Sdim 2028214571Sdimvoid 2029214571Sdimmep_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 2030214571Sdim int opindex, 2031214571Sdim CGEN_FIELDS * fields, 2032214571Sdim int value) 2033214571Sdim{ 2034214571Sdim switch (opindex) 2035214571Sdim { 2036214571Sdim case MEP_OPERAND_ADDR24A4 : 2037214571Sdim fields->f_24u8a4n = value; 2038214571Sdim break; 2039214571Sdim case MEP_OPERAND_CALLNUM : 2040214571Sdim fields->f_callnum = value; 2041214571Sdim break; 2042214571Sdim case MEP_OPERAND_CCCC : 2043214571Sdim fields->f_rm = value; 2044214571Sdim break; 2045214571Sdim case MEP_OPERAND_CCRN : 2046214571Sdim fields->f_ccrn = value; 2047214571Sdim break; 2048214571Sdim case MEP_OPERAND_CDISP8 : 2049214571Sdim fields->f_8s24 = value; 2050214571Sdim break; 2051214571Sdim case MEP_OPERAND_CDISP8A2 : 2052214571Sdim fields->f_8s24a2 = value; 2053214571Sdim break; 2054214571Sdim case MEP_OPERAND_CDISP8A4 : 2055214571Sdim fields->f_8s24a4 = value; 2056214571Sdim break; 2057214571Sdim case MEP_OPERAND_CDISP8A8 : 2058214571Sdim fields->f_8s24a8 = value; 2059214571Sdim break; 2060214571Sdim case MEP_OPERAND_CIMM4 : 2061214571Sdim fields->f_rn = value; 2062214571Sdim break; 2063214571Sdim case MEP_OPERAND_CIMM5 : 2064214571Sdim fields->f_5u24 = value; 2065214571Sdim break; 2066214571Sdim case MEP_OPERAND_CODE16 : 2067214571Sdim fields->f_16u16 = value; 2068214571Sdim break; 2069214571Sdim case MEP_OPERAND_CODE24 : 2070214571Sdim fields->f_24u4n = value; 2071214571Sdim break; 2072214571Sdim case MEP_OPERAND_CP_FLAG : 2073214571Sdim break; 2074214571Sdim case MEP_OPERAND_CRN : 2075214571Sdim fields->f_crn = value; 2076214571Sdim break; 2077214571Sdim case MEP_OPERAND_CRN64 : 2078214571Sdim fields->f_crn = value; 2079214571Sdim break; 2080214571Sdim case MEP_OPERAND_CRNX : 2081214571Sdim fields->f_crnx = value; 2082214571Sdim break; 2083214571Sdim case MEP_OPERAND_CRNX64 : 2084214571Sdim fields->f_crnx = value; 2085214571Sdim break; 2086214571Sdim case MEP_OPERAND_CSRN : 2087214571Sdim fields->f_csrn = value; 2088214571Sdim break; 2089214571Sdim case MEP_OPERAND_CSRN_IDX : 2090214571Sdim fields->f_csrn = value; 2091214571Sdim break; 2092214571Sdim case MEP_OPERAND_DBG : 2093214571Sdim break; 2094214571Sdim case MEP_OPERAND_DEPC : 2095214571Sdim break; 2096214571Sdim case MEP_OPERAND_EPC : 2097214571Sdim break; 2098214571Sdim case MEP_OPERAND_EXC : 2099214571Sdim break; 2100214571Sdim case MEP_OPERAND_FMAX_CCRN : 2101214571Sdim fields->f_fmax_4_4 = value; 2102214571Sdim break; 2103214571Sdim case MEP_OPERAND_FMAX_FRD : 2104214571Sdim fields->f_fmax_frd = value; 2105214571Sdim break; 2106214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 2107214571Sdim fields->f_fmax_frd = value; 2108214571Sdim break; 2109214571Sdim case MEP_OPERAND_FMAX_FRM : 2110214571Sdim fields->f_fmax_frm = value; 2111214571Sdim break; 2112214571Sdim case MEP_OPERAND_FMAX_FRN : 2113214571Sdim fields->f_fmax_frn = value; 2114214571Sdim break; 2115214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 2116214571Sdim fields->f_fmax_frn = value; 2117214571Sdim break; 2118214571Sdim case MEP_OPERAND_FMAX_RM : 2119214571Sdim fields->f_fmax_rm = value; 2120214571Sdim break; 2121214571Sdim case MEP_OPERAND_HI : 2122214571Sdim break; 2123214571Sdim case MEP_OPERAND_LO : 2124214571Sdim break; 2125214571Sdim case MEP_OPERAND_LP : 2126214571Sdim break; 2127214571Sdim case MEP_OPERAND_MB0 : 2128214571Sdim break; 2129214571Sdim case MEP_OPERAND_MB1 : 2130214571Sdim break; 2131214571Sdim case MEP_OPERAND_ME0 : 2132214571Sdim break; 2133214571Sdim case MEP_OPERAND_ME1 : 2134214571Sdim break; 2135214571Sdim case MEP_OPERAND_NPC : 2136214571Sdim break; 2137214571Sdim case MEP_OPERAND_OPT : 2138214571Sdim break; 2139214571Sdim case MEP_OPERAND_PCABS24A2 : 2140214571Sdim fields->f_24u5a2n = value; 2141214571Sdim break; 2142214571Sdim case MEP_OPERAND_PCREL12A2 : 2143214571Sdim fields->f_12s4a2 = value; 2144214571Sdim break; 2145214571Sdim case MEP_OPERAND_PCREL17A2 : 2146214571Sdim fields->f_17s16a2 = value; 2147214571Sdim break; 2148214571Sdim case MEP_OPERAND_PCREL24A2 : 2149214571Sdim fields->f_24s5a2n = value; 2150214571Sdim break; 2151214571Sdim case MEP_OPERAND_PCREL8A2 : 2152214571Sdim fields->f_8s8a2 = value; 2153214571Sdim break; 2154214571Sdim case MEP_OPERAND_PSW : 2155214571Sdim break; 2156214571Sdim case MEP_OPERAND_R0 : 2157214571Sdim break; 2158214571Sdim case MEP_OPERAND_R1 : 2159214571Sdim break; 2160214571Sdim case MEP_OPERAND_RL : 2161214571Sdim fields->f_rl = value; 2162214571Sdim break; 2163214571Sdim case MEP_OPERAND_RM : 2164214571Sdim fields->f_rm = value; 2165214571Sdim break; 2166214571Sdim case MEP_OPERAND_RMA : 2167214571Sdim fields->f_rm = value; 2168214571Sdim break; 2169214571Sdim case MEP_OPERAND_RN : 2170214571Sdim fields->f_rn = value; 2171214571Sdim break; 2172214571Sdim case MEP_OPERAND_RN3 : 2173214571Sdim fields->f_rn3 = value; 2174214571Sdim break; 2175214571Sdim case MEP_OPERAND_RN3C : 2176214571Sdim fields->f_rn3 = value; 2177214571Sdim break; 2178214571Sdim case MEP_OPERAND_RN3L : 2179214571Sdim fields->f_rn3 = value; 2180214571Sdim break; 2181214571Sdim case MEP_OPERAND_RN3S : 2182214571Sdim fields->f_rn3 = value; 2183214571Sdim break; 2184214571Sdim case MEP_OPERAND_RN3UC : 2185214571Sdim fields->f_rn3 = value; 2186214571Sdim break; 2187214571Sdim case MEP_OPERAND_RN3UL : 2188214571Sdim fields->f_rn3 = value; 2189214571Sdim break; 2190214571Sdim case MEP_OPERAND_RN3US : 2191214571Sdim fields->f_rn3 = value; 2192214571Sdim break; 2193214571Sdim case MEP_OPERAND_RNC : 2194214571Sdim fields->f_rn = value; 2195214571Sdim break; 2196214571Sdim case MEP_OPERAND_RNL : 2197214571Sdim fields->f_rn = value; 2198214571Sdim break; 2199214571Sdim case MEP_OPERAND_RNS : 2200214571Sdim fields->f_rn = value; 2201214571Sdim break; 2202214571Sdim case MEP_OPERAND_RNUC : 2203214571Sdim fields->f_rn = value; 2204214571Sdim break; 2205214571Sdim case MEP_OPERAND_RNUL : 2206214571Sdim fields->f_rn = value; 2207214571Sdim break; 2208214571Sdim case MEP_OPERAND_RNUS : 2209214571Sdim fields->f_rn = value; 2210214571Sdim break; 2211214571Sdim case MEP_OPERAND_SAR : 2212214571Sdim break; 2213214571Sdim case MEP_OPERAND_SDISP16 : 2214214571Sdim fields->f_16s16 = value; 2215214571Sdim break; 2216214571Sdim case MEP_OPERAND_SIMM16 : 2217214571Sdim fields->f_16s16 = value; 2218214571Sdim break; 2219214571Sdim case MEP_OPERAND_SIMM6 : 2220214571Sdim fields->f_6s8 = value; 2221214571Sdim break; 2222214571Sdim case MEP_OPERAND_SIMM8 : 2223214571Sdim fields->f_8s8 = value; 2224214571Sdim break; 2225214571Sdim case MEP_OPERAND_SP : 2226214571Sdim break; 2227214571Sdim case MEP_OPERAND_SPR : 2228214571Sdim break; 2229214571Sdim case MEP_OPERAND_TP : 2230214571Sdim break; 2231214571Sdim case MEP_OPERAND_TPR : 2232214571Sdim break; 2233214571Sdim case MEP_OPERAND_UDISP2 : 2234214571Sdim fields->f_2u6 = value; 2235214571Sdim break; 2236214571Sdim case MEP_OPERAND_UDISP7 : 2237214571Sdim fields->f_7u9 = value; 2238214571Sdim break; 2239214571Sdim case MEP_OPERAND_UDISP7A2 : 2240214571Sdim fields->f_7u9a2 = value; 2241214571Sdim break; 2242214571Sdim case MEP_OPERAND_UDISP7A4 : 2243214571Sdim fields->f_7u9a4 = value; 2244214571Sdim break; 2245214571Sdim case MEP_OPERAND_UIMM16 : 2246214571Sdim fields->f_16u16 = value; 2247214571Sdim break; 2248214571Sdim case MEP_OPERAND_UIMM2 : 2249214571Sdim fields->f_2u10 = value; 2250214571Sdim break; 2251214571Sdim case MEP_OPERAND_UIMM24 : 2252214571Sdim fields->f_24u8n = value; 2253214571Sdim break; 2254214571Sdim case MEP_OPERAND_UIMM3 : 2255214571Sdim fields->f_3u5 = value; 2256214571Sdim break; 2257214571Sdim case MEP_OPERAND_UIMM4 : 2258214571Sdim fields->f_4u8 = value; 2259214571Sdim break; 2260214571Sdim case MEP_OPERAND_UIMM5 : 2261214571Sdim fields->f_5u8 = value; 2262214571Sdim break; 2263214571Sdim case MEP_OPERAND_UIMM7A4 : 2264214571Sdim fields->f_7u9a4 = value; 2265214571Sdim break; 2266214571Sdim case MEP_OPERAND_ZERO : 2267214571Sdim break; 2268214571Sdim 2269214571Sdim default : 2270214571Sdim /* xgettext:c-format */ 2271214571Sdim fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"), 2272214571Sdim opindex); 2273214571Sdim abort (); 2274214571Sdim } 2275214571Sdim} 2276214571Sdim 2277214571Sdimvoid 2278214571Sdimmep_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 2279214571Sdim int opindex, 2280214571Sdim CGEN_FIELDS * fields, 2281214571Sdim bfd_vma value) 2282214571Sdim{ 2283214571Sdim switch (opindex) 2284214571Sdim { 2285214571Sdim case MEP_OPERAND_ADDR24A4 : 2286214571Sdim fields->f_24u8a4n = value; 2287214571Sdim break; 2288214571Sdim case MEP_OPERAND_CALLNUM : 2289214571Sdim fields->f_callnum = value; 2290214571Sdim break; 2291214571Sdim case MEP_OPERAND_CCCC : 2292214571Sdim fields->f_rm = value; 2293214571Sdim break; 2294214571Sdim case MEP_OPERAND_CCRN : 2295214571Sdim fields->f_ccrn = value; 2296214571Sdim break; 2297214571Sdim case MEP_OPERAND_CDISP8 : 2298214571Sdim fields->f_8s24 = value; 2299214571Sdim break; 2300214571Sdim case MEP_OPERAND_CDISP8A2 : 2301214571Sdim fields->f_8s24a2 = value; 2302214571Sdim break; 2303214571Sdim case MEP_OPERAND_CDISP8A4 : 2304214571Sdim fields->f_8s24a4 = value; 2305214571Sdim break; 2306214571Sdim case MEP_OPERAND_CDISP8A8 : 2307214571Sdim fields->f_8s24a8 = value; 2308214571Sdim break; 2309214571Sdim case MEP_OPERAND_CIMM4 : 2310214571Sdim fields->f_rn = value; 2311214571Sdim break; 2312214571Sdim case MEP_OPERAND_CIMM5 : 2313214571Sdim fields->f_5u24 = value; 2314214571Sdim break; 2315214571Sdim case MEP_OPERAND_CODE16 : 2316214571Sdim fields->f_16u16 = value; 2317214571Sdim break; 2318214571Sdim case MEP_OPERAND_CODE24 : 2319214571Sdim fields->f_24u4n = value; 2320214571Sdim break; 2321214571Sdim case MEP_OPERAND_CP_FLAG : 2322214571Sdim break; 2323214571Sdim case MEP_OPERAND_CRN : 2324214571Sdim fields->f_crn = value; 2325214571Sdim break; 2326214571Sdim case MEP_OPERAND_CRN64 : 2327214571Sdim fields->f_crn = value; 2328214571Sdim break; 2329214571Sdim case MEP_OPERAND_CRNX : 2330214571Sdim fields->f_crnx = value; 2331214571Sdim break; 2332214571Sdim case MEP_OPERAND_CRNX64 : 2333214571Sdim fields->f_crnx = value; 2334214571Sdim break; 2335214571Sdim case MEP_OPERAND_CSRN : 2336214571Sdim fields->f_csrn = value; 2337214571Sdim break; 2338214571Sdim case MEP_OPERAND_CSRN_IDX : 2339214571Sdim fields->f_csrn = value; 2340214571Sdim break; 2341214571Sdim case MEP_OPERAND_DBG : 2342214571Sdim break; 2343214571Sdim case MEP_OPERAND_DEPC : 2344214571Sdim break; 2345214571Sdim case MEP_OPERAND_EPC : 2346214571Sdim break; 2347214571Sdim case MEP_OPERAND_EXC : 2348214571Sdim break; 2349214571Sdim case MEP_OPERAND_FMAX_CCRN : 2350214571Sdim fields->f_fmax_4_4 = value; 2351214571Sdim break; 2352214571Sdim case MEP_OPERAND_FMAX_FRD : 2353214571Sdim fields->f_fmax_frd = value; 2354214571Sdim break; 2355214571Sdim case MEP_OPERAND_FMAX_FRD_INT : 2356214571Sdim fields->f_fmax_frd = value; 2357214571Sdim break; 2358214571Sdim case MEP_OPERAND_FMAX_FRM : 2359214571Sdim fields->f_fmax_frm = value; 2360214571Sdim break; 2361214571Sdim case MEP_OPERAND_FMAX_FRN : 2362214571Sdim fields->f_fmax_frn = value; 2363214571Sdim break; 2364214571Sdim case MEP_OPERAND_FMAX_FRN_INT : 2365214571Sdim fields->f_fmax_frn = value; 2366214571Sdim break; 2367214571Sdim case MEP_OPERAND_FMAX_RM : 2368214571Sdim fields->f_fmax_rm = value; 2369214571Sdim break; 2370214571Sdim case MEP_OPERAND_HI : 2371214571Sdim break; 2372214571Sdim case MEP_OPERAND_LO : 2373214571Sdim break; 2374214571Sdim case MEP_OPERAND_LP : 2375214571Sdim break; 2376214571Sdim case MEP_OPERAND_MB0 : 2377214571Sdim break; 2378214571Sdim case MEP_OPERAND_MB1 : 2379214571Sdim break; 2380214571Sdim case MEP_OPERAND_ME0 : 2381214571Sdim break; 2382214571Sdim case MEP_OPERAND_ME1 : 2383214571Sdim break; 2384214571Sdim case MEP_OPERAND_NPC : 2385214571Sdim break; 2386214571Sdim case MEP_OPERAND_OPT : 2387214571Sdim break; 2388214571Sdim case MEP_OPERAND_PCABS24A2 : 2389214571Sdim fields->f_24u5a2n = value; 2390214571Sdim break; 2391214571Sdim case MEP_OPERAND_PCREL12A2 : 2392214571Sdim fields->f_12s4a2 = value; 2393214571Sdim break; 2394214571Sdim case MEP_OPERAND_PCREL17A2 : 2395214571Sdim fields->f_17s16a2 = value; 2396214571Sdim break; 2397214571Sdim case MEP_OPERAND_PCREL24A2 : 2398214571Sdim fields->f_24s5a2n = value; 2399214571Sdim break; 2400214571Sdim case MEP_OPERAND_PCREL8A2 : 2401214571Sdim fields->f_8s8a2 = value; 2402214571Sdim break; 2403214571Sdim case MEP_OPERAND_PSW : 2404214571Sdim break; 2405214571Sdim case MEP_OPERAND_R0 : 2406214571Sdim break; 2407214571Sdim case MEP_OPERAND_R1 : 2408214571Sdim break; 2409214571Sdim case MEP_OPERAND_RL : 2410214571Sdim fields->f_rl = value; 2411214571Sdim break; 2412214571Sdim case MEP_OPERAND_RM : 2413214571Sdim fields->f_rm = value; 2414214571Sdim break; 2415214571Sdim case MEP_OPERAND_RMA : 2416214571Sdim fields->f_rm = value; 2417214571Sdim break; 2418214571Sdim case MEP_OPERAND_RN : 2419214571Sdim fields->f_rn = value; 2420214571Sdim break; 2421214571Sdim case MEP_OPERAND_RN3 : 2422214571Sdim fields->f_rn3 = value; 2423214571Sdim break; 2424214571Sdim case MEP_OPERAND_RN3C : 2425214571Sdim fields->f_rn3 = value; 2426214571Sdim break; 2427214571Sdim case MEP_OPERAND_RN3L : 2428214571Sdim fields->f_rn3 = value; 2429214571Sdim break; 2430214571Sdim case MEP_OPERAND_RN3S : 2431214571Sdim fields->f_rn3 = value; 2432214571Sdim break; 2433214571Sdim case MEP_OPERAND_RN3UC : 2434214571Sdim fields->f_rn3 = value; 2435214571Sdim break; 2436214571Sdim case MEP_OPERAND_RN3UL : 2437214571Sdim fields->f_rn3 = value; 2438214571Sdim break; 2439214571Sdim case MEP_OPERAND_RN3US : 2440214571Sdim fields->f_rn3 = value; 2441214571Sdim break; 2442214571Sdim case MEP_OPERAND_RNC : 2443214571Sdim fields->f_rn = value; 2444214571Sdim break; 2445214571Sdim case MEP_OPERAND_RNL : 2446214571Sdim fields->f_rn = value; 2447214571Sdim break; 2448214571Sdim case MEP_OPERAND_RNS : 2449214571Sdim fields->f_rn = value; 2450214571Sdim break; 2451214571Sdim case MEP_OPERAND_RNUC : 2452214571Sdim fields->f_rn = value; 2453214571Sdim break; 2454214571Sdim case MEP_OPERAND_RNUL : 2455214571Sdim fields->f_rn = value; 2456214571Sdim break; 2457214571Sdim case MEP_OPERAND_RNUS : 2458214571Sdim fields->f_rn = value; 2459214571Sdim break; 2460214571Sdim case MEP_OPERAND_SAR : 2461214571Sdim break; 2462214571Sdim case MEP_OPERAND_SDISP16 : 2463214571Sdim fields->f_16s16 = value; 2464214571Sdim break; 2465214571Sdim case MEP_OPERAND_SIMM16 : 2466214571Sdim fields->f_16s16 = value; 2467214571Sdim break; 2468214571Sdim case MEP_OPERAND_SIMM6 : 2469214571Sdim fields->f_6s8 = value; 2470214571Sdim break; 2471214571Sdim case MEP_OPERAND_SIMM8 : 2472214571Sdim fields->f_8s8 = value; 2473214571Sdim break; 2474214571Sdim case MEP_OPERAND_SP : 2475214571Sdim break; 2476214571Sdim case MEP_OPERAND_SPR : 2477214571Sdim break; 2478214571Sdim case MEP_OPERAND_TP : 2479214571Sdim break; 2480214571Sdim case MEP_OPERAND_TPR : 2481214571Sdim break; 2482214571Sdim case MEP_OPERAND_UDISP2 : 2483214571Sdim fields->f_2u6 = value; 2484214571Sdim break; 2485214571Sdim case MEP_OPERAND_UDISP7 : 2486214571Sdim fields->f_7u9 = value; 2487214571Sdim break; 2488214571Sdim case MEP_OPERAND_UDISP7A2 : 2489214571Sdim fields->f_7u9a2 = value; 2490214571Sdim break; 2491214571Sdim case MEP_OPERAND_UDISP7A4 : 2492214571Sdim fields->f_7u9a4 = value; 2493214571Sdim break; 2494214571Sdim case MEP_OPERAND_UIMM16 : 2495214571Sdim fields->f_16u16 = value; 2496214571Sdim break; 2497214571Sdim case MEP_OPERAND_UIMM2 : 2498214571Sdim fields->f_2u10 = value; 2499214571Sdim break; 2500214571Sdim case MEP_OPERAND_UIMM24 : 2501214571Sdim fields->f_24u8n = value; 2502214571Sdim break; 2503214571Sdim case MEP_OPERAND_UIMM3 : 2504214571Sdim fields->f_3u5 = value; 2505214571Sdim break; 2506214571Sdim case MEP_OPERAND_UIMM4 : 2507214571Sdim fields->f_4u8 = value; 2508214571Sdim break; 2509214571Sdim case MEP_OPERAND_UIMM5 : 2510214571Sdim fields->f_5u8 = value; 2511214571Sdim break; 2512214571Sdim case MEP_OPERAND_UIMM7A4 : 2513214571Sdim fields->f_7u9a4 = value; 2514214571Sdim break; 2515214571Sdim case MEP_OPERAND_ZERO : 2516214571Sdim break; 2517214571Sdim 2518214571Sdim default : 2519214571Sdim /* xgettext:c-format */ 2520214571Sdim fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"), 2521214571Sdim opindex); 2522214571Sdim abort (); 2523214571Sdim } 2524214571Sdim} 2525214571Sdim 2526214571Sdim/* Function to call before using the instruction builder tables. */ 2527214571Sdim 2528214571Sdimvoid 2529214571Sdimmep_cgen_init_ibld_table (CGEN_CPU_DESC cd) 2530214571Sdim{ 2531214571Sdim cd->insert_handlers = & mep_cgen_insert_handlers[0]; 2532214571Sdim cd->extract_handlers = & mep_cgen_extract_handlers[0]; 2533214571Sdim 2534214571Sdim cd->insert_operand = mep_cgen_insert_operand; 2535214571Sdim cd->extract_operand = mep_cgen_extract_operand; 2536214571Sdim 2537214571Sdim cd->get_int_operand = mep_cgen_get_int_operand; 2538214571Sdim cd->set_int_operand = mep_cgen_set_int_operand; 2539214571Sdim cd->get_vma_operand = mep_cgen_get_vma_operand; 2540214571Sdim cd->set_vma_operand = mep_cgen_set_vma_operand; 2541214571Sdim} 2542