mep-ibld.c revision 214571
1119418Sobrien/* Instruction building/extraction support for mep. -*- C -*- 2119418Sobrien 393746Sjulian THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator. 493746Sjulian - the resultant file is machine generated, cgen-ibld.in isn't 593746Sjulian 693746Sjulian Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006 793746Sjulian Free Software Foundation, Inc. 893746Sjulian 993746Sjulian This file is part of the GNU Binutils and GDB, the GNU debugger. 1093746Sjulian 1193746Sjulian This program is free software; you can redistribute it and/or modify 1293746Sjulian it under the terms of the GNU General Public License as published by 1393746Sjulian the Free Software Foundation; either version 2, or (at your option) 1493746Sjulian any later version. 1593746Sjulian 1693746Sjulian This program is distributed in the hope that it will be useful, 1793746Sjulian but WITHOUT ANY WARRANTY; without even the implied warranty of 1893746Sjulian MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1993746Sjulian GNU General Public License for more details. 2093746Sjulian 2193746Sjulian You should have received a copy of the GNU General Public License 2293746Sjulian along with this program; if not, write to the Free Software Foundation, Inc., 2393746Sjulian 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */ 2493746Sjulian 2593746Sjulian/* ??? Eventually more and more of this stuff can go to cpu-independent files. 2693746Sjulian Keep that in mind. */ 27119418Sobrien 2893746Sjulian#include "sysdep.h" 29113038Sobrien#include <stdio.h> 30113038Sobrien#include "ansidecl.h" 31113038Sobrien#include "dis-asm.h" 32113038Sobrien#include "bfd.h" 3393746Sjulian#include "symcat.h" 3493746Sjulian#include "mep-desc.h" 3593746Sjulian#include "mep-opc.h" 3693746Sjulian#include "opintl.h" 3793746Sjulian#include "safe-ctype.h" 3893746Sjulian 3993746Sjulian#undef min 4093746Sjulian#define min(a,b) ((a) < (b) ? (a) : (b)) 4193746Sjulian#undef max 4293746Sjulian#define max(a,b) ((a) > (b) ? (a) : (b)) 4395807Sjulian 4495807Sjulian/* Used by the ifield rtx function. */ 4593746Sjulian#define FLD(f) (fields->f) 4693746Sjulian 4793746Sjulianstatic const char * insert_normal 4893746Sjulian (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int, 4993746Sjulian unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR); 5093746Sjulianstatic const char * insert_insn_normal 5193746Sjulian (CGEN_CPU_DESC, const CGEN_INSN *, 52147256Sbrooks CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma); 5393746Sjulianstatic int extract_normal 5493746Sjulian (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, 5593746Sjulian unsigned int, unsigned int, unsigned int, unsigned int, 5693746Sjulian unsigned int, unsigned int, bfd_vma, long *); 5793746Sjulianstatic int extract_insn_normal 5893746Sjulian (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *, 5993746Sjulian CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma); 6093746Sjulian#if CGEN_INT_INSN_P 6193746Sjulianstatic void put_insn_int_value 6293746Sjulian (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT); 63119285Simp#endif 64119285Simp#if ! CGEN_INT_INSN_P 6593746Sjulianstatic CGEN_INLINE void insert_1 6693746Sjulian (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *); 6793746Sjulianstatic CGEN_INLINE int fill_cache 6893746Sjulian (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma); 6993746Sjulianstatic CGEN_INLINE long extract_1 7093746Sjulian (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma); 7193746Sjulian#endif 72153084Sru 7394904Sjulian/* Operand insertion. */ 7494904Sjulian 7593746Sjulian#if ! CGEN_INT_INSN_P 7694904Sjulian 7794904Sjulian/* Subroutine of insert_normal. */ 7893746Sjulian 7993746Sjulianstatic CGEN_INLINE void 8093746Sjulianinsert_1 (CGEN_CPU_DESC cd, 8193746Sjulian unsigned long value, 8293746Sjulian int start, 8393746Sjulian int length, 8493746Sjulian int word_length, 8593746Sjulian unsigned char *bufp) 8693746Sjulian{ 8793746Sjulian unsigned long x,mask; 8893746Sjulian int shift; 8993746Sjulian 9093746Sjulian x = cgen_get_insn_value (cd, bufp, word_length); 9193746Sjulian 9293746Sjulian /* Written this way to avoid undefined behaviour. */ 9393746Sjulian mask = (((1L << (length - 1)) - 1) << 1) | 1; 9493746Sjulian if (CGEN_INSN_LSB0_P) 9593746Sjulian shift = (start + 1) - length; 9693746Sjulian else 9793746Sjulian shift = (word_length - (start + length)); 9893746Sjulian x = (x & ~(mask << shift)) | ((value & mask) << shift); 9993746Sjulian 10093746Sjulian cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x); 10193746Sjulian} 10293746Sjulian 10393746Sjulian#endif /* ! CGEN_INT_INSN_P */ 10493746Sjulian 10593746Sjulian/* Default insertion routine. 10693746Sjulian 10793746Sjulian ATTRS is a mask of the boolean attributes. 10893746Sjulian WORD_OFFSET is the offset in bits from the start of the insn of the value. 10993746Sjulian WORD_LENGTH is the length of the word in bits in which the value resides. 11093746Sjulian START is the starting bit number in the word, architecture origin. 11193746Sjulian LENGTH is the length of VALUE in bits. 11293746Sjulian TOTAL_LENGTH is the total length of the insn in bits. 11393746Sjulian 11493746Sjulian The result is an error message or NULL if success. */ 11593746Sjulian 11693746Sjulian/* ??? This duplicates functionality with bfd's howto table and 11793746Sjulian bfd_install_relocation. */ 118149151Sjhb/* ??? This doesn't handle bfd_vma's. Create another function when 11993746Sjulian necessary. */ 12093746Sjulian 121149151Sjhbstatic const char * 12293746Sjulianinsert_normal (CGEN_CPU_DESC cd, 123199540Sjhb long value, 124199540Sjhb unsigned int attrs, 125188172Simp unsigned int word_offset, 12693746Sjulian unsigned int start, 12793746Sjulian unsigned int length, 12893746Sjulian unsigned int word_length, 12993746Sjulian unsigned int total_length, 13093746Sjulian CGEN_INSN_BYTES_PTR buffer) 13193746Sjulian{ 13293746Sjulian static char errbuf[100]; 13393746Sjulian /* Written this way to avoid undefined behaviour. */ 13493746Sjulian unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1; 13593746Sjulian 13693746Sjulian /* If LENGTH is zero, this operand doesn't contribute to the value. */ 13793746Sjulian if (length == 0) 13893746Sjulian return NULL; 13993746Sjulian 14093746Sjulian if (word_length > 32) 141106696Salfred abort (); 142106696Salfred 14393746Sjulian /* For architectures with insns smaller than the base-insn-bitsize, 14493746Sjulian word_length may be too big. */ 14593746Sjulian if (cd->min_insn_bitsize < cd->base_insn_bitsize) 14693746Sjulian { 14793746Sjulian if (word_offset == 0 14893746Sjulian && word_length > total_length) 14993746Sjulian word_length = total_length; 15093746Sjulian } 151246128Ssbz 15293746Sjulian /* Ensure VALUE will fit. */ 15393746Sjulian if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT)) 15493746Sjulian { 15593746Sjulian long minval = - (1L << (length - 1)); 15693746Sjulian unsigned long maxval = mask; 15793746Sjulian 15893746Sjulian if ((value > 0 && (unsigned long) value > maxval) 15993746Sjulian || value < minval) 16093746Sjulian { 16193746Sjulian /* xgettext:c-format */ 162113506Smdodd sprintf (errbuf, 163113506Smdodd _("operand out of range (%ld not between %ld and %lu)"), 164113506Smdodd value, minval, maxval); 16593746Sjulian return errbuf; 16693746Sjulian } 16793746Sjulian } 16893746Sjulian else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)) 16993746Sjulian { 17093746Sjulian unsigned long maxval = mask; 17193746Sjulian unsigned long val = (unsigned long) value; 17293746Sjulian 173149151Sjhb /* For hosts with a word size > 32 check to see if value has been sign 17493746Sjulian extended beyond 32 bits. If so then ignore these higher sign bits 17593746Sjulian as the user is attempting to store a 32-bit signed value into an 17693746Sjulian unsigned 32-bit field which is allowed. */ 17793746Sjulian if (sizeof (unsigned long) > 4 && ((value >> 32) == -1)) 17893746Sjulian val &= 0xFFFFFFFF; 17993746Sjulian 18093746Sjulian if (val > maxval) 18193746Sjulian { 18293746Sjulian /* xgettext:c-format */ 18393746Sjulian sprintf (errbuf, 18493746Sjulian _("operand out of range (0x%lx not between 0 and 0x%lx)"), 18593746Sjulian val, maxval); 18693746Sjulian return errbuf; 18793746Sjulian } 18893746Sjulian } 18993746Sjulian else 19093746Sjulian { 19193746Sjulian if (! cgen_signed_overflow_ok_p (cd)) 19293746Sjulian { 19393746Sjulian long minval = - (1L << (length - 1)); 19493746Sjulian long maxval = (1L << (length - 1)) - 1; 19593746Sjulian 19693746Sjulian if (value < minval || value > maxval) 19793746Sjulian { 19893746Sjulian sprintf 19993746Sjulian /* xgettext:c-format */ 20093746Sjulian (errbuf, _("operand out of range (%ld not between %ld and %ld)"), 20193746Sjulian value, minval, maxval); 20293746Sjulian return errbuf; 20393746Sjulian } 20493746Sjulian } 20593746Sjulian } 20693746Sjulian 20793746Sjulian#if CGEN_INT_INSN_P 20893746Sjulian 20993746Sjulian { 21093746Sjulian int shift; 21193746Sjulian 21293746Sjulian if (CGEN_INSN_LSB0_P) 21393746Sjulian shift = (word_offset + start + 1) - length; 21493746Sjulian else 21593746Sjulian shift = total_length - (word_offset + start + length); 21693746Sjulian *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift); 21793746Sjulian } 21893746Sjulian 219148945Sjhb#else /* ! CGEN_INT_INSN_P */ 22093746Sjulian 22193746Sjulian { 22293746Sjulian unsigned char *bufp = (unsigned char *) buffer + word_offset / 8; 22393746Sjulian 22493746Sjulian insert_1 (cd, value, start, length, word_length, bufp); 225149151Sjhb } 22693746Sjulian 22793746Sjulian#endif /* ! CGEN_INT_INSN_P */ 22893746Sjulian 22993746Sjulian return NULL; 23093746Sjulian} 23193746Sjulian 23293746Sjulian/* Default insn builder (insert handler). 23393746Sjulian The instruction is recorded in CGEN_INT_INSN_P byte order (meaning 23493746Sjulian that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is 23593746Sjulian recorded in host byte order, otherwise BUFFER is an array of bytes 23693746Sjulian and the value is recorded in target byte order). 23793746Sjulian The result is an error message or NULL if success. */ 23893746Sjulian 23993746Sjulianstatic const char * 24093746Sjulianinsert_insn_normal (CGEN_CPU_DESC cd, 24193746Sjulian const CGEN_INSN * insn, 24293746Sjulian CGEN_FIELDS * fields, 24393746Sjulian CGEN_INSN_BYTES_PTR buffer, 24493746Sjulian bfd_vma pc) 24593746Sjulian{ 24693746Sjulian const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 24793746Sjulian unsigned long value; 24893746Sjulian const CGEN_SYNTAX_CHAR_TYPE * syn; 24993746Sjulian 25093746Sjulian CGEN_INIT_INSERT (cd); 25193746Sjulian value = CGEN_INSN_BASE_VALUE (insn); 25293746Sjulian 25393746Sjulian /* If we're recording insns as numbers (rather than a string of bytes), 25493746Sjulian target byte order handling is deferred until later. */ 25593746Sjulian 25693746Sjulian#if CGEN_INT_INSN_P 25793746Sjulian 25893746Sjulian put_insn_int_value (cd, buffer, cd->base_insn_bitsize, 25993746Sjulian CGEN_FIELDS_BITSIZE (fields), value); 26093746Sjulian 26193746Sjulian#else 26293746Sjulian 26393746Sjulian cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize, 26493746Sjulian (unsigned) CGEN_FIELDS_BITSIZE (fields)), 26593746Sjulian value); 26693746Sjulian 26793746Sjulian#endif /* ! CGEN_INT_INSN_P */ 26893746Sjulian 269149151Sjhb /* ??? It would be better to scan the format's fields. 27093746Sjulian Still need to be able to insert a value based on the operand though; 27193746Sjulian e.g. storing a branch displacement that got resolved later. 27293746Sjulian Needs more thought first. */ 27393746Sjulian 27493746Sjulian for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn) 27593746Sjulian { 27693746Sjulian const char *errmsg; 27793746Sjulian 27893746Sjulian if (CGEN_SYNTAX_CHAR_P (* syn)) 27993746Sjulian continue; 28093746Sjulian 28193746Sjulian errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 28293746Sjulian fields, buffer, pc); 28393746Sjulian if (errmsg) 28493746Sjulian return errmsg; 28593746Sjulian } 28693746Sjulian 28793746Sjulian return NULL; 28893746Sjulian} 28993746Sjulian 29093746Sjulian#if CGEN_INT_INSN_P 29193746Sjulian/* Cover function to store an insn value into an integral insn. Must go here 29293746Sjulian because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */ 29393746Sjulian 29493746Sjulianstatic void 29593746Sjulianput_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 29693746Sjulian CGEN_INSN_BYTES_PTR buf, 29793746Sjulian int length, 29893746Sjulian int insn_length, 29993746Sjulian CGEN_INSN_INT value) 30093746Sjulian{ 30193746Sjulian /* For architectures with insns smaller than the base-insn-bitsize, 30293746Sjulian length may be too big. */ 30393746Sjulian if (length > insn_length) 30493746Sjulian *buf = value; 30593746Sjulian else 30693746Sjulian { 30793746Sjulian int shift = insn_length - length; 30893746Sjulian /* Written this way to avoid undefined behaviour. */ 30993746Sjulian CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1; 31093746Sjulian 31193746Sjulian *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift); 31293746Sjulian } 31393746Sjulian} 31493746Sjulian#endif 31593746Sjulian 316149151Sjhb/* Operand extraction. */ 31793746Sjulian 318147256Sbrooks#if ! CGEN_INT_INSN_P 31993746Sjulian 32093746Sjulian/* Subroutine of extract_normal. 32193746Sjulian Ensure sufficient bytes are cached in EX_INFO. 32293746Sjulian OFFSET is the offset in bytes from the start of the insn of the value. 32393746Sjulian BYTES is the length of the needed value. 32493746Sjulian Returns 1 for success, 0 for failure. */ 32593746Sjulian 32693746Sjulianstatic CGEN_INLINE int 32793746Sjulianfill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 32893746Sjulian CGEN_EXTRACT_INFO *ex_info, 32993746Sjulian int offset, 33093746Sjulian int bytes, 33193746Sjulian bfd_vma pc) 33293746Sjulian{ 33393746Sjulian /* It's doubtful that the middle part has already been fetched so 33493746Sjulian we don't optimize that case. kiss. */ 335195049Srwatson unsigned int mask; 33693746Sjulian disassemble_info *info = (disassemble_info *) ex_info->dis_info; 33793746Sjulian 33893746Sjulian /* First do a quick check. */ 339130270Snaddy mask = (1 << bytes) - 1; 340130270Snaddy if (((ex_info->valid >> offset) & mask) == mask) 34193746Sjulian return 1; 34293746Sjulian 34393746Sjulian /* Search for the first byte we need to read. */ 34493746Sjulian for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1) 34593746Sjulian if (! (mask & ex_info->valid)) 34693746Sjulian break; 347195049Srwatson 34893746Sjulian if (bytes) 34993746Sjulian { 35093746Sjulian int status; 35193746Sjulian 35293746Sjulian pc += offset; 35393746Sjulian status = (*info->read_memory_func) 35493746Sjulian (pc, ex_info->insn_bytes + offset, bytes, info); 35593746Sjulian 35693746Sjulian if (status != 0) 35793746Sjulian { 35893746Sjulian (*info->memory_error_func) (status, pc, info); 35993746Sjulian return 0; 36093746Sjulian } 36193746Sjulian 36293746Sjulian ex_info->valid |= ((1 << bytes) - 1) << offset; 36393746Sjulian } 36493746Sjulian 36593746Sjulian return 1; 36693746Sjulian} 367149151Sjhb 36893746Sjulian/* Subroutine of extract_normal. */ 36993746Sjulian 37093746Sjulianstatic CGEN_INLINE long 37193746Sjulianextract_1 (CGEN_CPU_DESC cd, 37293746Sjulian CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 37393746Sjulian int start, 37493746Sjulian int length, 37593746Sjulian int word_length, 37693746Sjulian unsigned char *bufp, 37793746Sjulian bfd_vma pc ATTRIBUTE_UNUSED) 37893746Sjulian{ 37993746Sjulian unsigned long x; 380199540Sjhb int shift; 381199540Sjhb 382199540Sjhb x = cgen_get_insn_value (cd, bufp, word_length); 383199540Sjhb 38493746Sjulian if (CGEN_INSN_LSB0_P) 385199540Sjhb shift = (start + 1) - length; 386199540Sjhb else 387199540Sjhb shift = (word_length - (start + length)); 388199540Sjhb return x >> shift; 389199540Sjhb} 39093746Sjulian 39193746Sjulian#endif /* ! CGEN_INT_INSN_P */ 39293746Sjulian 39393746Sjulian/* Default extraction routine. 39493746Sjulian 39593746Sjulian INSN_VALUE is the first base_insn_bitsize bits of the insn in host order, 39693746Sjulian or sometimes less for cases like the m32r where the base insn size is 32 39793746Sjulian but some insns are 16 bits. 39893746Sjulian ATTRS is a mask of the boolean attributes. We only need `SIGNED', 39993746Sjulian but for generality we take a bitmask of all of them. 40093746Sjulian WORD_OFFSET is the offset in bits from the start of the insn of the value. 401149151Sjhb WORD_LENGTH is the length of the word in bits in which the value resides. 40293746Sjulian START is the starting bit number in the word, architecture origin. 40393746Sjulian LENGTH is the length of VALUE in bits. 404147256Sbrooks TOTAL_LENGTH is the total length of the insn in bits. 40593746Sjulian 40693746Sjulian Returns 1 for success, 0 for failure. */ 40793746Sjulian 40893746Sjulian/* ??? The return code isn't properly used. wip. */ 40993746Sjulian 41093746Sjulian/* ??? This doesn't handle bfd_vma's. Create another function when 41193746Sjulian necessary. */ 41293746Sjulian 41393746Sjulianstatic int 41493746Sjulianextract_normal (CGEN_CPU_DESC cd, 41593746Sjulian#if ! CGEN_INT_INSN_P 416162321Sglebius CGEN_EXTRACT_INFO *ex_info, 417162321Sglebius#else 41893746Sjulian CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 41993746Sjulian#endif 42093746Sjulian CGEN_INSN_INT insn_value, 42193746Sjulian unsigned int attrs, 42293746Sjulian unsigned int word_offset, 42393746Sjulian unsigned int start, 42493746Sjulian unsigned int length, 42593746Sjulian unsigned int word_length, 42693746Sjulian unsigned int total_length, 42793746Sjulian#if ! CGEN_INT_INSN_P 42893746Sjulian bfd_vma pc, 42993746Sjulian#else 43093746Sjulian bfd_vma pc ATTRIBUTE_UNUSED, 43193746Sjulian#endif 43293746Sjulian long *valuep) 43393746Sjulian{ 43493746Sjulian long value, mask; 43593746Sjulian 43693746Sjulian /* If LENGTH is zero, this operand doesn't contribute to the value 43793746Sjulian so give it a standard value of zero. */ 43893746Sjulian if (length == 0) 43993746Sjulian { 44093746Sjulian *valuep = 0; 44193746Sjulian return 1; 44293746Sjulian } 44393746Sjulian 44493746Sjulian if (word_length > 32) 44593746Sjulian abort (); 446199540Sjhb 447199540Sjhb /* For architectures with insns smaller than the insn-base-bitsize, 44893746Sjulian word_length may be too big. */ 44993746Sjulian if (cd->min_insn_bitsize < cd->base_insn_bitsize) 45093746Sjulian { 45193746Sjulian if (word_offset + word_length > total_length) 452199540Sjhb word_length = total_length - word_offset; 45393746Sjulian } 45493746Sjulian 45593746Sjulian /* Does the value reside in INSN_VALUE, and at the right alignment? */ 456162321Sglebius 45793746Sjulian if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length)) 45893746Sjulian { 45993746Sjulian if (CGEN_INSN_LSB0_P) 46093746Sjulian value = insn_value >> ((word_offset + start + 1) - length); 46193746Sjulian else 462162321Sglebius value = insn_value >> (total_length - ( word_offset + start + length)); 46393746Sjulian } 46493746Sjulian 46593746Sjulian#if ! CGEN_INT_INSN_P 466162321Sglebius 46793746Sjulian else 46893746Sjulian { 46993746Sjulian unsigned char *bufp = ex_info->insn_bytes + word_offset / 8; 47093746Sjulian 47193746Sjulian if (word_length > 32) 47293746Sjulian abort (); 47393746Sjulian 474162321Sglebius if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0) 47593746Sjulian return 0; 47693746Sjulian 47793746Sjulian value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc); 47893746Sjulian } 47993746Sjulian 48093746Sjulian#endif /* ! CGEN_INT_INSN_P */ 48193746Sjulian 48293746Sjulian /* Written this way to avoid undefined behaviour. */ 48393746Sjulian mask = (((1L << (length - 1)) - 1) << 1) | 1; 48493746Sjulian 48593746Sjulian value &= mask; 48695673Sphk /* sign extend? */ 48793746Sjulian if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED) 48893746Sjulian && (value & (1L << (length - 1)))) 48993746Sjulian value |= ~mask; 49093746Sjulian 49193746Sjulian *valuep = value; 49293746Sjulian 49393746Sjulian return 1; 49493746Sjulian} 49593746Sjulian 49693746Sjulian/* Default insn extractor. 49793746Sjulian 49893746Sjulian INSN_VALUE is the first base_insn_bitsize bits, translated to host order. 49995673Sphk The extracted fields are stored in FIELDS. 50093746Sjulian EX_INFO is used to handle reading variable length insns. 50193746Sjulian Return the length of the insn in bits, or 0 if no match, 50293746Sjulian or -1 if an error occurs fetching data (memory_error_func will have 50393746Sjulian been called). */ 50493746Sjulian 50593746Sjulianstatic int 50693746Sjulianextract_insn_normal (CGEN_CPU_DESC cd, 50793746Sjulian const CGEN_INSN *insn, 50893746Sjulian CGEN_EXTRACT_INFO *ex_info, 50993746Sjulian CGEN_INSN_INT insn_value, 51093746Sjulian CGEN_FIELDS *fields, 51193746Sjulian bfd_vma pc) 51293746Sjulian{ 51393746Sjulian const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 51493746Sjulian const CGEN_SYNTAX_CHAR_TYPE *syn; 51593746Sjulian 51693746Sjulian CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn); 51793746Sjulian 51893746Sjulian CGEN_INIT_EXTRACT (cd); 51993746Sjulian 52093746Sjulian for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn) 52193746Sjulian { 52293746Sjulian int length; 52393746Sjulian 52493746Sjulian if (CGEN_SYNTAX_CHAR_P (*syn)) 52593746Sjulian continue; 52693746Sjulian 52793746Sjulian length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 52893746Sjulian ex_info, insn_value, fields, pc); 52993746Sjulian if (length <= 0) 53093746Sjulian return length; 53193746Sjulian } 53293746Sjulian 53393746Sjulian /* We recognized and successfully extracted this insn. */ 53493746Sjulian return CGEN_INSN_BITSIZE (insn); 53593746Sjulian} 53693746Sjulian 53793746Sjulian/* Machine generated code added here. */ 53893746Sjulian 53993746Sjulianconst char * mep_cgen_insert_operand 54093746Sjulian (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma); 54193746Sjulian 54293746Sjulian/* Main entry point for operand insertion. 54393746Sjulian 544162321Sglebius This function is basically just a big switch statement. Earlier versions 54593746Sjulian used tables to look up the function to use, but 54693746Sjulian - if the table contains both assembler and disassembler functions then 547149151Sjhb the disassembler contains much of the assembler and vice-versa, 54893746Sjulian - there's a lot of inlining possibilities as things grow, 54993746Sjulian - using a switch statement avoids the function call overhead. 55093746Sjulian 551149151Sjhb This function could be moved into `parse_insn_normal', but keeping it 55293746Sjulian separate makes clear the interface between `parse_insn_normal' and each of 55393746Sjulian the handlers. It's also needed by GAS to insert operands that couldn't be 55493746Sjulian resolved during parsing. */ 55593746Sjulian 55693746Sjulianconst char * 55793746Sjulianmep_cgen_insert_operand (CGEN_CPU_DESC cd, 55893746Sjulian int opindex, 55993746Sjulian CGEN_FIELDS * fields, 56093746Sjulian CGEN_INSN_BYTES_PTR buffer, 56193746Sjulian bfd_vma pc ATTRIBUTE_UNUSED) 56293746Sjulian{ 56393746Sjulian const char * errmsg = NULL; 56493746Sjulian unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 565149151Sjhb 566147256Sbrooks switch (opindex) 56793746Sjulian { 56893746Sjulian case MEP_OPERAND_ADDR24A4 : 569162321Sglebius { 57093746Sjulian{ 57193746Sjulian FLD (f_24u8a4n_hi) = ((unsigned int) (FLD (f_24u8a4n)) >> (8)); 57293746Sjulian FLD (f_24u8a4n_lo) = ((unsigned int) (((FLD (f_24u8a4n)) & (252))) >> (2)); 57393746Sjulian} 57493746Sjulian errmsg = insert_normal (cd, fields->f_24u8a4n_hi, 0, 0, 16, 16, 32, total_length, buffer); 57593746Sjulian if (errmsg) 576162321Sglebius break; 577162321Sglebius errmsg = insert_normal (cd, fields->f_24u8a4n_lo, 0, 0, 8, 6, 32, total_length, buffer); 57893746Sjulian if (errmsg) 57993746Sjulian break; 58093746Sjulian } 58193746Sjulian break; 58293746Sjulian case MEP_OPERAND_CALLNUM : 58393746Sjulian { 584162321Sglebius{ 585162321Sglebius FLD (f_5) = ((((unsigned int) (FLD (f_callnum)) >> (3))) & (1)); 58693746Sjulian FLD (f_6) = ((((unsigned int) (FLD (f_callnum)) >> (2))) & (1)); 58793746Sjulian FLD (f_7) = ((((unsigned int) (FLD (f_callnum)) >> (1))) & (1)); 58893746Sjulian FLD (f_11) = ((FLD (f_callnum)) & (1)); 58993746Sjulian} 59093746Sjulian errmsg = insert_normal (cd, fields->f_5, 0, 0, 5, 1, 32, total_length, buffer); 59193746Sjulian if (errmsg) 59293746Sjulian break; 593162321Sglebius errmsg = insert_normal (cd, fields->f_6, 0, 0, 6, 1, 32, total_length, buffer); 594162321Sglebius if (errmsg) 59593746Sjulian break; 59693746Sjulian errmsg = insert_normal (cd, fields->f_7, 0, 0, 7, 1, 32, total_length, buffer); 59793746Sjulian if (errmsg) 59893746Sjulian break; 59993746Sjulian errmsg = insert_normal (cd, fields->f_11, 0, 0, 11, 1, 32, total_length, buffer); 60093746Sjulian if (errmsg) 60193746Sjulian break; 60293746Sjulian } 603162321Sglebius break; 604162321Sglebius case MEP_OPERAND_CCCC : 60593746Sjulian errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 60693746Sjulian break; 60793746Sjulian case MEP_OPERAND_CCRN : 60893746Sjulian { 60993746Sjulian{ 61093746Sjulian FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3)); 61193746Sjulian FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15)); 61293746Sjulian} 613162321Sglebius errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer); 61493746Sjulian if (errmsg) 61593746Sjulian break; 61693746Sjulian errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer); 61793746Sjulian if (errmsg) 61893746Sjulian break; 619162321Sglebius } 620162321Sglebius break; 62193746Sjulian case MEP_OPERAND_CDISP8 : 62293746Sjulian errmsg = insert_normal (cd, fields->f_8s24, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, buffer); 62393746Sjulian break; 62493746Sjulian case MEP_OPERAND_CDISP8A2 : 62594863Sjulian { 62693746Sjulian long value = fields->f_8s24a2; 62793746Sjulian value = ((int) (value) >> (1)); 628162321Sglebius errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, buffer); 629162321Sglebius } 63093746Sjulian break; 63193746Sjulian case MEP_OPERAND_CDISP8A4 : 63295673Sphk { 63395673Sphk long value = fields->f_8s24a4; 63493746Sjulian value = ((int) (value) >> (2)); 63593746Sjulian errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, buffer); 636162321Sglebius } 637162321Sglebius break; 63893746Sjulian case MEP_OPERAND_CDISP8A8 : 63995673Sphk { 64093746Sjulian long value = fields->f_8s24a8; 64195673Sphk value = ((int) (value) >> (3)); 64293746Sjulian errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, buffer); 64393746Sjulian } 64493746Sjulian break; 64593746Sjulian case MEP_OPERAND_CIMM4 : 646162321Sglebius errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 64793746Sjulian break; 64893746Sjulian case MEP_OPERAND_CIMM5 : 64993746Sjulian errmsg = insert_normal (cd, fields->f_5u24, 0, 0, 24, 5, 32, total_length, buffer); 65093746Sjulian break; 65193746Sjulian case MEP_OPERAND_CODE16 : 65293746Sjulian errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer); 65393746Sjulian break; 65493746Sjulian case MEP_OPERAND_CODE24 : 65593746Sjulian { 65693746Sjulian{ 65793746Sjulian FLD (f_24u4n_hi) = ((unsigned int) (FLD (f_24u4n)) >> (16)); 65893746Sjulian FLD (f_24u4n_lo) = ((FLD (f_24u4n)) & (65535)); 65993746Sjulian} 66093746Sjulian errmsg = insert_normal (cd, fields->f_24u4n_hi, 0, 0, 4, 8, 32, total_length, buffer); 661149151Sjhb if (errmsg) 66293746Sjulian break; 66393746Sjulian errmsg = insert_normal (cd, fields->f_24u4n_lo, 0, 0, 16, 16, 32, total_length, buffer); 66493746Sjulian if (errmsg) 66593746Sjulian break; 666162321Sglebius } 667199540Sjhb break; 668199540Sjhb case MEP_OPERAND_CP_FLAG : 66993746Sjulian break; 67093746Sjulian case MEP_OPERAND_CRN : 67193746Sjulian errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer); 67293746Sjulian break; 673162321Sglebius case MEP_OPERAND_CRN64 : 67493746Sjulian errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer); 67593746Sjulian break; 67693746Sjulian case MEP_OPERAND_CRNX : 67794863Sjulian { 67894863Sjulian{ 67995673Sphk FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15)); 68093746Sjulian FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4)); 68193746Sjulian} 68293746Sjulian errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer); 68393746Sjulian if (errmsg) 68493746Sjulian break; 68593746Sjulian errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer); 68693746Sjulian if (errmsg) 68793746Sjulian break; 68893746Sjulian } 68993746Sjulian break; 69093746Sjulian case MEP_OPERAND_CRNX64 : 69193746Sjulian { 69293746Sjulian{ 69393746Sjulian FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15)); 69493746Sjulian FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4)); 69593746Sjulian} 69693746Sjulian errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer); 69793746Sjulian if (errmsg) 69893746Sjulian break; 69993746Sjulian errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer); 70093746Sjulian if (errmsg) 70193746Sjulian break; 70293746Sjulian } 70393746Sjulian break; 70493746Sjulian case MEP_OPERAND_CSRN : 70593746Sjulian { 70693746Sjulian{ 70793746Sjulian FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15)); 70893746Sjulian FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4)); 70993746Sjulian} 71093746Sjulian errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer); 71193746Sjulian if (errmsg) 71293746Sjulian break; 71393746Sjulian errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer); 71493746Sjulian if (errmsg) 71593746Sjulian break; 71693746Sjulian } 71793746Sjulian break; 71893746Sjulian case MEP_OPERAND_CSRN_IDX : 71993746Sjulian { 72093746Sjulian{ 721149151Sjhb FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15)); 72293746Sjulian FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4)); 72393746Sjulian} 72493746Sjulian errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer); 72593746Sjulian if (errmsg) 72693746Sjulian break; 72793746Sjulian errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer); 72893746Sjulian if (errmsg) 72993746Sjulian break; 73093746Sjulian } 73193746Sjulian break; 732162321Sglebius case MEP_OPERAND_DBG : 733148945Sjhb break; 73493746Sjulian case MEP_OPERAND_DEPC : 73593746Sjulian break; 73693746Sjulian case MEP_OPERAND_EPC : 73793746Sjulian break; 73893746Sjulian case MEP_OPERAND_EXC : 73993746Sjulian break; 74093746Sjulian case MEP_OPERAND_FMAX_CCRN : 74193746Sjulian errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 74293746Sjulian break; 74393746Sjulian case MEP_OPERAND_FMAX_FRD : 74493746Sjulian { 74593746Sjulian{ 74693746Sjulian FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15)); 74793746Sjulian FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4)); 74893746Sjulian} 74993746Sjulian errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer); 75093746Sjulian if (errmsg) 75193746Sjulian break; 75293746Sjulian errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 75393746Sjulian if (errmsg) 75493746Sjulian break; 755149151Sjhb } 75693746Sjulian break; 75793746Sjulian case MEP_OPERAND_FMAX_FRD_INT : 75893746Sjulian { 75993746Sjulian{ 76093746Sjulian FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15)); 76193746Sjulian FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4)); 76293746Sjulian} 763162321Sglebius errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer); 76493746Sjulian if (errmsg) 76593746Sjulian break; 76693746Sjulian errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer); 76793746Sjulian if (errmsg) 76893746Sjulian break; 76993746Sjulian } 77093746Sjulian break; 77193746Sjulian case MEP_OPERAND_FMAX_FRM : 77293746Sjulian { 77393746Sjulian{ 77493746Sjulian FLD (f_fmax_24_4) = ((FLD (f_fmax_frm)) & (15)); 77593746Sjulian FLD (f_fmax_30_1) = ((unsigned int) (FLD (f_fmax_frm)) >> (4)); 77693746Sjulian} 77793746Sjulian errmsg = insert_normal (cd, fields->f_fmax_30_1, 0, 0, 30, 1, 32, total_length, buffer); 77893746Sjulian if (errmsg) 77993746Sjulian break; 78093746Sjulian errmsg = insert_normal (cd, fields->f_fmax_24_4, 0, 0, 24, 4, 32, total_length, buffer); 78193746Sjulian if (errmsg) 78293746Sjulian break; 78393746Sjulian } 78493746Sjulian break; 785143158Simp case MEP_OPERAND_FMAX_FRN : 78693746Sjulian { 78793746Sjulian{ 78893746Sjulian FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15)); 78993746Sjulian FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4)); 79093746Sjulian} 79193746Sjulian errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer); 79293746Sjulian if (errmsg) 79393746Sjulian break; 79493746Sjulian errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer); 79593746Sjulian if (errmsg) 79693746Sjulian break; 79793746Sjulian } 79893746Sjulian break; 799149151Sjhb case MEP_OPERAND_FMAX_FRN_INT : 80093746Sjulian { 801148946Sjhb{ 80293746Sjulian FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15)); 80393746Sjulian FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4)); 80493746Sjulian} 80593746Sjulian errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer); 80693746Sjulian if (errmsg) 80793746Sjulian break; 80893746Sjulian errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer); 809148945Sjhb if (errmsg) 81093746Sjulian break; 81193746Sjulian } 812162321Sglebius break; 81395803Sjulian case MEP_OPERAND_FMAX_RM : 814149151Sjhb errmsg = insert_normal (cd, fields->f_fmax_rm, 0, 0, 8, 4, 32, total_length, buffer); 815199540Sjhb break; 816199540Sjhb case MEP_OPERAND_HI : 81793746Sjulian break; 81893746Sjulian case MEP_OPERAND_LO : 81993746Sjulian break; 82093746Sjulian case MEP_OPERAND_LP : 821148946Sjhb break; 82293746Sjulian case MEP_OPERAND_MB0 : 82393746Sjulian break; 82493746Sjulian case MEP_OPERAND_MB1 : 82593746Sjulian break; 82693746Sjulian case MEP_OPERAND_ME0 : 82793746Sjulian break; 82893746Sjulian case MEP_OPERAND_ME1 : 82993746Sjulian break; 830127135Snjl case MEP_OPERAND_NPC : 83193746Sjulian break; 83293746Sjulian case MEP_OPERAND_OPT : 833148945Sjhb break; 83493746Sjulian case MEP_OPERAND_PCABS24A2 : 835149151Sjhb { 83693746Sjulian{ 83793746Sjulian FLD (f_24u5a2n_lo) = ((unsigned int) (((FLD (f_24u5a2n)) & (255))) >> (1)); 83893746Sjulian FLD (f_24u5a2n_hi) = ((unsigned int) (FLD (f_24u5a2n)) >> (8)); 83993746Sjulian} 84093746Sjulian errmsg = insert_normal (cd, fields->f_24u5a2n_hi, 0, 0, 16, 16, 32, total_length, buffer); 841127135Snjl if (errmsg) 842127135Snjl break; 84393746Sjulian errmsg = insert_normal (cd, fields->f_24u5a2n_lo, 0, 0, 5, 7, 32, total_length, buffer); 84493746Sjulian if (errmsg) 845148945Sjhb break; 84693746Sjulian } 847149151Sjhb break; 84893746Sjulian case MEP_OPERAND_PCREL12A2 : 84993746Sjulian { 85093746Sjulian long value = fields->f_12s4a2; 85193746Sjulian value = ((int) (((value) - (pc))) >> (1)); 85293746Sjulian errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, buffer); 853149151Sjhb } 85493746Sjulian break; 855149151Sjhb case MEP_OPERAND_PCREL17A2 : 85693746Sjulian { 85793746Sjulian long value = fields->f_17s16a2; 85893746Sjulian value = ((int) (((value) - (pc))) >> (1)); 85993746Sjulian errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer); 86093746Sjulian } 86193746Sjulian break; 86293746Sjulian case MEP_OPERAND_PCREL24A2 : 86393746Sjulian { 86493746Sjulian{ 86593746Sjulian FLD (f_24s5a2n) = ((FLD (f_24s5a2n)) - (pc)); 866148945Sjhb FLD (f_24s5a2n_lo) = ((unsigned int) (((FLD (f_24s5a2n)) & (254))) >> (1)); 86793746Sjulian FLD (f_24s5a2n_hi) = ((int) (FLD (f_24s5a2n)) >> (8)); 868149151Sjhb} 86993746Sjulian 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); 87093746Sjulian if (errmsg) 871106588Sjhb break; 87293746Sjulian errmsg = insert_normal (cd, fields->f_24s5a2n_lo, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, buffer); 87393746Sjulian if (errmsg) 87493746Sjulian break; 87593746Sjulian } 87693746Sjulian break; 87793746Sjulian case MEP_OPERAND_PCREL8A2 : 87893746Sjulian { 87993746Sjulian long value = fields->f_8s8a2; 88093746Sjulian value = ((int) (((value) - (pc))) >> (1)); 88193746Sjulian errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, buffer); 88293746Sjulian } 883147256Sbrooks break; 884147256Sbrooks case MEP_OPERAND_PSW : 885147256Sbrooks break; 886147256Sbrooks case MEP_OPERAND_R0 : 887149151Sjhb break; 888147256Sbrooks case MEP_OPERAND_R1 : 88993746Sjulian break; 890121816Sbrooks case MEP_OPERAND_RL : 89193746Sjulian errmsg = insert_normal (cd, fields->f_rl, 0, 0, 12, 4, 32, total_length, buffer); 89293746Sjulian break; 89393746Sjulian case MEP_OPERAND_RM : 89493746Sjulian errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 89593746Sjulian break; 896207554Ssobomax case MEP_OPERAND_RMA : 897207554Ssobomax errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer); 898159291Sbrueffer break; 89993746Sjulian case MEP_OPERAND_RN : 90093746Sjulian errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 90193746Sjulian break; 90293746Sjulian case MEP_OPERAND_RN3 : 90393746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 904148945Sjhb break; 905149151Sjhb case MEP_OPERAND_RN3C : 90693746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 90793746Sjulian break; 908148945Sjhb case MEP_OPERAND_RN3L : 90993746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 91093746Sjulian break; 91193746Sjulian case MEP_OPERAND_RN3S : 91293746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 91393746Sjulian break; 91493746Sjulian case MEP_OPERAND_RN3UC : 91593746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 91693746Sjulian break; 91793746Sjulian case MEP_OPERAND_RN3UL : 91893746Sjulian errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 91993746Sjulian break; 920148945Sjhb case MEP_OPERAND_RN3US : 921148945Sjhb errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer); 92293746Sjulian break; 92393746Sjulian case MEP_OPERAND_RNC : 92493746Sjulian errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 92593746Sjulian break; 92693746Sjulian case MEP_OPERAND_RNL : 92793746Sjulian errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 92893746Sjulian break; 92993746Sjulian case MEP_OPERAND_RNS : 93093746Sjulian errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 93193746Sjulian break; 93293746Sjulian case MEP_OPERAND_RNUC : 93393746Sjulian errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 93493746Sjulian break; 93593746Sjulian case MEP_OPERAND_RNUL : 936148945Sjhb errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 937148945Sjhb break; 93893746Sjulian case MEP_OPERAND_RNUS : 939149151Sjhb errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer); 940148945Sjhb break; 94193746Sjulian case MEP_OPERAND_SAR : 942149151Sjhb break; 94393746Sjulian case MEP_OPERAND_SDISP16 : 944149151Sjhb errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer); 94593746Sjulian break; 94693746Sjulian case MEP_OPERAND_SIMM16 : 94793746Sjulian errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer); 94893746Sjulian break; 949149151Sjhb case MEP_OPERAND_SIMM6 : 95093746Sjulian errmsg = insert_normal (cd, fields->f_6s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, buffer); 95193746Sjulian break; 95293746Sjulian case MEP_OPERAND_SIMM8 : 95393746Sjulian errmsg = insert_normal (cd, fields->f_8s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer); 954149151Sjhb break; 95593746Sjulian case MEP_OPERAND_SP : 95693746Sjulian break; 957106937Ssam case MEP_OPERAND_SPR : 958149151Sjhb break; 959149151Sjhb case MEP_OPERAND_TP : 960166901Spiso break; 961149151Sjhb case MEP_OPERAND_TPR : 962149151Sjhb break; 963149151Sjhb case MEP_OPERAND_UDISP2 : 964149151Sjhb errmsg = insert_normal (cd, fields->f_2u6, 0, 0, 6, 2, 32, total_length, buffer); 965149151Sjhb break; 96693746Sjulian case MEP_OPERAND_UDISP7 : 96793746Sjulian errmsg = insert_normal (cd, fields->f_7u9, 0, 0, 9, 7, 32, total_length, buffer); 96893746Sjulian break; 969149151Sjhb case MEP_OPERAND_UDISP7A2 : 970149151Sjhb { 971149151Sjhb long value = fields->f_7u9a2; 972149151Sjhb value = ((unsigned int) (value) >> (1)); 973149151Sjhb errmsg = insert_normal (cd, value, 0, 0, 9, 6, 32, total_length, buffer); 974149151Sjhb } 975149151Sjhb break; 976149151Sjhb case MEP_OPERAND_UDISP7A4 : 977149151Sjhb { 978149151Sjhb long value = fields->f_7u9a4; 979149151Sjhb value = ((unsigned int) (value) >> (2)); 98093746Sjulian errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer); 98193746Sjulian } 98293746Sjulian break; 98393746Sjulian case MEP_OPERAND_UIMM16 : 98493746Sjulian errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer); 98593746Sjulian break; 98693746Sjulian case MEP_OPERAND_UIMM2 : 98793746Sjulian errmsg = insert_normal (cd, fields->f_2u10, 0, 0, 10, 2, 32, total_length, buffer); 98893746Sjulian break; 98993746Sjulian case MEP_OPERAND_UIMM24 : 99093746Sjulian { 991199540Sjhb{ 992199540Sjhb FLD (f_24u8n_hi) = ((unsigned int) (FLD (f_24u8n)) >> (8)); 99393746Sjulian FLD (f_24u8n_lo) = ((FLD (f_24u8n)) & (255)); 994149151Sjhb} 995149151Sjhb errmsg = insert_normal (cd, fields->f_24u8n_hi, 0, 0, 16, 16, 32, total_length, buffer); 996149151Sjhb if (errmsg) 997199540Sjhb break; 998199540Sjhb errmsg = insert_normal (cd, fields->f_24u8n_lo, 0, 0, 8, 8, 32, total_length, buffer); 999149151Sjhb if (errmsg) 1000147256Sbrooks break; 1001149151Sjhb } 100293746Sjulian break; 100393746Sjulian case MEP_OPERAND_UIMM3 : 100493746Sjulian errmsg = insert_normal (cd, fields->f_3u5, 0, 0, 5, 3, 32, total_length, buffer); 100593746Sjulian break; 100693746Sjulian case MEP_OPERAND_UIMM4 : 100793746Sjulian errmsg = insert_normal (cd, fields->f_4u8, 0, 0, 8, 4, 32, total_length, buffer); 100893746Sjulian break; 100993746Sjulian case MEP_OPERAND_UIMM5 : 101093746Sjulian errmsg = insert_normal (cd, fields->f_5u8, 0, 0, 8, 5, 32, total_length, buffer); 101193746Sjulian break; 101293746Sjulian case MEP_OPERAND_UIMM7A4 : 101393746Sjulian { 101493746Sjulian long value = fields->f_7u9a4; 101593746Sjulian value = ((unsigned int) (value) >> (2)); 101693746Sjulian errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer); 101793746Sjulian } 101893746Sjulian break; 101993746Sjulian case MEP_OPERAND_ZERO : 1020149151Sjhb break; 102193746Sjulian 102293746Sjulian default : 102393746Sjulian /* xgettext:c-format */ 102493746Sjulian fprintf (stderr, _("Unrecognized field %d while building insn.\n"), 102593746Sjulian opindex); 102693746Sjulian abort (); 102793746Sjulian } 102893746Sjulian 102993746Sjulian return errmsg; 103093746Sjulian} 103193746Sjulian 103293746Sjulianint mep_cgen_extract_operand 103393746Sjulian (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma); 103493746Sjulian 103593746Sjulian/* Main entry point for operand extraction. 103693746Sjulian The result is <= 0 for error, >0 for success. 103793746Sjulian ??? Actual values aren't well defined right now. 103893746Sjulian 103993746Sjulian This function is basically just a big switch statement. Earlier versions 104093746Sjulian used tables to look up the function to use, but 104193746Sjulian - if the table contains both assembler and disassembler functions then 104293746Sjulian the disassembler contains much of the assembler and vice-versa, 104393746Sjulian - there's a lot of inlining possibilities as things grow, 104493746Sjulian - using a switch statement avoids the function call overhead. 104593746Sjulian 104693746Sjulian This function could be moved into `print_insn_normal', but keeping it 104793746Sjulian separate makes clear the interface between `print_insn_normal' and each of 1048149151Sjhb the handlers. */ 104993746Sjulian 105093746Sjulianint 105193746Sjulianmep_cgen_extract_operand (CGEN_CPU_DESC cd, 105293746Sjulian int opindex, 105393746Sjulian CGEN_EXTRACT_INFO *ex_info, 105497641Sjulian CGEN_INSN_INT insn_value, 105597641Sjulian CGEN_FIELDS * fields, 105693746Sjulian bfd_vma pc) 105797641Sjulian{ 105893746Sjulian /* Assume success (for those operands that are nops). */ 105993746Sjulian int length = 1; 106093746Sjulian unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 106193746Sjulian 106293746Sjulian switch (opindex) 106393746Sjulian { 106493746Sjulian case MEP_OPERAND_ADDR24A4 : 106593746Sjulian { 106693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8a4n_hi); 106793746Sjulian if (length <= 0) break; 106893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 6, 32, total_length, pc, & fields->f_24u8a4n_lo); 106993746Sjulian if (length <= 0) break; 107093746Sjulian FLD (f_24u8a4n) = ((((FLD (f_24u8a4n_hi)) << (8))) | (((FLD (f_24u8a4n_lo)) << (2)))); 107193746Sjulian } 107293746Sjulian break; 107393746Sjulian case MEP_OPERAND_CALLNUM : 107493746Sjulian { 107593746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_5); 107693746Sjulian if (length <= 0) break; 107793746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_6); 107893746Sjulian if (length <= 0) break; 107993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_7); 1080149151Sjhb if (length <= 0) break; 1081243857Sglebius length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_11); 108293746Sjulian if (length <= 0) break; 1083162321Sglebius FLD (f_callnum) = ((((FLD (f_5)) << (3))) | (((((FLD (f_6)) << (2))) | (((((FLD (f_7)) << (1))) | (FLD (f_11))))))); 1084148945Sjhb } 108593746Sjulian break; 108693746Sjulian case MEP_OPERAND_CCCC : 1087243857Sglebius length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 108893746Sjulian break; 1089162321Sglebius case MEP_OPERAND_CCRN : 1090148945Sjhb { 109193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi); 109293746Sjulian if (length <= 0) break; 109393746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo); 109493746Sjulian if (length <= 0) break; 109593746Sjulian FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo))); 109693746Sjulian } 109793746Sjulian break; 109893746Sjulian case MEP_OPERAND_CDISP8 : 109993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, pc, & fields->f_8s24); 110093746Sjulian break; 110193746Sjulian case MEP_OPERAND_CDISP8A2 : 110293746Sjulian { 110393746Sjulian long value; 110493746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, pc, & value); 110593746Sjulian value = ((value) << (1)); 110693746Sjulian fields->f_8s24a2 = value; 110793746Sjulian } 110893746Sjulian break; 110993746Sjulian case MEP_OPERAND_CDISP8A4 : 111093746Sjulian { 111193746Sjulian long value; 111293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, pc, & value); 111393746Sjulian value = ((value) << (2)); 111493746Sjulian fields->f_8s24a4 = value; 1115149151Sjhb } 1116147256Sbrooks break; 111793746Sjulian case MEP_OPERAND_CDISP8A8 : 111893746Sjulian { 111993746Sjulian long value; 112093746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, pc, & value); 112193746Sjulian value = ((value) << (3)); 112293746Sjulian fields->f_8s24a8 = value; 112393746Sjulian } 112493746Sjulian break; 112593746Sjulian case MEP_OPERAND_CIMM4 : 112693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 112793746Sjulian break; 112893746Sjulian case MEP_OPERAND_CIMM5 : 112993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 5, 32, total_length, pc, & fields->f_5u24); 113093746Sjulian break; 113193746Sjulian case MEP_OPERAND_CODE16 : 113293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16); 113393746Sjulian break; 113493746Sjulian case MEP_OPERAND_CODE24 : 113593746Sjulian { 113693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_24u4n_hi); 113793746Sjulian if (length <= 0) break; 113893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u4n_lo); 113993746Sjulian if (length <= 0) break; 114093746Sjulian FLD (f_24u4n) = ((((FLD (f_24u4n_hi)) << (16))) | (FLD (f_24u4n_lo))); 114193746Sjulian } 114293746Sjulian break; 114393746Sjulian case MEP_OPERAND_CP_FLAG : 114493746Sjulian break; 114593746Sjulian case MEP_OPERAND_CRN : 114693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn); 114793746Sjulian break; 114893746Sjulian case MEP_OPERAND_CRN64 : 114993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn); 115093746Sjulian break; 115193746Sjulian case MEP_OPERAND_CRNX : 115293746Sjulian { 115393746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi); 115493746Sjulian if (length <= 0) break; 115593746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo); 115693746Sjulian if (length <= 0) break; 115793746Sjulian FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo))); 115893746Sjulian } 115993746Sjulian break; 116093746Sjulian case MEP_OPERAND_CRNX64 : 116193746Sjulian { 116293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi); 116393746Sjulian if (length <= 0) break; 116493746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo); 1165165632Sjhb if (length <= 0) break; 1166165640Sjhb FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo))); 116793746Sjulian } 1168152315Sru break; 116993746Sjulian case MEP_OPERAND_CSRN : 117093746Sjulian { 117193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi); 117293746Sjulian if (length <= 0) break; 117393746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo); 117493746Sjulian if (length <= 0) break; 117593746Sjulian FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo))); 1176122689Ssam } 1177106937Ssam break; 1178122689Ssam case MEP_OPERAND_CSRN_IDX : 117993746Sjulian { 118093746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi); 118193746Sjulian if (length <= 0) break; 118293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo); 118393746Sjulian if (length <= 0) break; 118493746Sjulian FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo))); 118593746Sjulian } 118693746Sjulian break; 118793746Sjulian case MEP_OPERAND_DBG : 118893746Sjulian break; 118993746Sjulian case MEP_OPERAND_DEPC : 119093746Sjulian break; 119193746Sjulian case MEP_OPERAND_EPC : 119293746Sjulian break; 119393746Sjulian case MEP_OPERAND_EXC : 1194149151Sjhb break; 1195147256Sbrooks case MEP_OPERAND_FMAX_CCRN : 119693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 1197199540Sjhb break; 119895939Sjulian case MEP_OPERAND_FMAX_FRD : 119993746Sjulian { 120095939Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1); 120193746Sjulian if (length <= 0) break; 120293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 120393746Sjulian if (length <= 0) break; 120493746Sjulian FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4))); 120593746Sjulian } 120693746Sjulian break; 120793746Sjulian case MEP_OPERAND_FMAX_FRD_INT : 120893746Sjulian { 120993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1); 121093746Sjulian if (length <= 0) break; 121193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4); 121293746Sjulian if (length <= 0) break; 121393746Sjulian FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4))); 121493746Sjulian } 121593746Sjulian break; 121693746Sjulian case MEP_OPERAND_FMAX_FRM : 121793746Sjulian { 121893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 1, 32, total_length, pc, & fields->f_fmax_30_1); 121993746Sjulian if (length <= 0) break; 122093746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 4, 32, total_length, pc, & fields->f_fmax_24_4); 122193746Sjulian if (length <= 0) break; 122293746Sjulian FLD (f_fmax_frm) = ((((FLD (f_fmax_30_1)) << (4))) | (FLD (f_fmax_24_4))); 122393746Sjulian } 122493746Sjulian break; 122593746Sjulian case MEP_OPERAND_FMAX_FRN : 122693746Sjulian { 122793746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1); 122893746Sjulian if (length <= 0) break; 122993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4); 123093746Sjulian if (length <= 0) break; 123193746Sjulian FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4))); 123293746Sjulian } 123393746Sjulian break; 123493746Sjulian case MEP_OPERAND_FMAX_FRN_INT : 123593746Sjulian { 123693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1); 123793746Sjulian if (length <= 0) break; 123893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4); 123993746Sjulian if (length <= 0) break; 124093746Sjulian FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4))); 124193746Sjulian } 124293746Sjulian break; 124393746Sjulian case MEP_OPERAND_FMAX_RM : 124493746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_fmax_rm); 124593746Sjulian break; 124693746Sjulian case MEP_OPERAND_HI : 1247149151Sjhb break; 1248147256Sbrooks case MEP_OPERAND_LO : 1249199540Sjhb break; 125093746Sjulian case MEP_OPERAND_LP : 1251148887Srwatson break; 125293746Sjulian case MEP_OPERAND_MB0 : 125393746Sjulian break; 125493746Sjulian case MEP_OPERAND_MB1 : 125593746Sjulian break; 125693746Sjulian case MEP_OPERAND_ME0 : 125793746Sjulian break; 1258199540Sjhb case MEP_OPERAND_ME1 : 125993746Sjulian break; 126093746Sjulian case MEP_OPERAND_NPC : 126193746Sjulian break; 126293746Sjulian case MEP_OPERAND_OPT : 126393746Sjulian break; 126493746Sjulian case MEP_OPERAND_PCABS24A2 : 126593746Sjulian { 126693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u5a2n_hi); 126793746Sjulian if (length <= 0) break; 126893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 7, 32, total_length, pc, & fields->f_24u5a2n_lo); 126993746Sjulian if (length <= 0) break; 127093746Sjulian FLD (f_24u5a2n) = ((((FLD (f_24u5a2n_hi)) << (8))) | (((FLD (f_24u5a2n_lo)) << (1)))); 127193746Sjulian } 127293746Sjulian break; 127393746Sjulian case MEP_OPERAND_PCREL12A2 : 1274147256Sbrooks { 127593746Sjulian long value; 127693746Sjulian 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); 127793746Sjulian value = ((((value) << (1))) + (pc)); 127893746Sjulian fields->f_12s4a2 = value; 127993746Sjulian } 128093746Sjulian break; 128193746Sjulian case MEP_OPERAND_PCREL17A2 : 128293746Sjulian { 128393746Sjulian long value; 128493746Sjulian 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); 128593746Sjulian value = ((((value) << (1))) + (pc)); 128693746Sjulian fields->f_17s16a2 = value; 128793746Sjulian } 128893746Sjulian break; 128993746Sjulian case MEP_OPERAND_PCREL24A2 : 129093746Sjulian { 129193746Sjulian 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); 129293746Sjulian if (length <= 0) break; 129393746Sjulian 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); 129493746Sjulian if (length <= 0) break; 129593746Sjulian FLD (f_24s5a2n) = ((((((FLD (f_24s5a2n_hi)) << (8))) | (((FLD (f_24s5a2n_lo)) << (1))))) + (pc)); 129693746Sjulian } 129793746Sjulian break; 129893746Sjulian case MEP_OPERAND_PCREL8A2 : 1299149151Sjhb { 130093746Sjulian long value; 130193746Sjulian 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); 130293746Sjulian value = ((((value) << (1))) + (pc)); 130393746Sjulian fields->f_8s8a2 = value; 130493746Sjulian } 130593746Sjulian break; 130693746Sjulian case MEP_OPERAND_PSW : 130793746Sjulian break; 130894863Sjulian case MEP_OPERAND_R0 : 130994863Sjulian break; 131094863Sjulian case MEP_OPERAND_R1 : 131194863Sjulian break; 1312149151Sjhb case MEP_OPERAND_RL : 131394863Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_rl); 131494863Sjulian break; 131594863Sjulian case MEP_OPERAND_RM : 131693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 131793746Sjulian break; 131893746Sjulian case MEP_OPERAND_RMA : 131993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm); 1320159291Sbrueffer break; 1321149151Sjhb case MEP_OPERAND_RN : 132293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 132393746Sjulian break; 132493746Sjulian case MEP_OPERAND_RN3 : 132593746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 132693746Sjulian break; 132793746Sjulian case MEP_OPERAND_RN3C : 132893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 132993746Sjulian break; 133093746Sjulian case MEP_OPERAND_RN3L : 133193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 133293746Sjulian break; 133393746Sjulian case MEP_OPERAND_RN3S : 133493746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 133593746Sjulian break; 133693746Sjulian case MEP_OPERAND_RN3UC : 1337149151Sjhb length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 133893746Sjulian break; 133993746Sjulian case MEP_OPERAND_RN3UL : 134093746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 134193746Sjulian break; 134293746Sjulian case MEP_OPERAND_RN3US : 134393746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3); 134493746Sjulian break; 134593746Sjulian case MEP_OPERAND_RNC : 134693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 134793746Sjulian break; 1348243857Sglebius case MEP_OPERAND_RNL : 134993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 1350162321Sglebius break; 135193746Sjulian case MEP_OPERAND_RNS : 135293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 135393746Sjulian break; 1354243857Sglebius case MEP_OPERAND_RNUC : 135593746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 135693746Sjulian break; 1357162321Sglebius case MEP_OPERAND_RNUL : 135893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 135993746Sjulian break; 136093746Sjulian case MEP_OPERAND_RNUS : 136193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn); 136293746Sjulian break; 136393746Sjulian case MEP_OPERAND_SAR : 136493746Sjulian break; 136593746Sjulian case MEP_OPERAND_SDISP16 : 136693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16); 136793746Sjulian break; 136893746Sjulian case MEP_OPERAND_SIMM16 : 136993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16); 137093746Sjulian break; 137193746Sjulian case MEP_OPERAND_SIMM6 : 137294904Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, pc, & fields->f_6s8); 137393746Sjulian break; 137493746Sjulian case MEP_OPERAND_SIMM8 : 137593746Sjulian length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_8s8); 137693746Sjulian break; 137793746Sjulian case MEP_OPERAND_SP : 137893746Sjulian break; 137993746Sjulian case MEP_OPERAND_SPR : 138093746Sjulian break; 138193746Sjulian case MEP_OPERAND_TP : 138293746Sjulian break; 138393746Sjulian case MEP_OPERAND_TPR : 138493746Sjulian break; 138593746Sjulian case MEP_OPERAND_UDISP2 : 138693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_2u6); 138793746Sjulian break; 138893746Sjulian case MEP_OPERAND_UDISP7 : 138993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_7u9); 139093746Sjulian break; 1391149151Sjhb case MEP_OPERAND_UDISP7A2 : 1392149151Sjhb { 1393149151Sjhb long value; 1394149151Sjhb length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 6, 32, total_length, pc, & value); 1395149151Sjhb value = ((value) << (1)); 1396149151Sjhb fields->f_7u9a2 = value; 1397149151Sjhb } 1398149151Sjhb break; 1399149151Sjhb case MEP_OPERAND_UDISP7A4 : 1400149151Sjhb { 1401149151Sjhb long value; 140293746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value); 140393746Sjulian value = ((value) << (2)); 140493746Sjulian fields->f_7u9a4 = value; 140593746Sjulian } 1406149151Sjhb break; 140793746Sjulian case MEP_OPERAND_UIMM16 : 140893746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16); 140993746Sjulian break; 141093746Sjulian case MEP_OPERAND_UIMM2 : 141193746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 2, 32, total_length, pc, & fields->f_2u10); 141293746Sjulian break; 141393746Sjulian case MEP_OPERAND_UIMM24 : 141493746Sjulian { 1415148887Srwatson length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8n_hi); 141693746Sjulian if (length <= 0) break; 141793746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_24u8n_lo); 141893746Sjulian if (length <= 0) break; 141993746Sjulian FLD (f_24u8n) = ((((FLD (f_24u8n_hi)) << (8))) | (FLD (f_24u8n_lo))); 1420159291Sbrueffer } 142193746Sjulian break; 142293746Sjulian case MEP_OPERAND_UIMM3 : 142393746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_3u5); 142493746Sjulian break; 142593746Sjulian case MEP_OPERAND_UIMM4 : 142693746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_4u8); 142793746Sjulian break; 142893746Sjulian case MEP_OPERAND_UIMM5 : 142993746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_5u8); 143093746Sjulian break; 143193746Sjulian case MEP_OPERAND_UIMM7A4 : 143293746Sjulian { 143393746Sjulian long value; 143493746Sjulian length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value); 143593746Sjulian value = ((value) << (2)); 143693746Sjulian fields->f_7u9a4 = value; 143793746Sjulian } 1438106937Ssam break; 143993746Sjulian case MEP_OPERAND_ZERO : 144093746Sjulian break; 144193746Sjulian 144293746Sjulian default : 144393746Sjulian /* xgettext:c-format */ 144493746Sjulian fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"), 144593746Sjulian opindex); 144693746Sjulian abort (); 144793746Sjulian } 144893746Sjulian 144993746Sjulian return length; 1450172568Skevlo} 145193746Sjulian 145293746Sjuliancgen_insert_fn * const mep_cgen_insert_handlers[] = 145393746Sjulian{ 145493746Sjulian insert_insn_normal, 145593746Sjulian}; 145693746Sjulian 145793746Sjuliancgen_extract_fn * const mep_cgen_extract_handlers[] = 145893746Sjulian{ 145993746Sjulian extract_insn_normal, 146093746Sjulian}; 146193746Sjulian 146293746Sjulianint mep_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 146393746Sjulianbfd_vma mep_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 1464199540Sjhb 146593746Sjulian/* Getting values from cgen_fields is handled by a collection of functions. 146693746Sjulian They are distinguished by the type of the VALUE argument they return. 146793746Sjulian TODO: floating point, inlining support, remove cases where result type 146893746Sjulian not appropriate. */ 146993746Sjulian 147093746Sjulianint 147193746Sjulianmep_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1472149151Sjhb int opindex, 1473149151Sjhb const CGEN_FIELDS * fields) 1474149151Sjhb{ 1475149151Sjhb int value; 1476149151Sjhb 1477149151Sjhb switch (opindex) 1478149151Sjhb { 1479149151Sjhb case MEP_OPERAND_ADDR24A4 : 1480149151Sjhb value = fields->f_24u8a4n; 1481147256Sbrooks break; 148293746Sjulian case MEP_OPERAND_CALLNUM : 148393746Sjulian value = fields->f_callnum; 1484149151Sjhb break; 148593746Sjulian case MEP_OPERAND_CCCC : 148693746Sjulian value = fields->f_rm; 148793746Sjulian break; 148893746Sjulian case MEP_OPERAND_CCRN : 148993746Sjulian value = fields->f_ccrn; 149093746Sjulian break; 149193746Sjulian case MEP_OPERAND_CDISP8 : 149293746Sjulian value = fields->f_8s24; 149393746Sjulian break; 149493746Sjulian case MEP_OPERAND_CDISP8A2 : 149593746Sjulian value = fields->f_8s24a2; 149693746Sjulian break; 149793746Sjulian case MEP_OPERAND_CDISP8A4 : 149893746Sjulian value = fields->f_8s24a4; 149994863Sjulian break; 150094863Sjulian case MEP_OPERAND_CDISP8A8 : 150194863Sjulian value = fields->f_8s24a8; 150294863Sjulian break; 150393746Sjulian case MEP_OPERAND_CIMM4 : 150493746Sjulian value = fields->f_rn; 150593746Sjulian break; 150693746Sjulian case MEP_OPERAND_CIMM5 : 150793746Sjulian value = fields->f_5u24; 150893746Sjulian break; 150993746Sjulian case MEP_OPERAND_CODE16 : 151093746Sjulian value = fields->f_16u16; 151193746Sjulian break; 151293746Sjulian case MEP_OPERAND_CODE24 : 151393746Sjulian value = fields->f_24u4n; 151493746Sjulian break; 1515162321Sglebius case MEP_OPERAND_CP_FLAG : 151693746Sjulian value = 0; 151793746Sjulian break; 151893746Sjulian case MEP_OPERAND_CRN : 151993746Sjulian value = fields->f_crn; 152093746Sjulian break; 152193746Sjulian case MEP_OPERAND_CRN64 : 152293746Sjulian value = fields->f_crn; 152393746Sjulian break; 152493746Sjulian case MEP_OPERAND_CRNX : 152593746Sjulian value = fields->f_crnx; 152693746Sjulian break; 152793746Sjulian case MEP_OPERAND_CRNX64 : 152893746Sjulian value = fields->f_crnx; 152993746Sjulian break; 153093746Sjulian case MEP_OPERAND_CSRN : 153193746Sjulian value = fields->f_csrn; 153293746Sjulian break; 153393746Sjulian case MEP_OPERAND_CSRN_IDX : 153493746Sjulian value = fields->f_csrn; 153593746Sjulian break; 153693746Sjulian case MEP_OPERAND_DBG : 153793746Sjulian value = 0; 153893746Sjulian break; 153993746Sjulian case MEP_OPERAND_DEPC : 154093746Sjulian value = 0; 154193746Sjulian break; 154293746Sjulian case MEP_OPERAND_EPC : 154393746Sjulian value = 0; 154493746Sjulian break; 154593746Sjulian case MEP_OPERAND_EXC : 154693746Sjulian value = 0; 154793746Sjulian break; 154893746Sjulian case MEP_OPERAND_FMAX_CCRN : 154993746Sjulian value = fields->f_fmax_4_4; 155093746Sjulian break; 155193746Sjulian case MEP_OPERAND_FMAX_FRD : 155293746Sjulian value = fields->f_fmax_frd; 155393746Sjulian break; 155493746Sjulian case MEP_OPERAND_FMAX_FRD_INT : 155593746Sjulian value = fields->f_fmax_frd; 155693746Sjulian break; 155793746Sjulian case MEP_OPERAND_FMAX_FRM : 155893746Sjulian value = fields->f_fmax_frm; 155993746Sjulian break; 156093746Sjulian case MEP_OPERAND_FMAX_FRN : 156193746Sjulian value = fields->f_fmax_frn; 1562148887Srwatson break; 1563148887Srwatson case MEP_OPERAND_FMAX_FRN_INT : 1564199540Sjhb value = fields->f_fmax_frn; 1565199540Sjhb break; 156693746Sjulian case MEP_OPERAND_FMAX_RM : 156793746Sjulian value = fields->f_fmax_rm; 156893746Sjulian break; 156993746Sjulian case MEP_OPERAND_HI : 157093746Sjulian value = 0; 157193746Sjulian break; 157293746Sjulian case MEP_OPERAND_LO : 157393746Sjulian value = 0; 157493746Sjulian break; 157593746Sjulian case MEP_OPERAND_LP : 157693746Sjulian value = 0; 157793746Sjulian break; 157893746Sjulian case MEP_OPERAND_MB0 : 157993746Sjulian value = 0; 158093746Sjulian break; 158193746Sjulian case MEP_OPERAND_MB1 : 158293746Sjulian value = 0; 158393746Sjulian break; 158493746Sjulian case MEP_OPERAND_ME0 : 158593746Sjulian value = 0; 158693746Sjulian break; 158793746Sjulian case MEP_OPERAND_ME1 : 158893746Sjulian value = 0; 158993746Sjulian break; 159093746Sjulian case MEP_OPERAND_NPC : 159193746Sjulian value = 0; 159293746Sjulian break; 159393746Sjulian case MEP_OPERAND_OPT : 159493746Sjulian value = 0; 159593746Sjulian break; 159693746Sjulian case MEP_OPERAND_PCABS24A2 : 159793746Sjulian value = fields->f_24u5a2n; 159893746Sjulian break; 159993746Sjulian case MEP_OPERAND_PCREL12A2 : 160093746Sjulian value = fields->f_12s4a2; 160193746Sjulian break; 160293746Sjulian case MEP_OPERAND_PCREL17A2 : 160393746Sjulian value = fields->f_17s16a2; 160493746Sjulian break; 160593746Sjulian case MEP_OPERAND_PCREL24A2 : 160693746Sjulian value = fields->f_24s5a2n; 160793746Sjulian break; 160894863Sjulian case MEP_OPERAND_PCREL8A2 : 160994863Sjulian value = fields->f_8s8a2; 161094863Sjulian break; 161194863Sjulian case MEP_OPERAND_PSW : 161293746Sjulian value = 0; 161393746Sjulian break; 161493746Sjulian case MEP_OPERAND_R0 : 161593746Sjulian value = 0; 161693746Sjulian break; 161793746Sjulian case MEP_OPERAND_R1 : 161893746Sjulian value = 0; 161993746Sjulian break; 162093746Sjulian case MEP_OPERAND_RL : 162193746Sjulian value = fields->f_rl; 162293746Sjulian break; 162393746Sjulian case MEP_OPERAND_RM : 162493746Sjulian value = fields->f_rm; 162593746Sjulian break; 162693746Sjulian case MEP_OPERAND_RMA : 162794863Sjulian value = fields->f_rm; 162893746Sjulian break; 162993746Sjulian case MEP_OPERAND_RN : 163093746Sjulian value = fields->f_rn; 163193746Sjulian break; 163293746Sjulian case MEP_OPERAND_RN3 : 163395673Sphk value = fields->f_rn3; 163493746Sjulian break; 163593746Sjulian case MEP_OPERAND_RN3C : 163693746Sjulian value = fields->f_rn3; 163795673Sphk break; 163893746Sjulian case MEP_OPERAND_RN3L : 163993746Sjulian value = fields->f_rn3; 164093746Sjulian break; 164193746Sjulian case MEP_OPERAND_RN3S : 164293746Sjulian value = fields->f_rn3; 164393746Sjulian break; 164493746Sjulian case MEP_OPERAND_RN3UC : 164593746Sjulian value = fields->f_rn3; 164693746Sjulian break; 164793746Sjulian case MEP_OPERAND_RN3UL : 164893746Sjulian value = fields->f_rn3; 164993746Sjulian break; 165093746Sjulian case MEP_OPERAND_RN3US : 165193746Sjulian value = fields->f_rn3; 165293746Sjulian break; 165393746Sjulian case MEP_OPERAND_RNC : 165493746Sjulian value = fields->f_rn; 165593746Sjulian break; 165693746Sjulian case MEP_OPERAND_RNL : 165793746Sjulian value = fields->f_rn; 165893746Sjulian break; 165993746Sjulian case MEP_OPERAND_RNS : 1660149151Sjhb value = fields->f_rn; 166193746Sjulian break; 166293746Sjulian case MEP_OPERAND_RNUC : 166393746Sjulian value = fields->f_rn; 1664149151Sjhb break; 166593746Sjulian case MEP_OPERAND_RNUL : 1666149151Sjhb value = fields->f_rn; 1667148887Srwatson break; 166893746Sjulian case MEP_OPERAND_RNUS : 1669149151Sjhb value = fields->f_rn; 167093746Sjulian break; 167193746Sjulian case MEP_OPERAND_SAR : 167293746Sjulian value = 0; 167393746Sjulian break; 1674149151Sjhb case MEP_OPERAND_SDISP16 : 167593746Sjulian value = fields->f_16s16; 1676149151Sjhb break; 167793746Sjulian case MEP_OPERAND_SIMM16 : 167893746Sjulian value = fields->f_16s16; 167993746Sjulian break; 168093746Sjulian case MEP_OPERAND_SIMM6 : 168193746Sjulian value = fields->f_6s8; 168293746Sjulian break; 168393746Sjulian case MEP_OPERAND_SIMM8 : 1684106937Ssam value = fields->f_8s8; 168593746Sjulian break; 168693746Sjulian case MEP_OPERAND_SP : 168793746Sjulian value = 0; 168893746Sjulian break; 168993746Sjulian case MEP_OPERAND_SPR : 169093746Sjulian value = 0; 1691199540Sjhb break; 169293746Sjulian case MEP_OPERAND_TP : 169393746Sjulian value = 0; 1694199540Sjhb break; 169593746Sjulian case MEP_OPERAND_TPR : 1696199540Sjhb value = 0; 1697199540Sjhb break; 1698199540Sjhb case MEP_OPERAND_UDISP2 : 1699199540Sjhb value = fields->f_2u6; 170093746Sjulian break; 1701199540Sjhb case MEP_OPERAND_UDISP7 : 1702199540Sjhb value = fields->f_7u9; 170393746Sjulian break; 1704148945Sjhb case MEP_OPERAND_UDISP7A2 : 170593746Sjulian value = fields->f_7u9a2; 1706148945Sjhb break; 170793746Sjulian case MEP_OPERAND_UDISP7A4 : 170893746Sjulian value = fields->f_7u9a4; 1709149151Sjhb break; 1710159291Sbrueffer case MEP_OPERAND_UIMM16 : 1711149151Sjhb value = fields->f_16u16; 171293746Sjulian break; 171393746Sjulian case MEP_OPERAND_UIMM2 : 171493746Sjulian value = fields->f_2u10; 171593746Sjulian break; 171693746Sjulian case MEP_OPERAND_UIMM24 : 171793746Sjulian value = fields->f_24u8n; 171893746Sjulian break; 171993746Sjulian case MEP_OPERAND_UIMM3 : 172093746Sjulian value = fields->f_3u5; 172193746Sjulian break; 172293746Sjulian case MEP_OPERAND_UIMM4 : 172393746Sjulian value = fields->f_4u8; 1724149151Sjhb break; 1725147256Sbrooks case MEP_OPERAND_UIMM5 : 172693746Sjulian value = fields->f_5u8; 1727199540Sjhb break; 1728199540Sjhb case MEP_OPERAND_UIMM7A4 : 1729199540Sjhb value = fields->f_7u9a4; 173093746Sjulian break; 173193746Sjulian case MEP_OPERAND_ZERO : 173293746Sjulian value = 0; 173393746Sjulian break; 173493746Sjulian 173593746Sjulian default : 173693746Sjulian /* xgettext:c-format */ 173793746Sjulian fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"), 173893746Sjulian opindex); 173993746Sjulian abort (); 174093746Sjulian } 174193746Sjulian 174293746Sjulian return value; 174393746Sjulian} 174493746Sjulian 174593746Sjulianbfd_vma 174693746Sjulianmep_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 174793746Sjulian int opindex, 174893746Sjulian const CGEN_FIELDS * fields) 174993746Sjulian{ 175093746Sjulian bfd_vma value; 175193746Sjulian 175293746Sjulian switch (opindex) 175393746Sjulian { 175493746Sjulian case MEP_OPERAND_ADDR24A4 : 175593746Sjulian value = fields->f_24u8a4n; 175693746Sjulian break; 1757148887Srwatson case MEP_OPERAND_CALLNUM : 175893746Sjulian value = fields->f_callnum; 175993746Sjulian break; 176093746Sjulian case MEP_OPERAND_CCCC : 176193746Sjulian value = fields->f_rm; 176293746Sjulian break; 176393746Sjulian case MEP_OPERAND_CCRN : 176493746Sjulian value = fields->f_ccrn; 1765188172Simp break; 176693746Sjulian case MEP_OPERAND_CDISP8 : 176793746Sjulian value = fields->f_8s24; 176893746Sjulian break; 176993746Sjulian case MEP_OPERAND_CDISP8A2 : 177093746Sjulian value = fields->f_8s24a2; 1771149151Sjhb break; 177293746Sjulian case MEP_OPERAND_CDISP8A4 : 1773149151Sjhb value = fields->f_8s24a4; 1774188172Simp break; 177593746Sjulian case MEP_OPERAND_CDISP8A8 : 1776 value = fields->f_8s24a8; 1777 break; 1778 case MEP_OPERAND_CIMM4 : 1779 value = fields->f_rn; 1780 break; 1781 case MEP_OPERAND_CIMM5 : 1782 value = fields->f_5u24; 1783 break; 1784 case MEP_OPERAND_CODE16 : 1785 value = fields->f_16u16; 1786 break; 1787 case MEP_OPERAND_CODE24 : 1788 value = fields->f_24u4n; 1789 break; 1790 case MEP_OPERAND_CP_FLAG : 1791 value = 0; 1792 break; 1793 case MEP_OPERAND_CRN : 1794 value = fields->f_crn; 1795 break; 1796 case MEP_OPERAND_CRN64 : 1797 value = fields->f_crn; 1798 break; 1799 case MEP_OPERAND_CRNX : 1800 value = fields->f_crnx; 1801 break; 1802 case MEP_OPERAND_CRNX64 : 1803 value = fields->f_crnx; 1804 break; 1805 case MEP_OPERAND_CSRN : 1806 value = fields->f_csrn; 1807 break; 1808 case MEP_OPERAND_CSRN_IDX : 1809 value = fields->f_csrn; 1810 break; 1811 case MEP_OPERAND_DBG : 1812 value = 0; 1813 break; 1814 case MEP_OPERAND_DEPC : 1815 value = 0; 1816 break; 1817 case MEP_OPERAND_EPC : 1818 value = 0; 1819 break; 1820 case MEP_OPERAND_EXC : 1821 value = 0; 1822 break; 1823 case MEP_OPERAND_FMAX_CCRN : 1824 value = fields->f_fmax_4_4; 1825 break; 1826 case MEP_OPERAND_FMAX_FRD : 1827 value = fields->f_fmax_frd; 1828 break; 1829 case MEP_OPERAND_FMAX_FRD_INT : 1830 value = fields->f_fmax_frd; 1831 break; 1832 case MEP_OPERAND_FMAX_FRM : 1833 value = fields->f_fmax_frm; 1834 break; 1835 case MEP_OPERAND_FMAX_FRN : 1836 value = fields->f_fmax_frn; 1837 break; 1838 case MEP_OPERAND_FMAX_FRN_INT : 1839 value = fields->f_fmax_frn; 1840 break; 1841 case MEP_OPERAND_FMAX_RM : 1842 value = fields->f_fmax_rm; 1843 break; 1844 case MEP_OPERAND_HI : 1845 value = 0; 1846 break; 1847 case MEP_OPERAND_LO : 1848 value = 0; 1849 break; 1850 case MEP_OPERAND_LP : 1851 value = 0; 1852 break; 1853 case MEP_OPERAND_MB0 : 1854 value = 0; 1855 break; 1856 case MEP_OPERAND_MB1 : 1857 value = 0; 1858 break; 1859 case MEP_OPERAND_ME0 : 1860 value = 0; 1861 break; 1862 case MEP_OPERAND_ME1 : 1863 value = 0; 1864 break; 1865 case MEP_OPERAND_NPC : 1866 value = 0; 1867 break; 1868 case MEP_OPERAND_OPT : 1869 value = 0; 1870 break; 1871 case MEP_OPERAND_PCABS24A2 : 1872 value = fields->f_24u5a2n; 1873 break; 1874 case MEP_OPERAND_PCREL12A2 : 1875 value = fields->f_12s4a2; 1876 break; 1877 case MEP_OPERAND_PCREL17A2 : 1878 value = fields->f_17s16a2; 1879 break; 1880 case MEP_OPERAND_PCREL24A2 : 1881 value = fields->f_24s5a2n; 1882 break; 1883 case MEP_OPERAND_PCREL8A2 : 1884 value = fields->f_8s8a2; 1885 break; 1886 case MEP_OPERAND_PSW : 1887 value = 0; 1888 break; 1889 case MEP_OPERAND_R0 : 1890 value = 0; 1891 break; 1892 case MEP_OPERAND_R1 : 1893 value = 0; 1894 break; 1895 case MEP_OPERAND_RL : 1896 value = fields->f_rl; 1897 break; 1898 case MEP_OPERAND_RM : 1899 value = fields->f_rm; 1900 break; 1901 case MEP_OPERAND_RMA : 1902 value = fields->f_rm; 1903 break; 1904 case MEP_OPERAND_RN : 1905 value = fields->f_rn; 1906 break; 1907 case MEP_OPERAND_RN3 : 1908 value = fields->f_rn3; 1909 break; 1910 case MEP_OPERAND_RN3C : 1911 value = fields->f_rn3; 1912 break; 1913 case MEP_OPERAND_RN3L : 1914 value = fields->f_rn3; 1915 break; 1916 case MEP_OPERAND_RN3S : 1917 value = fields->f_rn3; 1918 break; 1919 case MEP_OPERAND_RN3UC : 1920 value = fields->f_rn3; 1921 break; 1922 case MEP_OPERAND_RN3UL : 1923 value = fields->f_rn3; 1924 break; 1925 case MEP_OPERAND_RN3US : 1926 value = fields->f_rn3; 1927 break; 1928 case MEP_OPERAND_RNC : 1929 value = fields->f_rn; 1930 break; 1931 case MEP_OPERAND_RNL : 1932 value = fields->f_rn; 1933 break; 1934 case MEP_OPERAND_RNS : 1935 value = fields->f_rn; 1936 break; 1937 case MEP_OPERAND_RNUC : 1938 value = fields->f_rn; 1939 break; 1940 case MEP_OPERAND_RNUL : 1941 value = fields->f_rn; 1942 break; 1943 case MEP_OPERAND_RNUS : 1944 value = fields->f_rn; 1945 break; 1946 case MEP_OPERAND_SAR : 1947 value = 0; 1948 break; 1949 case MEP_OPERAND_SDISP16 : 1950 value = fields->f_16s16; 1951 break; 1952 case MEP_OPERAND_SIMM16 : 1953 value = fields->f_16s16; 1954 break; 1955 case MEP_OPERAND_SIMM6 : 1956 value = fields->f_6s8; 1957 break; 1958 case MEP_OPERAND_SIMM8 : 1959 value = fields->f_8s8; 1960 break; 1961 case MEP_OPERAND_SP : 1962 value = 0; 1963 break; 1964 case MEP_OPERAND_SPR : 1965 value = 0; 1966 break; 1967 case MEP_OPERAND_TP : 1968 value = 0; 1969 break; 1970 case MEP_OPERAND_TPR : 1971 value = 0; 1972 break; 1973 case MEP_OPERAND_UDISP2 : 1974 value = fields->f_2u6; 1975 break; 1976 case MEP_OPERAND_UDISP7 : 1977 value = fields->f_7u9; 1978 break; 1979 case MEP_OPERAND_UDISP7A2 : 1980 value = fields->f_7u9a2; 1981 break; 1982 case MEP_OPERAND_UDISP7A4 : 1983 value = fields->f_7u9a4; 1984 break; 1985 case MEP_OPERAND_UIMM16 : 1986 value = fields->f_16u16; 1987 break; 1988 case MEP_OPERAND_UIMM2 : 1989 value = fields->f_2u10; 1990 break; 1991 case MEP_OPERAND_UIMM24 : 1992 value = fields->f_24u8n; 1993 break; 1994 case MEP_OPERAND_UIMM3 : 1995 value = fields->f_3u5; 1996 break; 1997 case MEP_OPERAND_UIMM4 : 1998 value = fields->f_4u8; 1999 break; 2000 case MEP_OPERAND_UIMM5 : 2001 value = fields->f_5u8; 2002 break; 2003 case MEP_OPERAND_UIMM7A4 : 2004 value = fields->f_7u9a4; 2005 break; 2006 case MEP_OPERAND_ZERO : 2007 value = 0; 2008 break; 2009 2010 default : 2011 /* xgettext:c-format */ 2012 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"), 2013 opindex); 2014 abort (); 2015 } 2016 2017 return value; 2018} 2019 2020void mep_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int); 2021void mep_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma); 2022 2023/* Stuffing values in cgen_fields is handled by a collection of functions. 2024 They are distinguished by the type of the VALUE argument they accept. 2025 TODO: floating point, inlining support, remove cases where argument type 2026 not appropriate. */ 2027 2028void 2029mep_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 2030 int opindex, 2031 CGEN_FIELDS * fields, 2032 int value) 2033{ 2034 switch (opindex) 2035 { 2036 case MEP_OPERAND_ADDR24A4 : 2037 fields->f_24u8a4n = value; 2038 break; 2039 case MEP_OPERAND_CALLNUM : 2040 fields->f_callnum = value; 2041 break; 2042 case MEP_OPERAND_CCCC : 2043 fields->f_rm = value; 2044 break; 2045 case MEP_OPERAND_CCRN : 2046 fields->f_ccrn = value; 2047 break; 2048 case MEP_OPERAND_CDISP8 : 2049 fields->f_8s24 = value; 2050 break; 2051 case MEP_OPERAND_CDISP8A2 : 2052 fields->f_8s24a2 = value; 2053 break; 2054 case MEP_OPERAND_CDISP8A4 : 2055 fields->f_8s24a4 = value; 2056 break; 2057 case MEP_OPERAND_CDISP8A8 : 2058 fields->f_8s24a8 = value; 2059 break; 2060 case MEP_OPERAND_CIMM4 : 2061 fields->f_rn = value; 2062 break; 2063 case MEP_OPERAND_CIMM5 : 2064 fields->f_5u24 = value; 2065 break; 2066 case MEP_OPERAND_CODE16 : 2067 fields->f_16u16 = value; 2068 break; 2069 case MEP_OPERAND_CODE24 : 2070 fields->f_24u4n = value; 2071 break; 2072 case MEP_OPERAND_CP_FLAG : 2073 break; 2074 case MEP_OPERAND_CRN : 2075 fields->f_crn = value; 2076 break; 2077 case MEP_OPERAND_CRN64 : 2078 fields->f_crn = value; 2079 break; 2080 case MEP_OPERAND_CRNX : 2081 fields->f_crnx = value; 2082 break; 2083 case MEP_OPERAND_CRNX64 : 2084 fields->f_crnx = value; 2085 break; 2086 case MEP_OPERAND_CSRN : 2087 fields->f_csrn = value; 2088 break; 2089 case MEP_OPERAND_CSRN_IDX : 2090 fields->f_csrn = value; 2091 break; 2092 case MEP_OPERAND_DBG : 2093 break; 2094 case MEP_OPERAND_DEPC : 2095 break; 2096 case MEP_OPERAND_EPC : 2097 break; 2098 case MEP_OPERAND_EXC : 2099 break; 2100 case MEP_OPERAND_FMAX_CCRN : 2101 fields->f_fmax_4_4 = value; 2102 break; 2103 case MEP_OPERAND_FMAX_FRD : 2104 fields->f_fmax_frd = value; 2105 break; 2106 case MEP_OPERAND_FMAX_FRD_INT : 2107 fields->f_fmax_frd = value; 2108 break; 2109 case MEP_OPERAND_FMAX_FRM : 2110 fields->f_fmax_frm = value; 2111 break; 2112 case MEP_OPERAND_FMAX_FRN : 2113 fields->f_fmax_frn = value; 2114 break; 2115 case MEP_OPERAND_FMAX_FRN_INT : 2116 fields->f_fmax_frn = value; 2117 break; 2118 case MEP_OPERAND_FMAX_RM : 2119 fields->f_fmax_rm = value; 2120 break; 2121 case MEP_OPERAND_HI : 2122 break; 2123 case MEP_OPERAND_LO : 2124 break; 2125 case MEP_OPERAND_LP : 2126 break; 2127 case MEP_OPERAND_MB0 : 2128 break; 2129 case MEP_OPERAND_MB1 : 2130 break; 2131 case MEP_OPERAND_ME0 : 2132 break; 2133 case MEP_OPERAND_ME1 : 2134 break; 2135 case MEP_OPERAND_NPC : 2136 break; 2137 case MEP_OPERAND_OPT : 2138 break; 2139 case MEP_OPERAND_PCABS24A2 : 2140 fields->f_24u5a2n = value; 2141 break; 2142 case MEP_OPERAND_PCREL12A2 : 2143 fields->f_12s4a2 = value; 2144 break; 2145 case MEP_OPERAND_PCREL17A2 : 2146 fields->f_17s16a2 = value; 2147 break; 2148 case MEP_OPERAND_PCREL24A2 : 2149 fields->f_24s5a2n = value; 2150 break; 2151 case MEP_OPERAND_PCREL8A2 : 2152 fields->f_8s8a2 = value; 2153 break; 2154 case MEP_OPERAND_PSW : 2155 break; 2156 case MEP_OPERAND_R0 : 2157 break; 2158 case MEP_OPERAND_R1 : 2159 break; 2160 case MEP_OPERAND_RL : 2161 fields->f_rl = value; 2162 break; 2163 case MEP_OPERAND_RM : 2164 fields->f_rm = value; 2165 break; 2166 case MEP_OPERAND_RMA : 2167 fields->f_rm = value; 2168 break; 2169 case MEP_OPERAND_RN : 2170 fields->f_rn = value; 2171 break; 2172 case MEP_OPERAND_RN3 : 2173 fields->f_rn3 = value; 2174 break; 2175 case MEP_OPERAND_RN3C : 2176 fields->f_rn3 = value; 2177 break; 2178 case MEP_OPERAND_RN3L : 2179 fields->f_rn3 = value; 2180 break; 2181 case MEP_OPERAND_RN3S : 2182 fields->f_rn3 = value; 2183 break; 2184 case MEP_OPERAND_RN3UC : 2185 fields->f_rn3 = value; 2186 break; 2187 case MEP_OPERAND_RN3UL : 2188 fields->f_rn3 = value; 2189 break; 2190 case MEP_OPERAND_RN3US : 2191 fields->f_rn3 = value; 2192 break; 2193 case MEP_OPERAND_RNC : 2194 fields->f_rn = value; 2195 break; 2196 case MEP_OPERAND_RNL : 2197 fields->f_rn = value; 2198 break; 2199 case MEP_OPERAND_RNS : 2200 fields->f_rn = value; 2201 break; 2202 case MEP_OPERAND_RNUC : 2203 fields->f_rn = value; 2204 break; 2205 case MEP_OPERAND_RNUL : 2206 fields->f_rn = value; 2207 break; 2208 case MEP_OPERAND_RNUS : 2209 fields->f_rn = value; 2210 break; 2211 case MEP_OPERAND_SAR : 2212 break; 2213 case MEP_OPERAND_SDISP16 : 2214 fields->f_16s16 = value; 2215 break; 2216 case MEP_OPERAND_SIMM16 : 2217 fields->f_16s16 = value; 2218 break; 2219 case MEP_OPERAND_SIMM6 : 2220 fields->f_6s8 = value; 2221 break; 2222 case MEP_OPERAND_SIMM8 : 2223 fields->f_8s8 = value; 2224 break; 2225 case MEP_OPERAND_SP : 2226 break; 2227 case MEP_OPERAND_SPR : 2228 break; 2229 case MEP_OPERAND_TP : 2230 break; 2231 case MEP_OPERAND_TPR : 2232 break; 2233 case MEP_OPERAND_UDISP2 : 2234 fields->f_2u6 = value; 2235 break; 2236 case MEP_OPERAND_UDISP7 : 2237 fields->f_7u9 = value; 2238 break; 2239 case MEP_OPERAND_UDISP7A2 : 2240 fields->f_7u9a2 = value; 2241 break; 2242 case MEP_OPERAND_UDISP7A4 : 2243 fields->f_7u9a4 = value; 2244 break; 2245 case MEP_OPERAND_UIMM16 : 2246 fields->f_16u16 = value; 2247 break; 2248 case MEP_OPERAND_UIMM2 : 2249 fields->f_2u10 = value; 2250 break; 2251 case MEP_OPERAND_UIMM24 : 2252 fields->f_24u8n = value; 2253 break; 2254 case MEP_OPERAND_UIMM3 : 2255 fields->f_3u5 = value; 2256 break; 2257 case MEP_OPERAND_UIMM4 : 2258 fields->f_4u8 = value; 2259 break; 2260 case MEP_OPERAND_UIMM5 : 2261 fields->f_5u8 = value; 2262 break; 2263 case MEP_OPERAND_UIMM7A4 : 2264 fields->f_7u9a4 = value; 2265 break; 2266 case MEP_OPERAND_ZERO : 2267 break; 2268 2269 default : 2270 /* xgettext:c-format */ 2271 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"), 2272 opindex); 2273 abort (); 2274 } 2275} 2276 2277void 2278mep_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 2279 int opindex, 2280 CGEN_FIELDS * fields, 2281 bfd_vma value) 2282{ 2283 switch (opindex) 2284 { 2285 case MEP_OPERAND_ADDR24A4 : 2286 fields->f_24u8a4n = value; 2287 break; 2288 case MEP_OPERAND_CALLNUM : 2289 fields->f_callnum = value; 2290 break; 2291 case MEP_OPERAND_CCCC : 2292 fields->f_rm = value; 2293 break; 2294 case MEP_OPERAND_CCRN : 2295 fields->f_ccrn = value; 2296 break; 2297 case MEP_OPERAND_CDISP8 : 2298 fields->f_8s24 = value; 2299 break; 2300 case MEP_OPERAND_CDISP8A2 : 2301 fields->f_8s24a2 = value; 2302 break; 2303 case MEP_OPERAND_CDISP8A4 : 2304 fields->f_8s24a4 = value; 2305 break; 2306 case MEP_OPERAND_CDISP8A8 : 2307 fields->f_8s24a8 = value; 2308 break; 2309 case MEP_OPERAND_CIMM4 : 2310 fields->f_rn = value; 2311 break; 2312 case MEP_OPERAND_CIMM5 : 2313 fields->f_5u24 = value; 2314 break; 2315 case MEP_OPERAND_CODE16 : 2316 fields->f_16u16 = value; 2317 break; 2318 case MEP_OPERAND_CODE24 : 2319 fields->f_24u4n = value; 2320 break; 2321 case MEP_OPERAND_CP_FLAG : 2322 break; 2323 case MEP_OPERAND_CRN : 2324 fields->f_crn = value; 2325 break; 2326 case MEP_OPERAND_CRN64 : 2327 fields->f_crn = value; 2328 break; 2329 case MEP_OPERAND_CRNX : 2330 fields->f_crnx = value; 2331 break; 2332 case MEP_OPERAND_CRNX64 : 2333 fields->f_crnx = value; 2334 break; 2335 case MEP_OPERAND_CSRN : 2336 fields->f_csrn = value; 2337 break; 2338 case MEP_OPERAND_CSRN_IDX : 2339 fields->f_csrn = value; 2340 break; 2341 case MEP_OPERAND_DBG : 2342 break; 2343 case MEP_OPERAND_DEPC : 2344 break; 2345 case MEP_OPERAND_EPC : 2346 break; 2347 case MEP_OPERAND_EXC : 2348 break; 2349 case MEP_OPERAND_FMAX_CCRN : 2350 fields->f_fmax_4_4 = value; 2351 break; 2352 case MEP_OPERAND_FMAX_FRD : 2353 fields->f_fmax_frd = value; 2354 break; 2355 case MEP_OPERAND_FMAX_FRD_INT : 2356 fields->f_fmax_frd = value; 2357 break; 2358 case MEP_OPERAND_FMAX_FRM : 2359 fields->f_fmax_frm = value; 2360 break; 2361 case MEP_OPERAND_FMAX_FRN : 2362 fields->f_fmax_frn = value; 2363 break; 2364 case MEP_OPERAND_FMAX_FRN_INT : 2365 fields->f_fmax_frn = value; 2366 break; 2367 case MEP_OPERAND_FMAX_RM : 2368 fields->f_fmax_rm = value; 2369 break; 2370 case MEP_OPERAND_HI : 2371 break; 2372 case MEP_OPERAND_LO : 2373 break; 2374 case MEP_OPERAND_LP : 2375 break; 2376 case MEP_OPERAND_MB0 : 2377 break; 2378 case MEP_OPERAND_MB1 : 2379 break; 2380 case MEP_OPERAND_ME0 : 2381 break; 2382 case MEP_OPERAND_ME1 : 2383 break; 2384 case MEP_OPERAND_NPC : 2385 break; 2386 case MEP_OPERAND_OPT : 2387 break; 2388 case MEP_OPERAND_PCABS24A2 : 2389 fields->f_24u5a2n = value; 2390 break; 2391 case MEP_OPERAND_PCREL12A2 : 2392 fields->f_12s4a2 = value; 2393 break; 2394 case MEP_OPERAND_PCREL17A2 : 2395 fields->f_17s16a2 = value; 2396 break; 2397 case MEP_OPERAND_PCREL24A2 : 2398 fields->f_24s5a2n = value; 2399 break; 2400 case MEP_OPERAND_PCREL8A2 : 2401 fields->f_8s8a2 = value; 2402 break; 2403 case MEP_OPERAND_PSW : 2404 break; 2405 case MEP_OPERAND_R0 : 2406 break; 2407 case MEP_OPERAND_R1 : 2408 break; 2409 case MEP_OPERAND_RL : 2410 fields->f_rl = value; 2411 break; 2412 case MEP_OPERAND_RM : 2413 fields->f_rm = value; 2414 break; 2415 case MEP_OPERAND_RMA : 2416 fields->f_rm = value; 2417 break; 2418 case MEP_OPERAND_RN : 2419 fields->f_rn = value; 2420 break; 2421 case MEP_OPERAND_RN3 : 2422 fields->f_rn3 = value; 2423 break; 2424 case MEP_OPERAND_RN3C : 2425 fields->f_rn3 = value; 2426 break; 2427 case MEP_OPERAND_RN3L : 2428 fields->f_rn3 = value; 2429 break; 2430 case MEP_OPERAND_RN3S : 2431 fields->f_rn3 = value; 2432 break; 2433 case MEP_OPERAND_RN3UC : 2434 fields->f_rn3 = value; 2435 break; 2436 case MEP_OPERAND_RN3UL : 2437 fields->f_rn3 = value; 2438 break; 2439 case MEP_OPERAND_RN3US : 2440 fields->f_rn3 = value; 2441 break; 2442 case MEP_OPERAND_RNC : 2443 fields->f_rn = value; 2444 break; 2445 case MEP_OPERAND_RNL : 2446 fields->f_rn = value; 2447 break; 2448 case MEP_OPERAND_RNS : 2449 fields->f_rn = value; 2450 break; 2451 case MEP_OPERAND_RNUC : 2452 fields->f_rn = value; 2453 break; 2454 case MEP_OPERAND_RNUL : 2455 fields->f_rn = value; 2456 break; 2457 case MEP_OPERAND_RNUS : 2458 fields->f_rn = value; 2459 break; 2460 case MEP_OPERAND_SAR : 2461 break; 2462 case MEP_OPERAND_SDISP16 : 2463 fields->f_16s16 = value; 2464 break; 2465 case MEP_OPERAND_SIMM16 : 2466 fields->f_16s16 = value; 2467 break; 2468 case MEP_OPERAND_SIMM6 : 2469 fields->f_6s8 = value; 2470 break; 2471 case MEP_OPERAND_SIMM8 : 2472 fields->f_8s8 = value; 2473 break; 2474 case MEP_OPERAND_SP : 2475 break; 2476 case MEP_OPERAND_SPR : 2477 break; 2478 case MEP_OPERAND_TP : 2479 break; 2480 case MEP_OPERAND_TPR : 2481 break; 2482 case MEP_OPERAND_UDISP2 : 2483 fields->f_2u6 = value; 2484 break; 2485 case MEP_OPERAND_UDISP7 : 2486 fields->f_7u9 = value; 2487 break; 2488 case MEP_OPERAND_UDISP7A2 : 2489 fields->f_7u9a2 = value; 2490 break; 2491 case MEP_OPERAND_UDISP7A4 : 2492 fields->f_7u9a4 = value; 2493 break; 2494 case MEP_OPERAND_UIMM16 : 2495 fields->f_16u16 = value; 2496 break; 2497 case MEP_OPERAND_UIMM2 : 2498 fields->f_2u10 = value; 2499 break; 2500 case MEP_OPERAND_UIMM24 : 2501 fields->f_24u8n = value; 2502 break; 2503 case MEP_OPERAND_UIMM3 : 2504 fields->f_3u5 = value; 2505 break; 2506 case MEP_OPERAND_UIMM4 : 2507 fields->f_4u8 = value; 2508 break; 2509 case MEP_OPERAND_UIMM5 : 2510 fields->f_5u8 = value; 2511 break; 2512 case MEP_OPERAND_UIMM7A4 : 2513 fields->f_7u9a4 = value; 2514 break; 2515 case MEP_OPERAND_ZERO : 2516 break; 2517 2518 default : 2519 /* xgettext:c-format */ 2520 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"), 2521 opindex); 2522 abort (); 2523 } 2524} 2525 2526/* Function to call before using the instruction builder tables. */ 2527 2528void 2529mep_cgen_init_ibld_table (CGEN_CPU_DESC cd) 2530{ 2531 cd->insert_handlers = & mep_cgen_insert_handlers[0]; 2532 cd->extract_handlers = & mep_cgen_extract_handlers[0]; 2533 2534 cd->insert_operand = mep_cgen_insert_operand; 2535 cd->extract_operand = mep_cgen_extract_operand; 2536 2537 cd->get_int_operand = mep_cgen_get_int_operand; 2538 cd->set_int_operand = mep_cgen_set_int_operand; 2539 cd->get_vma_operand = mep_cgen_get_vma_operand; 2540 cd->set_vma_operand = mep_cgen_set_vma_operand; 2541} 2542