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