Home | History | Annotate | Line # | Download | only in opcodes
epiphany-ibld.c revision 1.1
      1  1.1  christos /* Instruction building/extraction support for epiphany. -*- C -*-
      2  1.1  christos 
      3  1.1  christos    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
      4  1.1  christos    - the resultant file is machine generated, cgen-ibld.in isn't
      5  1.1  christos 
      6  1.1  christos    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006, 2007,
      7  1.1  christos    2008, 2010  Free Software Foundation, Inc.
      8  1.1  christos 
      9  1.1  christos    This file is part of libopcodes.
     10  1.1  christos 
     11  1.1  christos    This library is free software; you can redistribute it and/or modify
     12  1.1  christos    it under the terms of the GNU General Public License as published by
     13  1.1  christos    the Free Software Foundation; either version 3, or (at your option)
     14  1.1  christos    any later version.
     15  1.1  christos 
     16  1.1  christos    It is distributed in the hope that it will be useful, but WITHOUT
     17  1.1  christos    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     18  1.1  christos    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     19  1.1  christos    License for more details.
     20  1.1  christos 
     21  1.1  christos    You should have received a copy of the GNU General Public License
     22  1.1  christos    along with this program; if not, write to the Free Software Foundation, Inc.,
     23  1.1  christos    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     24  1.1  christos 
     25  1.1  christos /* ??? Eventually more and more of this stuff can go to cpu-independent files.
     26  1.1  christos    Keep that in mind.  */
     27  1.1  christos 
     28  1.1  christos #include "sysdep.h"
     29  1.1  christos #include <stdio.h>
     30  1.1  christos #include "ansidecl.h"
     31  1.1  christos #include "dis-asm.h"
     32  1.1  christos #include "bfd.h"
     33  1.1  christos #include "symcat.h"
     34  1.1  christos #include "epiphany-desc.h"
     35  1.1  christos #include "epiphany-opc.h"
     36  1.1  christos #include "cgen/basic-modes.h"
     37  1.1  christos #include "opintl.h"
     38  1.1  christos #include "safe-ctype.h"
     39  1.1  christos 
     40  1.1  christos #undef  min
     41  1.1  christos #define min(a,b) ((a) < (b) ? (a) : (b))
     42  1.1  christos #undef  max
     43  1.1  christos #define max(a,b) ((a) > (b) ? (a) : (b))
     44  1.1  christos 
     45  1.1  christos /* Used by the ifield rtx function.  */
     46  1.1  christos #define FLD(f) (fields->f)
     47  1.1  christos 
     48  1.1  christos static const char * insert_normal
     49  1.1  christos   (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
     50  1.1  christos    unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
     51  1.1  christos static const char * insert_insn_normal
     52  1.1  christos   (CGEN_CPU_DESC, const CGEN_INSN *,
     53  1.1  christos    CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
     54  1.1  christos static int extract_normal
     55  1.1  christos   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
     56  1.1  christos    unsigned int, unsigned int, unsigned int, unsigned int,
     57  1.1  christos    unsigned int, unsigned int, bfd_vma, long *);
     58  1.1  christos static int extract_insn_normal
     59  1.1  christos   (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
     60  1.1  christos    CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
     61  1.1  christos #if CGEN_INT_INSN_P
     62  1.1  christos static void put_insn_int_value
     63  1.1  christos   (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
     64  1.1  christos #endif
     65  1.1  christos #if ! CGEN_INT_INSN_P
     66  1.1  christos static CGEN_INLINE void insert_1
     67  1.1  christos   (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
     68  1.1  christos static CGEN_INLINE int fill_cache
     69  1.1  christos   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
     70  1.1  christos static CGEN_INLINE long extract_1
     71  1.1  christos   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
     72  1.1  christos #endif
     73  1.1  christos 
     74  1.1  christos /* Operand insertion.  */
     76  1.1  christos 
     77  1.1  christos #if ! CGEN_INT_INSN_P
     78  1.1  christos 
     79  1.1  christos /* Subroutine of insert_normal.  */
     80  1.1  christos 
     81  1.1  christos static CGEN_INLINE void
     82  1.1  christos insert_1 (CGEN_CPU_DESC cd,
     83  1.1  christos 	  unsigned long value,
     84  1.1  christos 	  int start,
     85  1.1  christos 	  int length,
     86  1.1  christos 	  int word_length,
     87  1.1  christos 	  unsigned char *bufp)
     88  1.1  christos {
     89  1.1  christos   unsigned long x,mask;
     90  1.1  christos   int shift;
     91  1.1  christos 
     92  1.1  christos   x = cgen_get_insn_value (cd, bufp, word_length);
     93  1.1  christos 
     94  1.1  christos   /* Written this way to avoid undefined behaviour.  */
     95  1.1  christos   mask = (((1L << (length - 1)) - 1) << 1) | 1;
     96  1.1  christos   if (CGEN_INSN_LSB0_P)
     97  1.1  christos     shift = (start + 1) - length;
     98  1.1  christos   else
     99  1.1  christos     shift = (word_length - (start + length));
    100  1.1  christos   x = (x & ~(mask << shift)) | ((value & mask) << shift);
    101  1.1  christos 
    102  1.1  christos   cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
    103  1.1  christos }
    104  1.1  christos 
    105  1.1  christos #endif /* ! CGEN_INT_INSN_P */
    106  1.1  christos 
    107  1.1  christos /* Default insertion routine.
    108  1.1  christos 
    109  1.1  christos    ATTRS is a mask of the boolean attributes.
    110  1.1  christos    WORD_OFFSET is the offset in bits from the start of the insn of the value.
    111  1.1  christos    WORD_LENGTH is the length of the word in bits in which the value resides.
    112  1.1  christos    START is the starting bit number in the word, architecture origin.
    113  1.1  christos    LENGTH is the length of VALUE in bits.
    114  1.1  christos    TOTAL_LENGTH is the total length of the insn in bits.
    115  1.1  christos 
    116  1.1  christos    The result is an error message or NULL if success.  */
    117  1.1  christos 
    118  1.1  christos /* ??? This duplicates functionality with bfd's howto table and
    119  1.1  christos    bfd_install_relocation.  */
    120  1.1  christos /* ??? This doesn't handle bfd_vma's.  Create another function when
    121  1.1  christos    necessary.  */
    122  1.1  christos 
    123  1.1  christos static const char *
    124  1.1  christos insert_normal (CGEN_CPU_DESC cd,
    125  1.1  christos 	       long value,
    126  1.1  christos 	       unsigned int attrs,
    127  1.1  christos 	       unsigned int word_offset,
    128  1.1  christos 	       unsigned int start,
    129  1.1  christos 	       unsigned int length,
    130  1.1  christos 	       unsigned int word_length,
    131  1.1  christos 	       unsigned int total_length,
    132  1.1  christos 	       CGEN_INSN_BYTES_PTR buffer)
    133  1.1  christos {
    134  1.1  christos   static char errbuf[100];
    135  1.1  christos   /* Written this way to avoid undefined behaviour.  */
    136  1.1  christos   unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
    137  1.1  christos 
    138  1.1  christos   /* If LENGTH is zero, this operand doesn't contribute to the value.  */
    139  1.1  christos   if (length == 0)
    140  1.1  christos     return NULL;
    141  1.1  christos 
    142  1.1  christos   if (word_length > 8 * sizeof (CGEN_INSN_INT))
    143  1.1  christos     abort ();
    144  1.1  christos 
    145  1.1  christos   /* For architectures with insns smaller than the base-insn-bitsize,
    146  1.1  christos      word_length may be too big.  */
    147  1.1  christos   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    148  1.1  christos     {
    149  1.1  christos       if (word_offset == 0
    150  1.1  christos 	  && word_length > total_length)
    151  1.1  christos 	word_length = total_length;
    152  1.1  christos     }
    153  1.1  christos 
    154  1.1  christos   /* Ensure VALUE will fit.  */
    155  1.1  christos   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
    156  1.1  christos     {
    157  1.1  christos       long minval = - (1L << (length - 1));
    158  1.1  christos       unsigned long maxval = mask;
    159  1.1  christos 
    160  1.1  christos       if ((value > 0 && (unsigned long) value > maxval)
    161  1.1  christos 	  || value < minval)
    162  1.1  christos 	{
    163  1.1  christos 	  /* xgettext:c-format */
    164  1.1  christos 	  sprintf (errbuf,
    165  1.1  christos 		   _("operand out of range (%ld not between %ld and %lu)"),
    166  1.1  christos 		   value, minval, maxval);
    167  1.1  christos 	  return errbuf;
    168  1.1  christos 	}
    169  1.1  christos     }
    170  1.1  christos   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
    171  1.1  christos     {
    172  1.1  christos       unsigned long maxval = mask;
    173  1.1  christos       unsigned long val = (unsigned long) value;
    174  1.1  christos 
    175  1.1  christos       /* For hosts with a word size > 32 check to see if value has been sign
    176  1.1  christos 	 extended beyond 32 bits.  If so then ignore these higher sign bits
    177  1.1  christos 	 as the user is attempting to store a 32-bit signed value into an
    178  1.1  christos 	 unsigned 32-bit field which is allowed.  */
    179  1.1  christos       if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
    180  1.1  christos 	val &= 0xFFFFFFFF;
    181  1.1  christos 
    182  1.1  christos       if (val > maxval)
    183  1.1  christos 	{
    184  1.1  christos 	  /* xgettext:c-format */
    185  1.1  christos 	  sprintf (errbuf,
    186  1.1  christos 		   _("operand out of range (0x%lx not between 0 and 0x%lx)"),
    187  1.1  christos 		   val, maxval);
    188  1.1  christos 	  return errbuf;
    189  1.1  christos 	}
    190  1.1  christos     }
    191  1.1  christos   else
    192  1.1  christos     {
    193  1.1  christos       if (! cgen_signed_overflow_ok_p (cd))
    194  1.1  christos 	{
    195  1.1  christos 	  long minval = - (1L << (length - 1));
    196  1.1  christos 	  long maxval =   (1L << (length - 1)) - 1;
    197  1.1  christos 
    198  1.1  christos 	  if (value < minval || value > maxval)
    199  1.1  christos 	    {
    200  1.1  christos 	      sprintf
    201  1.1  christos 		/* xgettext:c-format */
    202  1.1  christos 		(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
    203  1.1  christos 		 value, minval, maxval);
    204  1.1  christos 	      return errbuf;
    205  1.1  christos 	    }
    206  1.1  christos 	}
    207  1.1  christos     }
    208  1.1  christos 
    209  1.1  christos #if CGEN_INT_INSN_P
    210  1.1  christos 
    211  1.1  christos   {
    212  1.1  christos     int shift;
    213  1.1  christos 
    214  1.1  christos     if (CGEN_INSN_LSB0_P)
    215  1.1  christos       shift = (word_offset + start + 1) - length;
    216  1.1  christos     else
    217  1.1  christos       shift = total_length - (word_offset + start + length);
    218  1.1  christos     *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
    219  1.1  christos   }
    220  1.1  christos 
    221  1.1  christos #else /* ! CGEN_INT_INSN_P */
    222  1.1  christos 
    223  1.1  christos   {
    224  1.1  christos     unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
    225  1.1  christos 
    226  1.1  christos     insert_1 (cd, value, start, length, word_length, bufp);
    227  1.1  christos   }
    228  1.1  christos 
    229  1.1  christos #endif /* ! CGEN_INT_INSN_P */
    230  1.1  christos 
    231  1.1  christos   return NULL;
    232  1.1  christos }
    233  1.1  christos 
    234  1.1  christos /* Default insn builder (insert handler).
    235  1.1  christos    The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
    236  1.1  christos    that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
    237  1.1  christos    recorded in host byte order, otherwise BUFFER is an array of bytes
    238  1.1  christos    and the value is recorded in target byte order).
    239  1.1  christos    The result is an error message or NULL if success.  */
    240  1.1  christos 
    241  1.1  christos static const char *
    242  1.1  christos insert_insn_normal (CGEN_CPU_DESC cd,
    243  1.1  christos 		    const CGEN_INSN * insn,
    244  1.1  christos 		    CGEN_FIELDS * fields,
    245  1.1  christos 		    CGEN_INSN_BYTES_PTR buffer,
    246  1.1  christos 		    bfd_vma pc)
    247  1.1  christos {
    248  1.1  christos   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
    249  1.1  christos   unsigned long value;
    250  1.1  christos   const CGEN_SYNTAX_CHAR_TYPE * syn;
    251  1.1  christos 
    252  1.1  christos   CGEN_INIT_INSERT (cd);
    253  1.1  christos   value = CGEN_INSN_BASE_VALUE (insn);
    254  1.1  christos 
    255  1.1  christos   /* If we're recording insns as numbers (rather than a string of bytes),
    256  1.1  christos      target byte order handling is deferred until later.  */
    257  1.1  christos 
    258  1.1  christos #if CGEN_INT_INSN_P
    259  1.1  christos 
    260  1.1  christos   put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
    261  1.1  christos 		      CGEN_FIELDS_BITSIZE (fields), value);
    262  1.1  christos 
    263  1.1  christos #else
    264  1.1  christos 
    265  1.1  christos   cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
    266  1.1  christos 					(unsigned) CGEN_FIELDS_BITSIZE (fields)),
    267  1.1  christos 		       value);
    268  1.1  christos 
    269  1.1  christos #endif /* ! CGEN_INT_INSN_P */
    270  1.1  christos 
    271  1.1  christos   /* ??? It would be better to scan the format's fields.
    272  1.1  christos      Still need to be able to insert a value based on the operand though;
    273  1.1  christos      e.g. storing a branch displacement that got resolved later.
    274  1.1  christos      Needs more thought first.  */
    275  1.1  christos 
    276  1.1  christos   for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
    277  1.1  christos     {
    278  1.1  christos       const char *errmsg;
    279  1.1  christos 
    280  1.1  christos       if (CGEN_SYNTAX_CHAR_P (* syn))
    281  1.1  christos 	continue;
    282  1.1  christos 
    283  1.1  christos       errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
    284  1.1  christos 				       fields, buffer, pc);
    285  1.1  christos       if (errmsg)
    286  1.1  christos 	return errmsg;
    287  1.1  christos     }
    288  1.1  christos 
    289  1.1  christos   return NULL;
    290  1.1  christos }
    291  1.1  christos 
    292  1.1  christos #if CGEN_INT_INSN_P
    293  1.1  christos /* Cover function to store an insn value into an integral insn.  Must go here
    294  1.1  christos    because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */
    295  1.1  christos 
    296  1.1  christos static void
    297  1.1  christos put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
    298  1.1  christos 		    CGEN_INSN_BYTES_PTR buf,
    299  1.1  christos 		    int length,
    300  1.1  christos 		    int insn_length,
    301  1.1  christos 		    CGEN_INSN_INT value)
    302  1.1  christos {
    303  1.1  christos   /* For architectures with insns smaller than the base-insn-bitsize,
    304  1.1  christos      length may be too big.  */
    305  1.1  christos   if (length > insn_length)
    306  1.1  christos     *buf = value;
    307  1.1  christos   else
    308  1.1  christos     {
    309  1.1  christos       int shift = insn_length - length;
    310  1.1  christos       /* Written this way to avoid undefined behaviour.  */
    311  1.1  christos       CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
    312  1.1  christos 
    313  1.1  christos       *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
    314  1.1  christos     }
    315  1.1  christos }
    316  1.1  christos #endif
    317  1.1  christos 
    318  1.1  christos /* Operand extraction.  */
    320  1.1  christos 
    321  1.1  christos #if ! CGEN_INT_INSN_P
    322  1.1  christos 
    323  1.1  christos /* Subroutine of extract_normal.
    324  1.1  christos    Ensure sufficient bytes are cached in EX_INFO.
    325  1.1  christos    OFFSET is the offset in bytes from the start of the insn of the value.
    326  1.1  christos    BYTES is the length of the needed value.
    327  1.1  christos    Returns 1 for success, 0 for failure.  */
    328  1.1  christos 
    329  1.1  christos static CGEN_INLINE int
    330  1.1  christos fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
    331  1.1  christos 	    CGEN_EXTRACT_INFO *ex_info,
    332  1.1  christos 	    int offset,
    333  1.1  christos 	    int bytes,
    334  1.1  christos 	    bfd_vma pc)
    335  1.1  christos {
    336  1.1  christos   /* It's doubtful that the middle part has already been fetched so
    337  1.1  christos      we don't optimize that case.  kiss.  */
    338  1.1  christos   unsigned int mask;
    339  1.1  christos   disassemble_info *info = (disassemble_info *) ex_info->dis_info;
    340  1.1  christos 
    341  1.1  christos   /* First do a quick check.  */
    342  1.1  christos   mask = (1 << bytes) - 1;
    343  1.1  christos   if (((ex_info->valid >> offset) & mask) == mask)
    344  1.1  christos     return 1;
    345  1.1  christos 
    346  1.1  christos   /* Search for the first byte we need to read.  */
    347  1.1  christos   for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
    348  1.1  christos     if (! (mask & ex_info->valid))
    349  1.1  christos       break;
    350  1.1  christos 
    351  1.1  christos   if (bytes)
    352  1.1  christos     {
    353  1.1  christos       int status;
    354  1.1  christos 
    355  1.1  christos       pc += offset;
    356  1.1  christos       status = (*info->read_memory_func)
    357  1.1  christos 	(pc, ex_info->insn_bytes + offset, bytes, info);
    358  1.1  christos 
    359  1.1  christos       if (status != 0)
    360  1.1  christos 	{
    361  1.1  christos 	  (*info->memory_error_func) (status, pc, info);
    362  1.1  christos 	  return 0;
    363  1.1  christos 	}
    364  1.1  christos 
    365  1.1  christos       ex_info->valid |= ((1 << bytes) - 1) << offset;
    366  1.1  christos     }
    367  1.1  christos 
    368  1.1  christos   return 1;
    369  1.1  christos }
    370  1.1  christos 
    371  1.1  christos /* Subroutine of extract_normal.  */
    372  1.1  christos 
    373  1.1  christos static CGEN_INLINE long
    374  1.1  christos extract_1 (CGEN_CPU_DESC cd,
    375  1.1  christos 	   CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
    376  1.1  christos 	   int start,
    377  1.1  christos 	   int length,
    378  1.1  christos 	   int word_length,
    379  1.1  christos 	   unsigned char *bufp,
    380  1.1  christos 	   bfd_vma pc ATTRIBUTE_UNUSED)
    381  1.1  christos {
    382  1.1  christos   unsigned long x;
    383  1.1  christos   int shift;
    384  1.1  christos 
    385  1.1  christos   x = cgen_get_insn_value (cd, bufp, word_length);
    386  1.1  christos 
    387  1.1  christos   if (CGEN_INSN_LSB0_P)
    388  1.1  christos     shift = (start + 1) - length;
    389  1.1  christos   else
    390  1.1  christos     shift = (word_length - (start + length));
    391  1.1  christos   return x >> shift;
    392  1.1  christos }
    393  1.1  christos 
    394  1.1  christos #endif /* ! CGEN_INT_INSN_P */
    395  1.1  christos 
    396  1.1  christos /* Default extraction routine.
    397  1.1  christos 
    398  1.1  christos    INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
    399  1.1  christos    or sometimes less for cases like the m32r where the base insn size is 32
    400  1.1  christos    but some insns are 16 bits.
    401  1.1  christos    ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
    402  1.1  christos    but for generality we take a bitmask of all of them.
    403  1.1  christos    WORD_OFFSET is the offset in bits from the start of the insn of the value.
    404  1.1  christos    WORD_LENGTH is the length of the word in bits in which the value resides.
    405  1.1  christos    START is the starting bit number in the word, architecture origin.
    406  1.1  christos    LENGTH is the length of VALUE in bits.
    407  1.1  christos    TOTAL_LENGTH is the total length of the insn in bits.
    408  1.1  christos 
    409  1.1  christos    Returns 1 for success, 0 for failure.  */
    410  1.1  christos 
    411  1.1  christos /* ??? The return code isn't properly used.  wip.  */
    412  1.1  christos 
    413  1.1  christos /* ??? This doesn't handle bfd_vma's.  Create another function when
    414  1.1  christos    necessary.  */
    415  1.1  christos 
    416  1.1  christos static int
    417  1.1  christos extract_normal (CGEN_CPU_DESC cd,
    418  1.1  christos #if ! CGEN_INT_INSN_P
    419  1.1  christos 		CGEN_EXTRACT_INFO *ex_info,
    420  1.1  christos #else
    421  1.1  christos 		CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
    422  1.1  christos #endif
    423  1.1  christos 		CGEN_INSN_INT insn_value,
    424  1.1  christos 		unsigned int attrs,
    425  1.1  christos 		unsigned int word_offset,
    426  1.1  christos 		unsigned int start,
    427  1.1  christos 		unsigned int length,
    428  1.1  christos 		unsigned int word_length,
    429  1.1  christos 		unsigned int total_length,
    430  1.1  christos #if ! CGEN_INT_INSN_P
    431  1.1  christos 		bfd_vma pc,
    432  1.1  christos #else
    433  1.1  christos 		bfd_vma pc ATTRIBUTE_UNUSED,
    434  1.1  christos #endif
    435  1.1  christos 		long *valuep)
    436  1.1  christos {
    437  1.1  christos   long value, mask;
    438  1.1  christos 
    439  1.1  christos   /* If LENGTH is zero, this operand doesn't contribute to the value
    440  1.1  christos      so give it a standard value of zero.  */
    441  1.1  christos   if (length == 0)
    442  1.1  christos     {
    443  1.1  christos       *valuep = 0;
    444  1.1  christos       return 1;
    445  1.1  christos     }
    446  1.1  christos 
    447  1.1  christos   if (word_length > 8 * sizeof (CGEN_INSN_INT))
    448  1.1  christos     abort ();
    449  1.1  christos 
    450  1.1  christos   /* For architectures with insns smaller than the insn-base-bitsize,
    451  1.1  christos      word_length may be too big.  */
    452  1.1  christos   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    453  1.1  christos     {
    454  1.1  christos       if (word_offset + word_length > total_length)
    455  1.1  christos 	word_length = total_length - word_offset;
    456  1.1  christos     }
    457  1.1  christos 
    458  1.1  christos   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
    459  1.1  christos 
    460  1.1  christos   if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
    461  1.1  christos     {
    462  1.1  christos       if (CGEN_INSN_LSB0_P)
    463  1.1  christos 	value = insn_value >> ((word_offset + start + 1) - length);
    464  1.1  christos       else
    465  1.1  christos 	value = insn_value >> (total_length - ( word_offset + start + length));
    466  1.1  christos     }
    467  1.1  christos 
    468  1.1  christos #if ! CGEN_INT_INSN_P
    469  1.1  christos 
    470  1.1  christos   else
    471  1.1  christos     {
    472  1.1  christos       unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
    473  1.1  christos 
    474  1.1  christos       if (word_length > 8 * sizeof (CGEN_INSN_INT))
    475  1.1  christos 	abort ();
    476  1.1  christos 
    477  1.1  christos       if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
    478  1.1  christos 	return 0;
    479  1.1  christos 
    480  1.1  christos       value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
    481  1.1  christos     }
    482  1.1  christos 
    483  1.1  christos #endif /* ! CGEN_INT_INSN_P */
    484  1.1  christos 
    485  1.1  christos   /* Written this way to avoid undefined behaviour.  */
    486  1.1  christos   mask = (((1L << (length - 1)) - 1) << 1) | 1;
    487  1.1  christos 
    488  1.1  christos   value &= mask;
    489  1.1  christos   /* sign extend? */
    490  1.1  christos   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
    491  1.1  christos       && (value & (1L << (length - 1))))
    492  1.1  christos     value |= ~mask;
    493  1.1  christos 
    494  1.1  christos   *valuep = value;
    495  1.1  christos 
    496  1.1  christos   return 1;
    497  1.1  christos }
    498  1.1  christos 
    499  1.1  christos /* Default insn extractor.
    500  1.1  christos 
    501  1.1  christos    INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
    502  1.1  christos    The extracted fields are stored in FIELDS.
    503  1.1  christos    EX_INFO is used to handle reading variable length insns.
    504  1.1  christos    Return the length of the insn in bits, or 0 if no match,
    505  1.1  christos    or -1 if an error occurs fetching data (memory_error_func will have
    506  1.1  christos    been called).  */
    507  1.1  christos 
    508  1.1  christos static int
    509  1.1  christos extract_insn_normal (CGEN_CPU_DESC cd,
    510  1.1  christos 		     const CGEN_INSN *insn,
    511  1.1  christos 		     CGEN_EXTRACT_INFO *ex_info,
    512  1.1  christos 		     CGEN_INSN_INT insn_value,
    513  1.1  christos 		     CGEN_FIELDS *fields,
    514  1.1  christos 		     bfd_vma pc)
    515  1.1  christos {
    516  1.1  christos   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
    517  1.1  christos   const CGEN_SYNTAX_CHAR_TYPE *syn;
    518  1.1  christos 
    519  1.1  christos   CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
    520  1.1  christos 
    521  1.1  christos   CGEN_INIT_EXTRACT (cd);
    522  1.1  christos 
    523  1.1  christos   for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
    524  1.1  christos     {
    525  1.1  christos       int length;
    526  1.1  christos 
    527  1.1  christos       if (CGEN_SYNTAX_CHAR_P (*syn))
    528  1.1  christos 	continue;
    529  1.1  christos 
    530  1.1  christos       length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
    531  1.1  christos 					ex_info, insn_value, fields, pc);
    532  1.1  christos       if (length <= 0)
    533  1.1  christos 	return length;
    534  1.1  christos     }
    535  1.1  christos 
    536  1.1  christos   /* We recognized and successfully extracted this insn.  */
    537  1.1  christos   return CGEN_INSN_BITSIZE (insn);
    538  1.1  christos }
    539  1.1  christos 
    540  1.1  christos /* Machine generated code added here.  */
    542  1.1  christos 
    543  1.1  christos const char * epiphany_cgen_insert_operand
    544  1.1  christos   (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
    545  1.1  christos 
    546  1.1  christos /* Main entry point for operand insertion.
    547  1.1  christos 
    548  1.1  christos    This function is basically just a big switch statement.  Earlier versions
    549  1.1  christos    used tables to look up the function to use, but
    550  1.1  christos    - if the table contains both assembler and disassembler functions then
    551  1.1  christos      the disassembler contains much of the assembler and vice-versa,
    552  1.1  christos    - there's a lot of inlining possibilities as things grow,
    553  1.1  christos    - using a switch statement avoids the function call overhead.
    554  1.1  christos 
    555  1.1  christos    This function could be moved into `parse_insn_normal', but keeping it
    556  1.1  christos    separate makes clear the interface between `parse_insn_normal' and each of
    557  1.1  christos    the handlers.  It's also needed by GAS to insert operands that couldn't be
    558  1.1  christos    resolved during parsing.  */
    559  1.1  christos 
    560  1.1  christos const char *
    561  1.1  christos epiphany_cgen_insert_operand (CGEN_CPU_DESC cd,
    562  1.1  christos 			     int opindex,
    563  1.1  christos 			     CGEN_FIELDS * fields,
    564  1.1  christos 			     CGEN_INSN_BYTES_PTR buffer,
    565  1.1  christos 			     bfd_vma pc ATTRIBUTE_UNUSED)
    566  1.1  christos {
    567  1.1  christos   const char * errmsg = NULL;
    568  1.1  christos   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
    569  1.1  christos 
    570  1.1  christos   switch (opindex)
    571  1.1  christos     {
    572  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
    573  1.1  christos       errmsg = insert_normal (cd, fields->f_addsubx, 0, 0, 20, 1, 32, total_length, buffer);
    574  1.1  christos       break;
    575  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
    576  1.1  christos       {
    577  1.1  christos {
    578  1.1  christos   FLD (f_disp8) = ((((UINT) (FLD (f_disp11)) >> (3))) & (255));
    579  1.1  christos   FLD (f_disp3) = ((FLD (f_disp11)) & (7));
    580  1.1  christos }
    581  1.1  christos         errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
    582  1.1  christos         if (errmsg)
    583  1.1  christos           break;
    584  1.1  christos         errmsg = insert_normal (cd, fields->f_disp8, 0, 0, 23, 8, 32, total_length, buffer);
    585  1.1  christos         if (errmsg)
    586  1.1  christos           break;
    587  1.1  christos       }
    588  1.1  christos       break;
    589  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
    590  1.1  christos       errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
    591  1.1  christos       break;
    592  1.1  christos     case EPIPHANY_OPERAND_DPMI :
    593  1.1  christos       errmsg = insert_normal (cd, fields->f_subd, 0, 0, 24, 1, 32, total_length, buffer);
    594  1.1  christos       break;
    595  1.1  christos     case EPIPHANY_OPERAND_FRD :
    596  1.1  christos       errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
    597  1.1  christos       break;
    598  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
    599  1.1  christos       {
    600  1.1  christos {
    601  1.1  christos   FLD (f_rd) = ((FLD (f_rd6)) & (7));
    602  1.1  christos   FLD (f_rd_x) = ((UINT) (FLD (f_rd6)) >> (3));
    603  1.1  christos }
    604  1.1  christos         errmsg = insert_normal (cd, fields->f_rd_x, 0, 0, 31, 3, 32, total_length, buffer);
    605  1.1  christos         if (errmsg)
    606  1.1  christos           break;
    607  1.1  christos         errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
    608  1.1  christos         if (errmsg)
    609  1.1  christos           break;
    610  1.1  christos       }
    611  1.1  christos       break;
    612  1.1  christos     case EPIPHANY_OPERAND_FRM :
    613  1.1  christos       errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
    614  1.1  christos       break;
    615  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
    616  1.1  christos       {
    617  1.1  christos {
    618  1.1  christos   FLD (f_rm) = ((FLD (f_rm6)) & (7));
    619  1.1  christos   FLD (f_rm_x) = ((UINT) (FLD (f_rm6)) >> (3));
    620  1.1  christos }
    621  1.1  christos         errmsg = insert_normal (cd, fields->f_rm_x, 0, 0, 25, 3, 32, total_length, buffer);
    622  1.1  christos         if (errmsg)
    623  1.1  christos           break;
    624  1.1  christos         errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
    625  1.1  christos         if (errmsg)
    626  1.1  christos           break;
    627  1.1  christos       }
    628  1.1  christos       break;
    629  1.1  christos     case EPIPHANY_OPERAND_FRN :
    630  1.1  christos       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
    631  1.1  christos       break;
    632  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
    633  1.1  christos       {
    634  1.1  christos {
    635  1.1  christos   FLD (f_rn) = ((FLD (f_rn6)) & (7));
    636  1.1  christos   FLD (f_rn_x) = ((UINT) (FLD (f_rn6)) >> (3));
    637  1.1  christos }
    638  1.1  christos         errmsg = insert_normal (cd, fields->f_rn_x, 0, 0, 28, 3, 32, total_length, buffer);
    639  1.1  christos         if (errmsg)
    640  1.1  christos           break;
    641  1.1  christos         errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
    642  1.1  christos         if (errmsg)
    643  1.1  christos           break;
    644  1.1  christos       }
    645  1.1  christos       break;
    646  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
    647  1.1  christos       {
    648  1.1  christos {
    649  1.1  christos   FLD (f_imm8) = ((FLD (f_imm16)) & (255));
    650  1.1  christos   FLD (f_imm_27_8) = ((UINT) (FLD (f_imm16)) >> (8));
    651  1.1  christos }
    652  1.1  christos         errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 12, 8, 32, total_length, buffer);
    653  1.1  christos         if (errmsg)
    654  1.1  christos           break;
    655  1.1  christos         errmsg = insert_normal (cd, fields->f_imm_27_8, 0, 0, 27, 8, 32, total_length, buffer);
    656  1.1  christos         if (errmsg)
    657  1.1  christos           break;
    658  1.1  christos       }
    659  1.1  christos       break;
    660  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
    661  1.1  christos       errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 12, 8, 32, total_length, buffer);
    662  1.1  christos       break;
    663  1.1  christos     case EPIPHANY_OPERAND_RD :
    664  1.1  christos       errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
    665  1.1  christos       break;
    666  1.1  christos     case EPIPHANY_OPERAND_RD6 :
    667  1.1  christos       {
    668  1.1  christos {
    669  1.1  christos   FLD (f_rd) = ((FLD (f_rd6)) & (7));
    670  1.1  christos   FLD (f_rd_x) = ((UINT) (FLD (f_rd6)) >> (3));
    671  1.1  christos }
    672  1.1  christos         errmsg = insert_normal (cd, fields->f_rd_x, 0, 0, 31, 3, 32, total_length, buffer);
    673  1.1  christos         if (errmsg)
    674  1.1  christos           break;
    675  1.1  christos         errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
    676  1.1  christos         if (errmsg)
    677  1.1  christos           break;
    678  1.1  christos       }
    679  1.1  christos       break;
    680  1.1  christos     case EPIPHANY_OPERAND_RM :
    681  1.1  christos       errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
    682  1.1  christos       break;
    683  1.1  christos     case EPIPHANY_OPERAND_RM6 :
    684  1.1  christos       {
    685  1.1  christos {
    686  1.1  christos   FLD (f_rm) = ((FLD (f_rm6)) & (7));
    687  1.1  christos   FLD (f_rm_x) = ((UINT) (FLD (f_rm6)) >> (3));
    688  1.1  christos }
    689  1.1  christos         errmsg = insert_normal (cd, fields->f_rm_x, 0, 0, 25, 3, 32, total_length, buffer);
    690  1.1  christos         if (errmsg)
    691  1.1  christos           break;
    692  1.1  christos         errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
    693  1.1  christos         if (errmsg)
    694  1.1  christos           break;
    695  1.1  christos       }
    696  1.1  christos       break;
    697  1.1  christos     case EPIPHANY_OPERAND_RN :
    698  1.1  christos       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
    699  1.1  christos       break;
    700  1.1  christos     case EPIPHANY_OPERAND_RN6 :
    701  1.1  christos       {
    702  1.1  christos {
    703  1.1  christos   FLD (f_rn) = ((FLD (f_rn6)) & (7));
    704  1.1  christos   FLD (f_rn_x) = ((UINT) (FLD (f_rn6)) >> (3));
    705  1.1  christos }
    706  1.1  christos         errmsg = insert_normal (cd, fields->f_rn_x, 0, 0, 28, 3, 32, total_length, buffer);
    707  1.1  christos         if (errmsg)
    708  1.1  christos           break;
    709  1.1  christos         errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
    710  1.1  christos         if (errmsg)
    711  1.1  christos           break;
    712  1.1  christos       }
    713  1.1  christos       break;
    714  1.1  christos     case EPIPHANY_OPERAND_SD :
    715  1.1  christos       errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
    716  1.1  christos       break;
    717  1.1  christos     case EPIPHANY_OPERAND_SD6 :
    718  1.1  christos       {
    719  1.1  christos {
    720  1.1  christos   FLD (f_sd) = ((FLD (f_sd6)) & (7));
    721  1.1  christos   FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
    722  1.1  christos }
    723  1.1  christos         errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
    724  1.1  christos         if (errmsg)
    725  1.1  christos           break;
    726  1.1  christos         errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
    727  1.1  christos         if (errmsg)
    728  1.1  christos           break;
    729  1.1  christos       }
    730  1.1  christos       break;
    731  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
    732  1.1  christos       {
    733  1.1  christos {
    734  1.1  christos   FLD (f_sd) = ((FLD (f_sd6)) & (7));
    735  1.1  christos   FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
    736  1.1  christos }
    737  1.1  christos         errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
    738  1.1  christos         if (errmsg)
    739  1.1  christos           break;
    740  1.1  christos         errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
    741  1.1  christos         if (errmsg)
    742  1.1  christos           break;
    743  1.1  christos       }
    744  1.1  christos       break;
    745  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
    746  1.1  christos       {
    747  1.1  christos {
    748  1.1  christos   FLD (f_sd) = ((FLD (f_sd6)) & (7));
    749  1.1  christos   FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
    750  1.1  christos }
    751  1.1  christos         errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
    752  1.1  christos         if (errmsg)
    753  1.1  christos           break;
    754  1.1  christos         errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
    755  1.1  christos         if (errmsg)
    756  1.1  christos           break;
    757  1.1  christos       }
    758  1.1  christos       break;
    759  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
    760  1.1  christos       {
    761  1.1  christos {
    762  1.1  christos   FLD (f_sd) = ((FLD (f_sd6)) & (7));
    763  1.1  christos   FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
    764  1.1  christos }
    765  1.1  christos         errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
    766  1.1  christos         if (errmsg)
    767  1.1  christos           break;
    768  1.1  christos         errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
    769  1.1  christos         if (errmsg)
    770  1.1  christos           break;
    771  1.1  christos       }
    772  1.1  christos       break;
    773  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
    774  1.1  christos       errmsg = insert_normal (cd, fields->f_shift, 0, 0, 9, 5, 32, total_length, buffer);
    775  1.1  christos       break;
    776  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
    777  1.1  christos       {
    778  1.1  christos {
    779  1.1  christos   FLD (f_disp8) = ((255) & (((USI) (FLD (f_sdisp11)) >> (3))));
    780  1.1  christos   FLD (f_disp3) = ((FLD (f_sdisp11)) & (7));
    781  1.1  christos }
    782  1.1  christos         errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
    783  1.1  christos         if (errmsg)
    784  1.1  christos           break;
    785  1.1  christos         errmsg = insert_normal (cd, fields->f_disp8, 0, 0, 23, 8, 32, total_length, buffer);
    786  1.1  christos         if (errmsg)
    787  1.1  christos           break;
    788  1.1  christos       }
    789  1.1  christos       break;
    790  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
    791  1.1  christos       {
    792  1.1  christos         long value = fields->f_simm24;
    793  1.1  christos         value = ((SI) (((value) - (pc))) >> (1));
    794  1.1  christos         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 31, 24, 32, total_length, buffer);
    795  1.1  christos       }
    796  1.1  christos       break;
    797  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
    798  1.1  christos       errmsg = insert_normal (cd, fields->f_sdisp3, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 3, 32, total_length, buffer);
    799  1.1  christos       break;
    800  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
    801  1.1  christos       {
    802  1.1  christos         long value = fields->f_simm8;
    803  1.1  christos         value = ((SI) (((value) - (pc))) >> (1));
    804  1.1  christos         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 8, 32, total_length, buffer);
    805  1.1  christos       }
    806  1.1  christos       break;
    807  1.1  christos     case EPIPHANY_OPERAND_SN :
    808  1.1  christos       errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
    809  1.1  christos       break;
    810  1.1  christos     case EPIPHANY_OPERAND_SN6 :
    811  1.1  christos       {
    812  1.1  christos {
    813  1.1  christos   FLD (f_sn) = ((FLD (f_sn6)) & (7));
    814  1.1  christos   FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
    815  1.1  christos }
    816  1.1  christos         errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
    817  1.1  christos         if (errmsg)
    818  1.1  christos           break;
    819  1.1  christos         errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
    820  1.1  christos         if (errmsg)
    821  1.1  christos           break;
    822  1.1  christos       }
    823  1.1  christos       break;
    824  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
    825  1.1  christos       {
    826  1.1  christos {
    827  1.1  christos   FLD (f_sn) = ((FLD (f_sn6)) & (7));
    828  1.1  christos   FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
    829  1.1  christos }
    830  1.1  christos         errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
    831  1.1  christos         if (errmsg)
    832  1.1  christos           break;
    833  1.1  christos         errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
    834  1.1  christos         if (errmsg)
    835  1.1  christos           break;
    836  1.1  christos       }
    837  1.1  christos       break;
    838  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
    839  1.1  christos       {
    840  1.1  christos {
    841  1.1  christos   FLD (f_sn) = ((FLD (f_sn6)) & (7));
    842  1.1  christos   FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
    843  1.1  christos }
    844  1.1  christos         errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
    845  1.1  christos         if (errmsg)
    846  1.1  christos           break;
    847  1.1  christos         errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
    848  1.1  christos         if (errmsg)
    849  1.1  christos           break;
    850  1.1  christos       }
    851  1.1  christos       break;
    852  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
    853  1.1  christos       {
    854  1.1  christos {
    855  1.1  christos   FLD (f_sn) = ((FLD (f_sn6)) & (7));
    856  1.1  christos   FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
    857  1.1  christos }
    858  1.1  christos         errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
    859  1.1  christos         if (errmsg)
    860  1.1  christos           break;
    861  1.1  christos         errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
    862  1.1  christos         if (errmsg)
    863  1.1  christos           break;
    864  1.1  christos       }
    865  1.1  christos       break;
    866  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
    867  1.1  christos       errmsg = insert_normal (cd, fields->f_trap_num, 0, 0, 15, 6, 32, total_length, buffer);
    868  1.1  christos       break;
    869  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
    870  1.1  christos       errmsg = insert_normal (cd, fields->f_trap_num, 0, 0, 15, 6, 32, total_length, buffer);
    871  1.1  christos       break;
    872  1.1  christos 
    873  1.1  christos     default :
    874  1.1  christos       /* xgettext:c-format */
    875  1.1  christos       fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
    876  1.1  christos 	       opindex);
    877  1.1  christos       abort ();
    878  1.1  christos   }
    879  1.1  christos 
    880  1.1  christos   return errmsg;
    881  1.1  christos }
    882  1.1  christos 
    883  1.1  christos int epiphany_cgen_extract_operand
    884  1.1  christos   (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
    885  1.1  christos 
    886  1.1  christos /* Main entry point for operand extraction.
    887  1.1  christos    The result is <= 0 for error, >0 for success.
    888  1.1  christos    ??? Actual values aren't well defined right now.
    889  1.1  christos 
    890  1.1  christos    This function is basically just a big switch statement.  Earlier versions
    891  1.1  christos    used tables to look up the function to use, but
    892  1.1  christos    - if the table contains both assembler and disassembler functions then
    893  1.1  christos      the disassembler contains much of the assembler and vice-versa,
    894  1.1  christos    - there's a lot of inlining possibilities as things grow,
    895  1.1  christos    - using a switch statement avoids the function call overhead.
    896  1.1  christos 
    897  1.1  christos    This function could be moved into `print_insn_normal', but keeping it
    898  1.1  christos    separate makes clear the interface between `print_insn_normal' and each of
    899  1.1  christos    the handlers.  */
    900  1.1  christos 
    901  1.1  christos int
    902  1.1  christos epiphany_cgen_extract_operand (CGEN_CPU_DESC cd,
    903  1.1  christos 			     int opindex,
    904  1.1  christos 			     CGEN_EXTRACT_INFO *ex_info,
    905  1.1  christos 			     CGEN_INSN_INT insn_value,
    906  1.1  christos 			     CGEN_FIELDS * fields,
    907  1.1  christos 			     bfd_vma pc)
    908  1.1  christos {
    909  1.1  christos   /* Assume success (for those operands that are nops).  */
    910  1.1  christos   int length = 1;
    911  1.1  christos   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
    912  1.1  christos 
    913  1.1  christos   switch (opindex)
    914  1.1  christos     {
    915  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
    916  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 1, 32, total_length, pc, & fields->f_addsubx);
    917  1.1  christos       break;
    918  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
    919  1.1  christos       {
    920  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
    921  1.1  christos         if (length <= 0) break;
    922  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 8, 32, total_length, pc, & fields->f_disp8);
    923  1.1  christos         if (length <= 0) break;
    924  1.1  christos {
    925  1.1  christos   FLD (f_disp11) = ((((FLD (f_disp8)) << (3))) | (FLD (f_disp3)));
    926  1.1  christos }
    927  1.1  christos       }
    928  1.1  christos       break;
    929  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
    930  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
    931  1.1  christos       break;
    932  1.1  christos     case EPIPHANY_OPERAND_DPMI :
    933  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 1, 32, total_length, pc, & fields->f_subd);
    934  1.1  christos       break;
    935  1.1  christos     case EPIPHANY_OPERAND_FRD :
    936  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
    937  1.1  christos       break;
    938  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
    939  1.1  christos       {
    940  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_rd_x);
    941  1.1  christos         if (length <= 0) break;
    942  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
    943  1.1  christos         if (length <= 0) break;
    944  1.1  christos {
    945  1.1  christos   FLD (f_rd6) = ((((FLD (f_rd_x)) << (3))) | (FLD (f_rd)));
    946  1.1  christos }
    947  1.1  christos       }
    948  1.1  christos       break;
    949  1.1  christos     case EPIPHANY_OPERAND_FRM :
    950  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
    951  1.1  christos       break;
    952  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
    953  1.1  christos       {
    954  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_rm_x);
    955  1.1  christos         if (length <= 0) break;
    956  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
    957  1.1  christos         if (length <= 0) break;
    958  1.1  christos {
    959  1.1  christos   FLD (f_rm6) = ((((FLD (f_rm_x)) << (3))) | (FLD (f_rm)));
    960  1.1  christos }
    961  1.1  christos       }
    962  1.1  christos       break;
    963  1.1  christos     case EPIPHANY_OPERAND_FRN :
    964  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
    965  1.1  christos       break;
    966  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
    967  1.1  christos       {
    968  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_rn_x);
    969  1.1  christos         if (length <= 0) break;
    970  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
    971  1.1  christos         if (length <= 0) break;
    972  1.1  christos {
    973  1.1  christos   FLD (f_rn6) = ((((FLD (f_rn_x)) << (3))) | (FLD (f_rn)));
    974  1.1  christos }
    975  1.1  christos       }
    976  1.1  christos       break;
    977  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
    978  1.1  christos       {
    979  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 8, 32, total_length, pc, & fields->f_imm8);
    980  1.1  christos         if (length <= 0) break;
    981  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 8, 32, total_length, pc, & fields->f_imm_27_8);
    982  1.1  christos         if (length <= 0) break;
    983  1.1  christos {
    984  1.1  christos   FLD (f_imm16) = ((((FLD (f_imm_27_8)) << (8))) | (FLD (f_imm8)));
    985  1.1  christos }
    986  1.1  christos       }
    987  1.1  christos       break;
    988  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
    989  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 8, 32, total_length, pc, & fields->f_imm8);
    990  1.1  christos       break;
    991  1.1  christos     case EPIPHANY_OPERAND_RD :
    992  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
    993  1.1  christos       break;
    994  1.1  christos     case EPIPHANY_OPERAND_RD6 :
    995  1.1  christos       {
    996  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_rd_x);
    997  1.1  christos         if (length <= 0) break;
    998  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
    999  1.1  christos         if (length <= 0) break;
   1000  1.1  christos {
   1001  1.1  christos   FLD (f_rd6) = ((((FLD (f_rd_x)) << (3))) | (FLD (f_rd)));
   1002  1.1  christos }
   1003  1.1  christos       }
   1004  1.1  christos       break;
   1005  1.1  christos     case EPIPHANY_OPERAND_RM :
   1006  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
   1007  1.1  christos       break;
   1008  1.1  christos     case EPIPHANY_OPERAND_RM6 :
   1009  1.1  christos       {
   1010  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_rm_x);
   1011  1.1  christos         if (length <= 0) break;
   1012  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
   1013  1.1  christos         if (length <= 0) break;
   1014  1.1  christos {
   1015  1.1  christos   FLD (f_rm6) = ((((FLD (f_rm_x)) << (3))) | (FLD (f_rm)));
   1016  1.1  christos }
   1017  1.1  christos       }
   1018  1.1  christos       break;
   1019  1.1  christos     case EPIPHANY_OPERAND_RN :
   1020  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
   1021  1.1  christos       break;
   1022  1.1  christos     case EPIPHANY_OPERAND_RN6 :
   1023  1.1  christos       {
   1024  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_rn_x);
   1025  1.1  christos         if (length <= 0) break;
   1026  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
   1027  1.1  christos         if (length <= 0) break;
   1028  1.1  christos {
   1029  1.1  christos   FLD (f_rn6) = ((((FLD (f_rn_x)) << (3))) | (FLD (f_rn)));
   1030  1.1  christos }
   1031  1.1  christos       }
   1032  1.1  christos       break;
   1033  1.1  christos     case EPIPHANY_OPERAND_SD :
   1034  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
   1035  1.1  christos       break;
   1036  1.1  christos     case EPIPHANY_OPERAND_SD6 :
   1037  1.1  christos       {
   1038  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
   1039  1.1  christos         if (length <= 0) break;
   1040  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
   1041  1.1  christos         if (length <= 0) break;
   1042  1.1  christos {
   1043  1.1  christos   FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
   1044  1.1  christos }
   1045  1.1  christos       }
   1046  1.1  christos       break;
   1047  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
   1048  1.1  christos       {
   1049  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
   1050  1.1  christos         if (length <= 0) break;
   1051  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
   1052  1.1  christos         if (length <= 0) break;
   1053  1.1  christos {
   1054  1.1  christos   FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
   1055  1.1  christos }
   1056  1.1  christos       }
   1057  1.1  christos       break;
   1058  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
   1059  1.1  christos       {
   1060  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
   1061  1.1  christos         if (length <= 0) break;
   1062  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
   1063  1.1  christos         if (length <= 0) break;
   1064  1.1  christos {
   1065  1.1  christos   FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
   1066  1.1  christos }
   1067  1.1  christos       }
   1068  1.1  christos       break;
   1069  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
   1070  1.1  christos       {
   1071  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
   1072  1.1  christos         if (length <= 0) break;
   1073  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
   1074  1.1  christos         if (length <= 0) break;
   1075  1.1  christos {
   1076  1.1  christos   FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
   1077  1.1  christos }
   1078  1.1  christos       }
   1079  1.1  christos       break;
   1080  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
   1081  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & fields->f_shift);
   1082  1.1  christos       break;
   1083  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
   1084  1.1  christos       {
   1085  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
   1086  1.1  christos         if (length <= 0) break;
   1087  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 8, 32, total_length, pc, & fields->f_disp8);
   1088  1.1  christos         if (length <= 0) break;
   1089  1.1  christos {
   1090  1.1  christos   FLD (f_sdisp11) = ((SI) (((((((FLD (f_disp8)) << (3))) | (FLD (f_disp3)))) << (21))) >> (21));
   1091  1.1  christos }
   1092  1.1  christos       }
   1093  1.1  christos       break;
   1094  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
   1095  1.1  christos       {
   1096  1.1  christos         long value;
   1097  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 31, 24, 32, total_length, pc, & value);
   1098  1.1  christos         value = ((((value) << (1))) + (pc));
   1099  1.1  christos         fields->f_simm24 = value;
   1100  1.1  christos       }
   1101  1.1  christos       break;
   1102  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
   1103  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 3, 32, total_length, pc, & fields->f_sdisp3);
   1104  1.1  christos       break;
   1105  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
   1106  1.1  christos       {
   1107  1.1  christos         long value;
   1108  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 8, 32, total_length, pc, & value);
   1109  1.1  christos         value = ((((value) << (1))) + (pc));
   1110  1.1  christos         fields->f_simm8 = value;
   1111  1.1  christos       }
   1112  1.1  christos       break;
   1113  1.1  christos     case EPIPHANY_OPERAND_SN :
   1114  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
   1115  1.1  christos       break;
   1116  1.1  christos     case EPIPHANY_OPERAND_SN6 :
   1117  1.1  christos       {
   1118  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
   1119  1.1  christos         if (length <= 0) break;
   1120  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
   1121  1.1  christos         if (length <= 0) break;
   1122  1.1  christos {
   1123  1.1  christos   FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
   1124  1.1  christos }
   1125  1.1  christos       }
   1126  1.1  christos       break;
   1127  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
   1128  1.1  christos       {
   1129  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
   1130  1.1  christos         if (length <= 0) break;
   1131  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
   1132  1.1  christos         if (length <= 0) break;
   1133  1.1  christos {
   1134  1.1  christos   FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
   1135  1.1  christos }
   1136  1.1  christos       }
   1137  1.1  christos       break;
   1138  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
   1139  1.1  christos       {
   1140  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
   1141  1.1  christos         if (length <= 0) break;
   1142  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
   1143  1.1  christos         if (length <= 0) break;
   1144  1.1  christos {
   1145  1.1  christos   FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
   1146  1.1  christos }
   1147  1.1  christos       }
   1148  1.1  christos       break;
   1149  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
   1150  1.1  christos       {
   1151  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
   1152  1.1  christos         if (length <= 0) break;
   1153  1.1  christos         length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
   1154  1.1  christos         if (length <= 0) break;
   1155  1.1  christos {
   1156  1.1  christos   FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
   1157  1.1  christos }
   1158  1.1  christos       }
   1159  1.1  christos       break;
   1160  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
   1161  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_trap_num);
   1162  1.1  christos       break;
   1163  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
   1164  1.1  christos       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_trap_num);
   1165  1.1  christos       break;
   1166  1.1  christos 
   1167  1.1  christos     default :
   1168  1.1  christos       /* xgettext:c-format */
   1169  1.1  christos       fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
   1170  1.1  christos 	       opindex);
   1171  1.1  christos       abort ();
   1172  1.1  christos     }
   1173  1.1  christos 
   1174  1.1  christos   return length;
   1175  1.1  christos }
   1176  1.1  christos 
   1177  1.1  christos cgen_insert_fn * const epiphany_cgen_insert_handlers[] =
   1178  1.1  christos {
   1179  1.1  christos   insert_insn_normal,
   1180  1.1  christos };
   1181  1.1  christos 
   1182  1.1  christos cgen_extract_fn * const epiphany_cgen_extract_handlers[] =
   1183  1.1  christos {
   1184  1.1  christos   extract_insn_normal,
   1185  1.1  christos };
   1186  1.1  christos 
   1187  1.1  christos int epiphany_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
   1188  1.1  christos bfd_vma epiphany_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
   1189  1.1  christos 
   1190  1.1  christos /* Getting values from cgen_fields is handled by a collection of functions.
   1191  1.1  christos    They are distinguished by the type of the VALUE argument they return.
   1192  1.1  christos    TODO: floating point, inlining support, remove cases where result type
   1193  1.1  christos    not appropriate.  */
   1194  1.1  christos 
   1195  1.1  christos int
   1196  1.1  christos epiphany_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1197  1.1  christos 			     int opindex,
   1198  1.1  christos 			     const CGEN_FIELDS * fields)
   1199  1.1  christos {
   1200  1.1  christos   int value;
   1201  1.1  christos 
   1202  1.1  christos   switch (opindex)
   1203  1.1  christos     {
   1204  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
   1205  1.1  christos       value = fields->f_addsubx;
   1206  1.1  christos       break;
   1207  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
   1208  1.1  christos       value = fields->f_disp11;
   1209  1.1  christos       break;
   1210  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
   1211  1.1  christos       value = fields->f_disp3;
   1212  1.1  christos       break;
   1213  1.1  christos     case EPIPHANY_OPERAND_DPMI :
   1214  1.1  christos       value = fields->f_subd;
   1215  1.1  christos       break;
   1216  1.1  christos     case EPIPHANY_OPERAND_FRD :
   1217  1.1  christos       value = fields->f_rd;
   1218  1.1  christos       break;
   1219  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
   1220  1.1  christos       value = fields->f_rd6;
   1221  1.1  christos       break;
   1222  1.1  christos     case EPIPHANY_OPERAND_FRM :
   1223  1.1  christos       value = fields->f_rm;
   1224  1.1  christos       break;
   1225  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
   1226  1.1  christos       value = fields->f_rm6;
   1227  1.1  christos       break;
   1228  1.1  christos     case EPIPHANY_OPERAND_FRN :
   1229  1.1  christos       value = fields->f_rn;
   1230  1.1  christos       break;
   1231  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
   1232  1.1  christos       value = fields->f_rn6;
   1233  1.1  christos       break;
   1234  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
   1235  1.1  christos       value = fields->f_imm16;
   1236  1.1  christos       break;
   1237  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
   1238  1.1  christos       value = fields->f_imm8;
   1239  1.1  christos       break;
   1240  1.1  christos     case EPIPHANY_OPERAND_RD :
   1241  1.1  christos       value = fields->f_rd;
   1242  1.1  christos       break;
   1243  1.1  christos     case EPIPHANY_OPERAND_RD6 :
   1244  1.1  christos       value = fields->f_rd6;
   1245  1.1  christos       break;
   1246  1.1  christos     case EPIPHANY_OPERAND_RM :
   1247  1.1  christos       value = fields->f_rm;
   1248  1.1  christos       break;
   1249  1.1  christos     case EPIPHANY_OPERAND_RM6 :
   1250  1.1  christos       value = fields->f_rm6;
   1251  1.1  christos       break;
   1252  1.1  christos     case EPIPHANY_OPERAND_RN :
   1253  1.1  christos       value = fields->f_rn;
   1254  1.1  christos       break;
   1255  1.1  christos     case EPIPHANY_OPERAND_RN6 :
   1256  1.1  christos       value = fields->f_rn6;
   1257  1.1  christos       break;
   1258  1.1  christos     case EPIPHANY_OPERAND_SD :
   1259  1.1  christos       value = fields->f_sd;
   1260  1.1  christos       break;
   1261  1.1  christos     case EPIPHANY_OPERAND_SD6 :
   1262  1.1  christos       value = fields->f_sd6;
   1263  1.1  christos       break;
   1264  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
   1265  1.1  christos       value = fields->f_sd6;
   1266  1.1  christos       break;
   1267  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
   1268  1.1  christos       value = fields->f_sd6;
   1269  1.1  christos       break;
   1270  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
   1271  1.1  christos       value = fields->f_sd6;
   1272  1.1  christos       break;
   1273  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
   1274  1.1  christos       value = fields->f_shift;
   1275  1.1  christos       break;
   1276  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
   1277  1.1  christos       value = fields->f_sdisp11;
   1278  1.1  christos       break;
   1279  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
   1280  1.1  christos       value = fields->f_simm24;
   1281  1.1  christos       break;
   1282  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
   1283  1.1  christos       value = fields->f_sdisp3;
   1284  1.1  christos       break;
   1285  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
   1286  1.1  christos       value = fields->f_simm8;
   1287  1.1  christos       break;
   1288  1.1  christos     case EPIPHANY_OPERAND_SN :
   1289  1.1  christos       value = fields->f_sn;
   1290  1.1  christos       break;
   1291  1.1  christos     case EPIPHANY_OPERAND_SN6 :
   1292  1.1  christos       value = fields->f_sn6;
   1293  1.1  christos       break;
   1294  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
   1295  1.1  christos       value = fields->f_sn6;
   1296  1.1  christos       break;
   1297  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
   1298  1.1  christos       value = fields->f_sn6;
   1299  1.1  christos       break;
   1300  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
   1301  1.1  christos       value = fields->f_sn6;
   1302  1.1  christos       break;
   1303  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
   1304  1.1  christos       value = fields->f_trap_num;
   1305  1.1  christos       break;
   1306  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
   1307  1.1  christos       value = fields->f_trap_num;
   1308  1.1  christos       break;
   1309  1.1  christos 
   1310  1.1  christos     default :
   1311  1.1  christos       /* xgettext:c-format */
   1312  1.1  christos       fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
   1313  1.1  christos 		       opindex);
   1314  1.1  christos       abort ();
   1315  1.1  christos   }
   1316  1.1  christos 
   1317  1.1  christos   return value;
   1318  1.1  christos }
   1319  1.1  christos 
   1320  1.1  christos bfd_vma
   1321  1.1  christos epiphany_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1322  1.1  christos 			     int opindex,
   1323  1.1  christos 			     const CGEN_FIELDS * fields)
   1324  1.1  christos {
   1325  1.1  christos   bfd_vma value;
   1326  1.1  christos 
   1327  1.1  christos   switch (opindex)
   1328  1.1  christos     {
   1329  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
   1330  1.1  christos       value = fields->f_addsubx;
   1331  1.1  christos       break;
   1332  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
   1333  1.1  christos       value = fields->f_disp11;
   1334  1.1  christos       break;
   1335  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
   1336  1.1  christos       value = fields->f_disp3;
   1337  1.1  christos       break;
   1338  1.1  christos     case EPIPHANY_OPERAND_DPMI :
   1339  1.1  christos       value = fields->f_subd;
   1340  1.1  christos       break;
   1341  1.1  christos     case EPIPHANY_OPERAND_FRD :
   1342  1.1  christos       value = fields->f_rd;
   1343  1.1  christos       break;
   1344  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
   1345  1.1  christos       value = fields->f_rd6;
   1346  1.1  christos       break;
   1347  1.1  christos     case EPIPHANY_OPERAND_FRM :
   1348  1.1  christos       value = fields->f_rm;
   1349  1.1  christos       break;
   1350  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
   1351  1.1  christos       value = fields->f_rm6;
   1352  1.1  christos       break;
   1353  1.1  christos     case EPIPHANY_OPERAND_FRN :
   1354  1.1  christos       value = fields->f_rn;
   1355  1.1  christos       break;
   1356  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
   1357  1.1  christos       value = fields->f_rn6;
   1358  1.1  christos       break;
   1359  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
   1360  1.1  christos       value = fields->f_imm16;
   1361  1.1  christos       break;
   1362  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
   1363  1.1  christos       value = fields->f_imm8;
   1364  1.1  christos       break;
   1365  1.1  christos     case EPIPHANY_OPERAND_RD :
   1366  1.1  christos       value = fields->f_rd;
   1367  1.1  christos       break;
   1368  1.1  christos     case EPIPHANY_OPERAND_RD6 :
   1369  1.1  christos       value = fields->f_rd6;
   1370  1.1  christos       break;
   1371  1.1  christos     case EPIPHANY_OPERAND_RM :
   1372  1.1  christos       value = fields->f_rm;
   1373  1.1  christos       break;
   1374  1.1  christos     case EPIPHANY_OPERAND_RM6 :
   1375  1.1  christos       value = fields->f_rm6;
   1376  1.1  christos       break;
   1377  1.1  christos     case EPIPHANY_OPERAND_RN :
   1378  1.1  christos       value = fields->f_rn;
   1379  1.1  christos       break;
   1380  1.1  christos     case EPIPHANY_OPERAND_RN6 :
   1381  1.1  christos       value = fields->f_rn6;
   1382  1.1  christos       break;
   1383  1.1  christos     case EPIPHANY_OPERAND_SD :
   1384  1.1  christos       value = fields->f_sd;
   1385  1.1  christos       break;
   1386  1.1  christos     case EPIPHANY_OPERAND_SD6 :
   1387  1.1  christos       value = fields->f_sd6;
   1388  1.1  christos       break;
   1389  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
   1390  1.1  christos       value = fields->f_sd6;
   1391  1.1  christos       break;
   1392  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
   1393  1.1  christos       value = fields->f_sd6;
   1394  1.1  christos       break;
   1395  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
   1396  1.1  christos       value = fields->f_sd6;
   1397  1.1  christos       break;
   1398  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
   1399  1.1  christos       value = fields->f_shift;
   1400  1.1  christos       break;
   1401  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
   1402  1.1  christos       value = fields->f_sdisp11;
   1403  1.1  christos       break;
   1404  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
   1405  1.1  christos       value = fields->f_simm24;
   1406  1.1  christos       break;
   1407  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
   1408  1.1  christos       value = fields->f_sdisp3;
   1409  1.1  christos       break;
   1410  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
   1411  1.1  christos       value = fields->f_simm8;
   1412  1.1  christos       break;
   1413  1.1  christos     case EPIPHANY_OPERAND_SN :
   1414  1.1  christos       value = fields->f_sn;
   1415  1.1  christos       break;
   1416  1.1  christos     case EPIPHANY_OPERAND_SN6 :
   1417  1.1  christos       value = fields->f_sn6;
   1418  1.1  christos       break;
   1419  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
   1420  1.1  christos       value = fields->f_sn6;
   1421  1.1  christos       break;
   1422  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
   1423  1.1  christos       value = fields->f_sn6;
   1424  1.1  christos       break;
   1425  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
   1426  1.1  christos       value = fields->f_sn6;
   1427  1.1  christos       break;
   1428  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
   1429  1.1  christos       value = fields->f_trap_num;
   1430  1.1  christos       break;
   1431  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
   1432  1.1  christos       value = fields->f_trap_num;
   1433  1.1  christos       break;
   1434  1.1  christos 
   1435  1.1  christos     default :
   1436  1.1  christos       /* xgettext:c-format */
   1437  1.1  christos       fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
   1438  1.1  christos 		       opindex);
   1439  1.1  christos       abort ();
   1440  1.1  christos   }
   1441  1.1  christos 
   1442  1.1  christos   return value;
   1443  1.1  christos }
   1444  1.1  christos 
   1445  1.1  christos void epiphany_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
   1446  1.1  christos void epiphany_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
   1447  1.1  christos 
   1448  1.1  christos /* Stuffing values in cgen_fields is handled by a collection of functions.
   1449  1.1  christos    They are distinguished by the type of the VALUE argument they accept.
   1450  1.1  christos    TODO: floating point, inlining support, remove cases where argument type
   1451  1.1  christos    not appropriate.  */
   1452  1.1  christos 
   1453  1.1  christos void
   1454  1.1  christos epiphany_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1455  1.1  christos 			     int opindex,
   1456  1.1  christos 			     CGEN_FIELDS * fields,
   1457  1.1  christos 			     int value)
   1458  1.1  christos {
   1459  1.1  christos   switch (opindex)
   1460  1.1  christos     {
   1461  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
   1462  1.1  christos       fields->f_addsubx = value;
   1463  1.1  christos       break;
   1464  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
   1465  1.1  christos       fields->f_disp11 = value;
   1466  1.1  christos       break;
   1467  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
   1468  1.1  christos       fields->f_disp3 = value;
   1469  1.1  christos       break;
   1470  1.1  christos     case EPIPHANY_OPERAND_DPMI :
   1471  1.1  christos       fields->f_subd = value;
   1472  1.1  christos       break;
   1473  1.1  christos     case EPIPHANY_OPERAND_FRD :
   1474  1.1  christos       fields->f_rd = value;
   1475  1.1  christos       break;
   1476  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
   1477  1.1  christos       fields->f_rd6 = value;
   1478  1.1  christos       break;
   1479  1.1  christos     case EPIPHANY_OPERAND_FRM :
   1480  1.1  christos       fields->f_rm = value;
   1481  1.1  christos       break;
   1482  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
   1483  1.1  christos       fields->f_rm6 = value;
   1484  1.1  christos       break;
   1485  1.1  christos     case EPIPHANY_OPERAND_FRN :
   1486  1.1  christos       fields->f_rn = value;
   1487  1.1  christos       break;
   1488  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
   1489  1.1  christos       fields->f_rn6 = value;
   1490  1.1  christos       break;
   1491  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
   1492  1.1  christos       fields->f_imm16 = value;
   1493  1.1  christos       break;
   1494  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
   1495  1.1  christos       fields->f_imm8 = value;
   1496  1.1  christos       break;
   1497  1.1  christos     case EPIPHANY_OPERAND_RD :
   1498  1.1  christos       fields->f_rd = value;
   1499  1.1  christos       break;
   1500  1.1  christos     case EPIPHANY_OPERAND_RD6 :
   1501  1.1  christos       fields->f_rd6 = value;
   1502  1.1  christos       break;
   1503  1.1  christos     case EPIPHANY_OPERAND_RM :
   1504  1.1  christos       fields->f_rm = value;
   1505  1.1  christos       break;
   1506  1.1  christos     case EPIPHANY_OPERAND_RM6 :
   1507  1.1  christos       fields->f_rm6 = value;
   1508  1.1  christos       break;
   1509  1.1  christos     case EPIPHANY_OPERAND_RN :
   1510  1.1  christos       fields->f_rn = value;
   1511  1.1  christos       break;
   1512  1.1  christos     case EPIPHANY_OPERAND_RN6 :
   1513  1.1  christos       fields->f_rn6 = value;
   1514  1.1  christos       break;
   1515  1.1  christos     case EPIPHANY_OPERAND_SD :
   1516  1.1  christos       fields->f_sd = value;
   1517  1.1  christos       break;
   1518  1.1  christos     case EPIPHANY_OPERAND_SD6 :
   1519  1.1  christos       fields->f_sd6 = value;
   1520  1.1  christos       break;
   1521  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
   1522  1.1  christos       fields->f_sd6 = value;
   1523  1.1  christos       break;
   1524  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
   1525  1.1  christos       fields->f_sd6 = value;
   1526  1.1  christos       break;
   1527  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
   1528  1.1  christos       fields->f_sd6 = value;
   1529  1.1  christos       break;
   1530  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
   1531  1.1  christos       fields->f_shift = value;
   1532  1.1  christos       break;
   1533  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
   1534  1.1  christos       fields->f_sdisp11 = value;
   1535  1.1  christos       break;
   1536  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
   1537  1.1  christos       fields->f_simm24 = value;
   1538  1.1  christos       break;
   1539  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
   1540  1.1  christos       fields->f_sdisp3 = value;
   1541  1.1  christos       break;
   1542  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
   1543  1.1  christos       fields->f_simm8 = value;
   1544  1.1  christos       break;
   1545  1.1  christos     case EPIPHANY_OPERAND_SN :
   1546  1.1  christos       fields->f_sn = value;
   1547  1.1  christos       break;
   1548  1.1  christos     case EPIPHANY_OPERAND_SN6 :
   1549  1.1  christos       fields->f_sn6 = value;
   1550  1.1  christos       break;
   1551  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
   1552  1.1  christos       fields->f_sn6 = value;
   1553  1.1  christos       break;
   1554  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
   1555  1.1  christos       fields->f_sn6 = value;
   1556  1.1  christos       break;
   1557  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
   1558  1.1  christos       fields->f_sn6 = value;
   1559  1.1  christos       break;
   1560  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
   1561  1.1  christos       fields->f_trap_num = value;
   1562  1.1  christos       break;
   1563  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
   1564  1.1  christos       fields->f_trap_num = value;
   1565  1.1  christos       break;
   1566  1.1  christos 
   1567  1.1  christos     default :
   1568  1.1  christos       /* xgettext:c-format */
   1569  1.1  christos       fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
   1570  1.1  christos 		       opindex);
   1571  1.1  christos       abort ();
   1572  1.1  christos   }
   1573  1.1  christos }
   1574  1.1  christos 
   1575  1.1  christos void
   1576  1.1  christos epiphany_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1577  1.1  christos 			     int opindex,
   1578  1.1  christos 			     CGEN_FIELDS * fields,
   1579  1.1  christos 			     bfd_vma value)
   1580  1.1  christos {
   1581  1.1  christos   switch (opindex)
   1582  1.1  christos     {
   1583  1.1  christos     case EPIPHANY_OPERAND_DIRECTION :
   1584  1.1  christos       fields->f_addsubx = value;
   1585  1.1  christos       break;
   1586  1.1  christos     case EPIPHANY_OPERAND_DISP11 :
   1587  1.1  christos       fields->f_disp11 = value;
   1588  1.1  christos       break;
   1589  1.1  christos     case EPIPHANY_OPERAND_DISP3 :
   1590  1.1  christos       fields->f_disp3 = value;
   1591  1.1  christos       break;
   1592  1.1  christos     case EPIPHANY_OPERAND_DPMI :
   1593  1.1  christos       fields->f_subd = value;
   1594  1.1  christos       break;
   1595  1.1  christos     case EPIPHANY_OPERAND_FRD :
   1596  1.1  christos       fields->f_rd = value;
   1597  1.1  christos       break;
   1598  1.1  christos     case EPIPHANY_OPERAND_FRD6 :
   1599  1.1  christos       fields->f_rd6 = value;
   1600  1.1  christos       break;
   1601  1.1  christos     case EPIPHANY_OPERAND_FRM :
   1602  1.1  christos       fields->f_rm = value;
   1603  1.1  christos       break;
   1604  1.1  christos     case EPIPHANY_OPERAND_FRM6 :
   1605  1.1  christos       fields->f_rm6 = value;
   1606  1.1  christos       break;
   1607  1.1  christos     case EPIPHANY_OPERAND_FRN :
   1608  1.1  christos       fields->f_rn = value;
   1609  1.1  christos       break;
   1610  1.1  christos     case EPIPHANY_OPERAND_FRN6 :
   1611  1.1  christos       fields->f_rn6 = value;
   1612  1.1  christos       break;
   1613  1.1  christos     case EPIPHANY_OPERAND_IMM16 :
   1614  1.1  christos       fields->f_imm16 = value;
   1615  1.1  christos       break;
   1616  1.1  christos     case EPIPHANY_OPERAND_IMM8 :
   1617  1.1  christos       fields->f_imm8 = value;
   1618  1.1  christos       break;
   1619  1.1  christos     case EPIPHANY_OPERAND_RD :
   1620  1.1  christos       fields->f_rd = value;
   1621  1.1  christos       break;
   1622  1.1  christos     case EPIPHANY_OPERAND_RD6 :
   1623  1.1  christos       fields->f_rd6 = value;
   1624  1.1  christos       break;
   1625  1.1  christos     case EPIPHANY_OPERAND_RM :
   1626  1.1  christos       fields->f_rm = value;
   1627  1.1  christos       break;
   1628  1.1  christos     case EPIPHANY_OPERAND_RM6 :
   1629  1.1  christos       fields->f_rm6 = value;
   1630  1.1  christos       break;
   1631  1.1  christos     case EPIPHANY_OPERAND_RN :
   1632  1.1  christos       fields->f_rn = value;
   1633  1.1  christos       break;
   1634  1.1  christos     case EPIPHANY_OPERAND_RN6 :
   1635  1.1  christos       fields->f_rn6 = value;
   1636  1.1  christos       break;
   1637  1.1  christos     case EPIPHANY_OPERAND_SD :
   1638  1.1  christos       fields->f_sd = value;
   1639  1.1  christos       break;
   1640  1.1  christos     case EPIPHANY_OPERAND_SD6 :
   1641  1.1  christos       fields->f_sd6 = value;
   1642  1.1  christos       break;
   1643  1.1  christos     case EPIPHANY_OPERAND_SDDMA :
   1644  1.1  christos       fields->f_sd6 = value;
   1645  1.1  christos       break;
   1646  1.1  christos     case EPIPHANY_OPERAND_SDMEM :
   1647  1.1  christos       fields->f_sd6 = value;
   1648  1.1  christos       break;
   1649  1.1  christos     case EPIPHANY_OPERAND_SDMESH :
   1650  1.1  christos       fields->f_sd6 = value;
   1651  1.1  christos       break;
   1652  1.1  christos     case EPIPHANY_OPERAND_SHIFT :
   1653  1.1  christos       fields->f_shift = value;
   1654  1.1  christos       break;
   1655  1.1  christos     case EPIPHANY_OPERAND_SIMM11 :
   1656  1.1  christos       fields->f_sdisp11 = value;
   1657  1.1  christos       break;
   1658  1.1  christos     case EPIPHANY_OPERAND_SIMM24 :
   1659  1.1  christos       fields->f_simm24 = value;
   1660  1.1  christos       break;
   1661  1.1  christos     case EPIPHANY_OPERAND_SIMM3 :
   1662  1.1  christos       fields->f_sdisp3 = value;
   1663  1.1  christos       break;
   1664  1.1  christos     case EPIPHANY_OPERAND_SIMM8 :
   1665  1.1  christos       fields->f_simm8 = value;
   1666  1.1  christos       break;
   1667  1.1  christos     case EPIPHANY_OPERAND_SN :
   1668  1.1  christos       fields->f_sn = value;
   1669  1.1  christos       break;
   1670  1.1  christos     case EPIPHANY_OPERAND_SN6 :
   1671  1.1  christos       fields->f_sn6 = value;
   1672  1.1  christos       break;
   1673  1.1  christos     case EPIPHANY_OPERAND_SNDMA :
   1674  1.1  christos       fields->f_sn6 = value;
   1675  1.1  christos       break;
   1676  1.1  christos     case EPIPHANY_OPERAND_SNMEM :
   1677  1.1  christos       fields->f_sn6 = value;
   1678  1.1  christos       break;
   1679  1.1  christos     case EPIPHANY_OPERAND_SNMESH :
   1680  1.1  christos       fields->f_sn6 = value;
   1681  1.1  christos       break;
   1682  1.1  christos     case EPIPHANY_OPERAND_SWI_NUM :
   1683  1.1  christos       fields->f_trap_num = value;
   1684  1.1  christos       break;
   1685  1.1  christos     case EPIPHANY_OPERAND_TRAPNUM6 :
   1686  1.1  christos       fields->f_trap_num = value;
   1687  1.1  christos       break;
   1688  1.1  christos 
   1689  1.1  christos     default :
   1690  1.1  christos       /* xgettext:c-format */
   1691  1.1  christos       fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
   1692  1.1  christos 		       opindex);
   1693  1.1  christos       abort ();
   1694  1.1  christos   }
   1695  1.1  christos }
   1696  1.1  christos 
   1697  1.1  christos /* Function to call before using the instruction builder tables.  */
   1698  1.1  christos 
   1699  1.1  christos void
   1700  1.1  christos epiphany_cgen_init_ibld_table (CGEN_CPU_DESC cd)
   1701  1.1  christos {
   1702  1.1  christos   cd->insert_handlers = & epiphany_cgen_insert_handlers[0];
   1703  1.1  christos   cd->extract_handlers = & epiphany_cgen_extract_handlers[0];
   1704  1.1  christos 
   1705  1.1  christos   cd->insert_operand = epiphany_cgen_insert_operand;
   1706  1.1  christos   cd->extract_operand = epiphany_cgen_extract_operand;
   1707  1.1  christos 
   1708  1.1  christos   cd->get_int_operand = epiphany_cgen_get_int_operand;
   1709  1.1  christos   cd->set_int_operand = epiphany_cgen_set_int_operand;
   1710                  cd->get_vma_operand = epiphany_cgen_get_vma_operand;
   1711                  cd->set_vma_operand = epiphany_cgen_set_vma_operand;
   1712                }
   1713