Home | History | Annotate | Line # | Download | only in opcodes
      1 /* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
      2 /* Instruction building/extraction support for frv. -*- C -*-
      3 
      4    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
      5    - the resultant file is machine generated, cgen-ibld.in isn't
      6 
      7    Copyright (C) 1996-2025 Free Software Foundation, Inc.
      8 
      9    This file is part of libopcodes.
     10 
     11    This library is free software; you can redistribute it and/or modify
     12    it under the terms of the GNU General Public License as published by
     13    the Free Software Foundation; either version 3, or (at your option)
     14    any later version.
     15 
     16    It is distributed in the hope that it will be useful, but WITHOUT
     17    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     18    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     19    License for more details.
     20 
     21    You should have received a copy of the GNU General Public License
     22    along with this program; if not, write to the Free Software Foundation, Inc.,
     23    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
     24 
     25 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
     26    Keep that in mind.  */
     27 
     28 #include "sysdep.h"
     29 #include <stdio.h>
     30 #include "ansidecl.h"
     31 #include "dis-asm.h"
     32 #include "bfd.h"
     33 #include "symcat.h"
     34 #include "frv-desc.h"
     35 #include "frv-opc.h"
     36 #include "cgen/basic-modes.h"
     37 #include "opintl.h"
     38 #include "safe-ctype.h"
     39 
     40 #undef  min
     41 #define min(a,b) ((a) < (b) ? (a) : (b))
     42 #undef  max
     43 #define max(a,b) ((a) > (b) ? (a) : (b))
     44 
     45 /* Used by the ifield rtx function.  */
     46 #define FLD(f) (fields->f)
     47 
     48 static const char * insert_normal
     49   (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
     50    unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
     51 static const char * insert_insn_normal
     52   (CGEN_CPU_DESC, const CGEN_INSN *,
     53    CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
     54 static int extract_normal
     55   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
     56    unsigned int, unsigned int, unsigned int, unsigned int,
     57    unsigned int, unsigned int, bfd_vma, long *);
     58 static int extract_insn_normal
     59   (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
     60    CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
     61 #if CGEN_INT_INSN_P
     62 static void put_insn_int_value
     63   (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
     64 #endif
     65 #if ! CGEN_INT_INSN_P
     66 static CGEN_INLINE void insert_1
     67   (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
     68 static CGEN_INLINE int fill_cache
     69   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
     70 static CGEN_INLINE long extract_1
     71   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
     72 #endif
     73 
     74 /* Operand insertion.  */
     76 
     77 #if ! CGEN_INT_INSN_P
     78 
     79 /* Subroutine of insert_normal.  */
     80 
     81 static CGEN_INLINE void
     82 insert_1 (CGEN_CPU_DESC cd,
     83 	  unsigned long value,
     84 	  int start,
     85 	  int length,
     86 	  int word_length,
     87 	  unsigned char *bufp)
     88 {
     89   unsigned long x, mask;
     90   int shift;
     91 
     92   x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);
     93 
     94   /* Written this way to avoid undefined behaviour.  */
     95   mask = (1UL << (length - 1) << 1) - 1;
     96   if (CGEN_INSN_LSB0_P)
     97     shift = (start + 1) - length;
     98   else
     99     shift = (word_length - (start + length));
    100   x = (x & ~(mask << shift)) | ((value & mask) << shift);
    101 
    102   cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x, cd->endian);
    103 }
    104 
    105 #endif /* ! CGEN_INT_INSN_P */
    106 
    107 /* Default insertion routine.
    108 
    109    ATTRS is a mask of the boolean attributes.
    110    WORD_OFFSET is the offset in bits from the start of the insn of the value.
    111    WORD_LENGTH is the length of the word in bits in which the value resides.
    112    START is the starting bit number in the word, architecture origin.
    113    LENGTH is the length of VALUE in bits.
    114    TOTAL_LENGTH is the total length of the insn in bits.
    115 
    116    The result is an error message or NULL if success.  */
    117 
    118 /* ??? This duplicates functionality with bfd's howto table and
    119    bfd_install_relocation.  */
    120 /* ??? This doesn't handle bfd_vma's.  Create another function when
    121    necessary.  */
    122 
    123 static const char *
    124 insert_normal (CGEN_CPU_DESC cd,
    125 	       long value,
    126 	       unsigned int attrs,
    127 	       unsigned int word_offset,
    128 	       unsigned int start,
    129 	       unsigned int length,
    130 	       unsigned int word_length,
    131 	       unsigned int total_length,
    132 	       CGEN_INSN_BYTES_PTR buffer)
    133 {
    134   static char errbuf[100];
    135   unsigned long mask;
    136 
    137   /* If LENGTH is zero, this operand doesn't contribute to the value.  */
    138   if (length == 0)
    139     return NULL;
    140 
    141   /* Written this way to avoid undefined behaviour.  */
    142   mask = (1UL << (length - 1) << 1) - 1;
    143 
    144   if (word_length > 8 * sizeof (CGEN_INSN_INT))
    145     abort ();
    146 
    147   /* For architectures with insns smaller than the base-insn-bitsize,
    148      word_length may be too big.  */
    149   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    150     {
    151       if (word_offset == 0
    152 	  && word_length > total_length)
    153 	word_length = total_length;
    154     }
    155 
    156   /* Ensure VALUE will fit.  */
    157   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
    158     {
    159       long minval = - (1UL << (length - 1));
    160       unsigned long maxval = mask;
    161 
    162       if ((value > 0 && (unsigned long) value > maxval)
    163 	  || value < minval)
    164 	{
    165 	  /* xgettext:c-format */
    166 	  sprintf (errbuf,
    167 		   _("operand out of range (%ld not between %ld and %lu)"),
    168 		   value, minval, maxval);
    169 	  return errbuf;
    170 	}
    171     }
    172   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
    173     {
    174       unsigned long maxval = mask;
    175       unsigned long val = (unsigned long) value;
    176 
    177       /* For hosts with a word size > 32 check to see if value has been sign
    178 	 extended beyond 32 bits.  If so then ignore these higher sign bits
    179 	 as the user is attempting to store a 32-bit signed value into an
    180 	 unsigned 32-bit field which is allowed.  */
    181       if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
    182 	val &= 0xFFFFFFFF;
    183 
    184       if (val > maxval)
    185 	{
    186 	  /* xgettext:c-format */
    187 	  sprintf (errbuf,
    188 		   _("operand out of range (0x%lx not between 0 and 0x%lx)"),
    189 		   val, maxval);
    190 	  return errbuf;
    191 	}
    192     }
    193   else
    194     {
    195       if (! cgen_signed_overflow_ok_p (cd))
    196 	{
    197 	  long minval = - (1UL << (length - 1));
    198 	  long maxval =   (1UL << (length - 1)) - 1;
    199 
    200 	  if (value < minval || value > maxval)
    201 	    {
    202 	      sprintf
    203 		/* xgettext:c-format */
    204 		(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
    205 		 value, minval, maxval);
    206 	      return errbuf;
    207 	    }
    208 	}
    209     }
    210 
    211 #if CGEN_INT_INSN_P
    212 
    213   {
    214     int shift_within_word, shift_to_word, shift;
    215 
    216     /* How to shift the value to BIT0 of the word.  */
    217     shift_to_word = total_length - (word_offset + word_length);
    218 
    219     /* How to shift the value to the field within the word.  */
    220     if (CGEN_INSN_LSB0_P)
    221       shift_within_word = start + 1 - length;
    222     else
    223       shift_within_word = word_length - start - length;
    224 
    225     /* The total SHIFT, then mask in the value.  */
    226     shift = shift_to_word + shift_within_word;
    227     *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
    228   }
    229 
    230 #else /* ! CGEN_INT_INSN_P */
    231 
    232   {
    233     unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
    234 
    235     insert_1 (cd, value, start, length, word_length, bufp);
    236   }
    237 
    238 #endif /* ! CGEN_INT_INSN_P */
    239 
    240   return NULL;
    241 }
    242 
    243 /* Default insn builder (insert handler).
    244    The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
    245    that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
    246    recorded in host byte order, otherwise BUFFER is an array of bytes
    247    and the value is recorded in target byte order).
    248    The result is an error message or NULL if success.  */
    249 
    250 static const char *
    251 insert_insn_normal (CGEN_CPU_DESC cd,
    252 		    const CGEN_INSN * insn,
    253 		    CGEN_FIELDS * fields,
    254 		    CGEN_INSN_BYTES_PTR buffer,
    255 		    bfd_vma pc)
    256 {
    257   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
    258   unsigned long value;
    259   const CGEN_SYNTAX_CHAR_TYPE * syn;
    260 
    261   CGEN_INIT_INSERT (cd);
    262   value = CGEN_INSN_BASE_VALUE (insn);
    263 
    264   /* If we're recording insns as numbers (rather than a string of bytes),
    265      target byte order handling is deferred until later.  */
    266 
    267 #if CGEN_INT_INSN_P
    268 
    269   put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
    270 		      CGEN_FIELDS_BITSIZE (fields), value);
    271 
    272 #else
    273 
    274   cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
    275                                         (unsigned) CGEN_FIELDS_BITSIZE (fields)),
    276 		       value, cd->insn_endian);
    277 
    278 #endif /* ! CGEN_INT_INSN_P */
    279 
    280   /* ??? It would be better to scan the format's fields.
    281      Still need to be able to insert a value based on the operand though;
    282      e.g. storing a branch displacement that got resolved later.
    283      Needs more thought first.  */
    284 
    285   for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
    286     {
    287       const char *errmsg;
    288 
    289       if (CGEN_SYNTAX_CHAR_P (* syn))
    290 	continue;
    291 
    292       errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
    293 				       fields, buffer, pc);
    294       if (errmsg)
    295 	return errmsg;
    296     }
    297 
    298   return NULL;
    299 }
    300 
    301 #if CGEN_INT_INSN_P
    302 /* Cover function to store an insn value into an integral insn.  Must go here
    303    because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */
    304 
    305 static void
    306 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
    307 		    CGEN_INSN_BYTES_PTR buf,
    308 		    int length,
    309 		    int insn_length,
    310 		    CGEN_INSN_INT value)
    311 {
    312   /* For architectures with insns smaller than the base-insn-bitsize,
    313      length may be too big.  */
    314   if (length > insn_length)
    315     *buf = value;
    316   else
    317     {
    318       int shift = insn_length - length;
    319       /* Written this way to avoid undefined behaviour.  */
    320       CGEN_INSN_INT mask = length == 0 ? 0 : (1UL << (length - 1) << 1) - 1;
    321 
    322       *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
    323     }
    324 }
    325 #endif
    326 
    327 /* Operand extraction.  */
    329 
    330 #if ! CGEN_INT_INSN_P
    331 
    332 /* Subroutine of extract_normal.
    333    Ensure sufficient bytes are cached in EX_INFO.
    334    OFFSET is the offset in bytes from the start of the insn of the value.
    335    BYTES is the length of the needed value.
    336    Returns 1 for success, 0 for failure.  */
    337 
    338 static CGEN_INLINE int
    339 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
    340 	    CGEN_EXTRACT_INFO *ex_info,
    341 	    int offset,
    342 	    int bytes,
    343 	    bfd_vma pc)
    344 {
    345   /* It's doubtful that the middle part has already been fetched so
    346      we don't optimize that case.  kiss.  */
    347   unsigned int mask;
    348   disassemble_info *info = (disassemble_info *) ex_info->dis_info;
    349 
    350   /* First do a quick check.  */
    351   mask = (1 << bytes) - 1;
    352   if (((ex_info->valid >> offset) & mask) == mask)
    353     return 1;
    354 
    355   /* Search for the first byte we need to read.  */
    356   for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
    357     if (! (mask & ex_info->valid))
    358       break;
    359 
    360   if (bytes)
    361     {
    362       int status;
    363 
    364       pc += offset;
    365       status = (*info->read_memory_func)
    366 	(pc, ex_info->insn_bytes + offset, bytes, info);
    367 
    368       if (status != 0)
    369 	{
    370 	  (*info->memory_error_func) (status, pc, info);
    371 	  return 0;
    372 	}
    373 
    374       ex_info->valid |= ((1 << bytes) - 1) << offset;
    375     }
    376 
    377   return 1;
    378 }
    379 
    380 /* Subroutine of extract_normal.  */
    381 
    382 static CGEN_INLINE long
    383 extract_1 (CGEN_CPU_DESC cd,
    384 	   CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
    385 	   int start,
    386 	   int length,
    387 	   int word_length,
    388 	   unsigned char *bufp,
    389 	   bfd_vma pc ATTRIBUTE_UNUSED)
    390 {
    391   unsigned long x;
    392   int shift;
    393 
    394   x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);
    395 
    396   if (CGEN_INSN_LSB0_P)
    397     shift = (start + 1) - length;
    398   else
    399     shift = (word_length - (start + length));
    400   return x >> shift;
    401 }
    402 
    403 #endif /* ! CGEN_INT_INSN_P */
    404 
    405 /* Default extraction routine.
    406 
    407    INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
    408    or sometimes less for cases like the m32r where the base insn size is 32
    409    but some insns are 16 bits.
    410    ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
    411    but for generality we take a bitmask of all of them.
    412    WORD_OFFSET is the offset in bits from the start of the insn of the value.
    413    WORD_LENGTH is the length of the word in bits in which the value resides.
    414    START is the starting bit number in the word, architecture origin.
    415    LENGTH is the length of VALUE in bits.
    416    TOTAL_LENGTH is the total length of the insn in bits.
    417 
    418    Returns 1 for success, 0 for failure.  */
    419 
    420 /* ??? The return code isn't properly used.  wip.  */
    421 
    422 /* ??? This doesn't handle bfd_vma's.  Create another function when
    423    necessary.  */
    424 
    425 static int
    426 extract_normal (CGEN_CPU_DESC cd,
    427 #if ! CGEN_INT_INSN_P
    428 		CGEN_EXTRACT_INFO *ex_info,
    429 #else
    430 		CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
    431 #endif
    432 		CGEN_INSN_INT insn_value,
    433 		unsigned int attrs,
    434 		unsigned int word_offset,
    435 		unsigned int start,
    436 		unsigned int length,
    437 		unsigned int word_length,
    438 		unsigned int total_length,
    439 #if ! CGEN_INT_INSN_P
    440 		bfd_vma pc,
    441 #else
    442 		bfd_vma pc ATTRIBUTE_UNUSED,
    443 #endif
    444 		long *valuep)
    445 {
    446   long value, mask;
    447 
    448   /* If LENGTH is zero, this operand doesn't contribute to the value
    449      so give it a standard value of zero.  */
    450   if (length == 0)
    451     {
    452       *valuep = 0;
    453       return 1;
    454     }
    455 
    456   if (word_length > 8 * sizeof (CGEN_INSN_INT))
    457     abort ();
    458 
    459   /* For architectures with insns smaller than the insn-base-bitsize,
    460      word_length may be too big.  */
    461   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    462     {
    463       if (word_offset + word_length > total_length)
    464 	word_length = total_length - word_offset;
    465     }
    466 
    467   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
    468 
    469   if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
    470     {
    471       if (CGEN_INSN_LSB0_P)
    472 	value = insn_value >> ((word_offset + start + 1) - length);
    473       else
    474 	value = insn_value >> (total_length - ( word_offset + start + length));
    475     }
    476 
    477 #if ! CGEN_INT_INSN_P
    478 
    479   else
    480     {
    481       unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
    482 
    483       if (word_length > 8 * sizeof (CGEN_INSN_INT))
    484 	abort ();
    485 
    486       if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
    487 	{
    488 	  *valuep = 0;
    489 	  return 0;
    490 	}
    491 
    492       value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
    493     }
    494 
    495 #endif /* ! CGEN_INT_INSN_P */
    496 
    497   /* Written this way to avoid undefined behaviour.  */
    498   mask = (1UL << (length - 1) << 1) - 1;
    499 
    500   value &= mask;
    501   /* sign extend? */
    502   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
    503       && (value & (1UL << (length - 1))))
    504     value |= ~mask;
    505 
    506   *valuep = value;
    507 
    508   return 1;
    509 }
    510 
    511 /* Default insn extractor.
    512 
    513    INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
    514    The extracted fields are stored in FIELDS.
    515    EX_INFO is used to handle reading variable length insns.
    516    Return the length of the insn in bits, or 0 if no match,
    517    or -1 if an error occurs fetching data (memory_error_func will have
    518    been called).  */
    519 
    520 static int
    521 extract_insn_normal (CGEN_CPU_DESC cd,
    522 		     const CGEN_INSN *insn,
    523 		     CGEN_EXTRACT_INFO *ex_info,
    524 		     CGEN_INSN_INT insn_value,
    525 		     CGEN_FIELDS *fields,
    526 		     bfd_vma pc)
    527 {
    528   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
    529   const CGEN_SYNTAX_CHAR_TYPE *syn;
    530 
    531   CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
    532 
    533   CGEN_INIT_EXTRACT (cd);
    534 
    535   for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
    536     {
    537       int length;
    538 
    539       if (CGEN_SYNTAX_CHAR_P (*syn))
    540 	continue;
    541 
    542       length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
    543 					ex_info, insn_value, fields, pc);
    544       if (length <= 0)
    545 	return length;
    546     }
    547 
    548   /* We recognized and successfully extracted this insn.  */
    549   return CGEN_INSN_BITSIZE (insn);
    550 }
    551 
    552 /* Machine generated code added here.  */
    554 
    555 const char * frv_cgen_insert_operand
    556   (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
    557 
    558 /* Main entry point for operand insertion.
    559 
    560    This function is basically just a big switch statement.  Earlier versions
    561    used tables to look up the function to use, but
    562    - if the table contains both assembler and disassembler functions then
    563      the disassembler contains much of the assembler and vice-versa,
    564    - there's a lot of inlining possibilities as things grow,
    565    - using a switch statement avoids the function call overhead.
    566 
    567    This function could be moved into `parse_insn_normal', but keeping it
    568    separate makes clear the interface between `parse_insn_normal' and each of
    569    the handlers.  It's also needed by GAS to insert operands that couldn't be
    570    resolved during parsing.  */
    571 
    572 const char *
    573 frv_cgen_insert_operand (CGEN_CPU_DESC cd,
    574 			     int opindex,
    575 			     CGEN_FIELDS * fields,
    576 			     CGEN_INSN_BYTES_PTR buffer,
    577 			     bfd_vma pc ATTRIBUTE_UNUSED)
    578 {
    579   const char * errmsg = NULL;
    580   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
    581 
    582   switch (opindex)
    583     {
    584     case FRV_OPERAND_A0 :
    585       errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
    586       break;
    587     case FRV_OPERAND_A1 :
    588       errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
    589       break;
    590     case FRV_OPERAND_ACC40SI :
    591       errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer);
    592       break;
    593     case FRV_OPERAND_ACC40SK :
    594       errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer);
    595       break;
    596     case FRV_OPERAND_ACC40UI :
    597       errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer);
    598       break;
    599     case FRV_OPERAND_ACC40UK :
    600       errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer);
    601       break;
    602     case FRV_OPERAND_ACCGI :
    603       errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer);
    604       break;
    605     case FRV_OPERAND_ACCGK :
    606       errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer);
    607       break;
    608     case FRV_OPERAND_CCI :
    609       errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer);
    610       break;
    611     case FRV_OPERAND_CPRDOUBLEK :
    612       errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
    613       break;
    614     case FRV_OPERAND_CPRI :
    615       errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer);
    616       break;
    617     case FRV_OPERAND_CPRJ :
    618       errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer);
    619       break;
    620     case FRV_OPERAND_CPRK :
    621       errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
    622       break;
    623     case FRV_OPERAND_CRI :
    624       errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer);
    625       break;
    626     case FRV_OPERAND_CRJ :
    627       errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer);
    628       break;
    629     case FRV_OPERAND_CRJ_FLOAT :
    630       errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer);
    631       break;
    632     case FRV_OPERAND_CRJ_INT :
    633       {
    634         long value = fields->f_CRj_int;
    635         value = ((value) - (4));
    636         errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer);
    637       }
    638       break;
    639     case FRV_OPERAND_CRK :
    640       errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer);
    641       break;
    642     case FRV_OPERAND_FCCI_1 :
    643       errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer);
    644       break;
    645     case FRV_OPERAND_FCCI_2 :
    646       errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer);
    647       break;
    648     case FRV_OPERAND_FCCI_3 :
    649       errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer);
    650       break;
    651     case FRV_OPERAND_FCCK :
    652       errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer);
    653       break;
    654     case FRV_OPERAND_FRDOUBLEI :
    655       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
    656       break;
    657     case FRV_OPERAND_FRDOUBLEJ :
    658       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
    659       break;
    660     case FRV_OPERAND_FRDOUBLEK :
    661       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    662       break;
    663     case FRV_OPERAND_FRI :
    664       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
    665       break;
    666     case FRV_OPERAND_FRINTI :
    667       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
    668       break;
    669     case FRV_OPERAND_FRINTIEVEN :
    670       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
    671       break;
    672     case FRV_OPERAND_FRINTJ :
    673       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
    674       break;
    675     case FRV_OPERAND_FRINTJEVEN :
    676       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
    677       break;
    678     case FRV_OPERAND_FRINTK :
    679       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    680       break;
    681     case FRV_OPERAND_FRINTKEVEN :
    682       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    683       break;
    684     case FRV_OPERAND_FRJ :
    685       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
    686       break;
    687     case FRV_OPERAND_FRK :
    688       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    689       break;
    690     case FRV_OPERAND_FRKHI :
    691       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    692       break;
    693     case FRV_OPERAND_FRKLO :
    694       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
    695       break;
    696     case FRV_OPERAND_GRDOUBLEK :
    697       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
    698       break;
    699     case FRV_OPERAND_GRI :
    700       errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer);
    701       break;
    702     case FRV_OPERAND_GRJ :
    703       errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer);
    704       break;
    705     case FRV_OPERAND_GRK :
    706       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
    707       break;
    708     case FRV_OPERAND_GRKHI :
    709       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
    710       break;
    711     case FRV_OPERAND_GRKLO :
    712       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
    713       break;
    714     case FRV_OPERAND_ICCI_1 :
    715       errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer);
    716       break;
    717     case FRV_OPERAND_ICCI_2 :
    718       errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer);
    719       break;
    720     case FRV_OPERAND_ICCI_3 :
    721       errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer);
    722       break;
    723     case FRV_OPERAND_LI :
    724       errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer);
    725       break;
    726     case FRV_OPERAND_LRAD :
    727       errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer);
    728       break;
    729     case FRV_OPERAND_LRAE :
    730       errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer);
    731       break;
    732     case FRV_OPERAND_LRAS :
    733       errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer);
    734       break;
    735     case FRV_OPERAND_TLBPRL :
    736       errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer);
    737       break;
    738     case FRV_OPERAND_TLBPROPX :
    739       errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer);
    740       break;
    741     case FRV_OPERAND_AE :
    742       errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
    743       break;
    744     case FRV_OPERAND_CALLANN :
    745       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
    746       break;
    747     case FRV_OPERAND_CCOND :
    748       errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
    749       break;
    750     case FRV_OPERAND_COND :
    751       errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer);
    752       break;
    753     case FRV_OPERAND_D12 :
    754       errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
    755       break;
    756     case FRV_OPERAND_DEBUG :
    757       errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer);
    758       break;
    759     case FRV_OPERAND_EIR :
    760       errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer);
    761       break;
    762     case FRV_OPERAND_HINT :
    763       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
    764       break;
    765     case FRV_OPERAND_HINT_NOT_TAKEN :
    766       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
    767       break;
    768     case FRV_OPERAND_HINT_TAKEN :
    769       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
    770       break;
    771     case FRV_OPERAND_LABEL16 :
    772       {
    773         long value = fields->f_label16;
    774         value = ((SI) (((value) - (pc))) >> (2));
    775         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer);
    776       }
    777       break;
    778     case FRV_OPERAND_LABEL24 :
    779       {
    780 {
    781   FLD (f_labelH6) = ((SI) (((FLD (f_label24)) - (pc))) >> (20));
    782   FLD (f_labelL18) = ((((UINT) (((FLD (f_label24)) - (pc))) >> (2))) & (262143));
    783 }
    784         errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer);
    785         if (errmsg)
    786           break;
    787         errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer);
    788         if (errmsg)
    789           break;
    790       }
    791       break;
    792     case FRV_OPERAND_LDANN :
    793       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
    794       break;
    795     case FRV_OPERAND_LDDANN :
    796       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
    797       break;
    798     case FRV_OPERAND_LOCK :
    799       errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
    800       break;
    801     case FRV_OPERAND_PACK :
    802       errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer);
    803       break;
    804     case FRV_OPERAND_S10 :
    805       errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer);
    806       break;
    807     case FRV_OPERAND_S12 :
    808       errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
    809       break;
    810     case FRV_OPERAND_S16 :
    811       errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
    812       break;
    813     case FRV_OPERAND_S5 :
    814       errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer);
    815       break;
    816     case FRV_OPERAND_S6 :
    817       errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer);
    818       break;
    819     case FRV_OPERAND_S6_1 :
    820       errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer);
    821       break;
    822     case FRV_OPERAND_SLO16 :
    823       errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
    824       break;
    825     case FRV_OPERAND_SPR :
    826       {
    827 {
    828   FLD (f_spr_h) = ((UINT) (FLD (f_spr)) >> (6));
    829   FLD (f_spr_l) = ((FLD (f_spr)) & (63));
    830 }
    831         errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer);
    832         if (errmsg)
    833           break;
    834         errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer);
    835         if (errmsg)
    836           break;
    837       }
    838       break;
    839     case FRV_OPERAND_U12 :
    840       {
    841 {
    842   FLD (f_u12_h) = ((SI) (FLD (f_u12)) >> (6));
    843   FLD (f_u12_l) = ((FLD (f_u12)) & (63));
    844 }
    845         errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer);
    846         if (errmsg)
    847           break;
    848         errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer);
    849         if (errmsg)
    850           break;
    851       }
    852       break;
    853     case FRV_OPERAND_U16 :
    854       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
    855       break;
    856     case FRV_OPERAND_U6 :
    857       errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer);
    858       break;
    859     case FRV_OPERAND_UHI16 :
    860       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
    861       break;
    862     case FRV_OPERAND_ULO16 :
    863       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
    864       break;
    865 
    866     default :
    867       /* xgettext:c-format */
    868       opcodes_error_handler
    869 	(_("internal error: unrecognized field %d while building insn"),
    870 	 opindex);
    871       abort ();
    872   }
    873 
    874   return errmsg;
    875 }
    876 
    877 int frv_cgen_extract_operand
    878   (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
    879 
    880 /* Main entry point for operand extraction.
    881    The result is <= 0 for error, >0 for success.
    882    ??? Actual values aren't well defined right now.
    883 
    884    This function is basically just a big switch statement.  Earlier versions
    885    used tables to look up the function to use, but
    886    - if the table contains both assembler and disassembler functions then
    887      the disassembler contains much of the assembler and vice-versa,
    888    - there's a lot of inlining possibilities as things grow,
    889    - using a switch statement avoids the function call overhead.
    890 
    891    This function could be moved into `print_insn_normal', but keeping it
    892    separate makes clear the interface between `print_insn_normal' and each of
    893    the handlers.  */
    894 
    895 int
    896 frv_cgen_extract_operand (CGEN_CPU_DESC cd,
    897 			     int opindex,
    898 			     CGEN_EXTRACT_INFO *ex_info,
    899 			     CGEN_INSN_INT insn_value,
    900 			     CGEN_FIELDS * fields,
    901 			     bfd_vma pc)
    902 {
    903   /* Assume success (for those operands that are nops).  */
    904   int length = 1;
    905   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
    906 
    907   switch (opindex)
    908     {
    909     case FRV_OPERAND_A0 :
    910       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
    911       break;
    912     case FRV_OPERAND_A1 :
    913       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
    914       break;
    915     case FRV_OPERAND_ACC40SI :
    916       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si);
    917       break;
    918     case FRV_OPERAND_ACC40SK :
    919       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk);
    920       break;
    921     case FRV_OPERAND_ACC40UI :
    922       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui);
    923       break;
    924     case FRV_OPERAND_ACC40UK :
    925       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk);
    926       break;
    927     case FRV_OPERAND_ACCGI :
    928       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi);
    929       break;
    930     case FRV_OPERAND_ACCGK :
    931       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk);
    932       break;
    933     case FRV_OPERAND_CCI :
    934       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi);
    935       break;
    936     case FRV_OPERAND_CPRDOUBLEK :
    937       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
    938       break;
    939     case FRV_OPERAND_CPRI :
    940       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi);
    941       break;
    942     case FRV_OPERAND_CPRJ :
    943       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj);
    944       break;
    945     case FRV_OPERAND_CPRK :
    946       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
    947       break;
    948     case FRV_OPERAND_CRI :
    949       length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi);
    950       break;
    951     case FRV_OPERAND_CRJ :
    952       length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj);
    953       break;
    954     case FRV_OPERAND_CRJ_FLOAT :
    955       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float);
    956       break;
    957     case FRV_OPERAND_CRJ_INT :
    958       {
    959         long value;
    960         length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value);
    961         value = ((value) + (4));
    962         fields->f_CRj_int = value;
    963       }
    964       break;
    965     case FRV_OPERAND_CRK :
    966       length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk);
    967       break;
    968     case FRV_OPERAND_FCCI_1 :
    969       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1);
    970       break;
    971     case FRV_OPERAND_FCCI_2 :
    972       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2);
    973       break;
    974     case FRV_OPERAND_FCCI_3 :
    975       length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3);
    976       break;
    977     case FRV_OPERAND_FCCK :
    978       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk);
    979       break;
    980     case FRV_OPERAND_FRDOUBLEI :
    981       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
    982       break;
    983     case FRV_OPERAND_FRDOUBLEJ :
    984       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
    985       break;
    986     case FRV_OPERAND_FRDOUBLEK :
    987       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
    988       break;
    989     case FRV_OPERAND_FRI :
    990       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
    991       break;
    992     case FRV_OPERAND_FRINTI :
    993       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
    994       break;
    995     case FRV_OPERAND_FRINTIEVEN :
    996       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
    997       break;
    998     case FRV_OPERAND_FRINTJ :
    999       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
   1000       break;
   1001     case FRV_OPERAND_FRINTJEVEN :
   1002       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
   1003       break;
   1004     case FRV_OPERAND_FRINTK :
   1005       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
   1006       break;
   1007     case FRV_OPERAND_FRINTKEVEN :
   1008       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
   1009       break;
   1010     case FRV_OPERAND_FRJ :
   1011       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
   1012       break;
   1013     case FRV_OPERAND_FRK :
   1014       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
   1015       break;
   1016     case FRV_OPERAND_FRKHI :
   1017       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
   1018       break;
   1019     case FRV_OPERAND_FRKLO :
   1020       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
   1021       break;
   1022     case FRV_OPERAND_GRDOUBLEK :
   1023       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
   1024       break;
   1025     case FRV_OPERAND_GRI :
   1026       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi);
   1027       break;
   1028     case FRV_OPERAND_GRJ :
   1029       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj);
   1030       break;
   1031     case FRV_OPERAND_GRK :
   1032       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
   1033       break;
   1034     case FRV_OPERAND_GRKHI :
   1035       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
   1036       break;
   1037     case FRV_OPERAND_GRKLO :
   1038       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
   1039       break;
   1040     case FRV_OPERAND_ICCI_1 :
   1041       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1);
   1042       break;
   1043     case FRV_OPERAND_ICCI_2 :
   1044       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2);
   1045       break;
   1046     case FRV_OPERAND_ICCI_3 :
   1047       length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3);
   1048       break;
   1049     case FRV_OPERAND_LI :
   1050       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI);
   1051       break;
   1052     case FRV_OPERAND_LRAD :
   1053       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD);
   1054       break;
   1055     case FRV_OPERAND_LRAE :
   1056       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE);
   1057       break;
   1058     case FRV_OPERAND_LRAS :
   1059       length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS);
   1060       break;
   1061     case FRV_OPERAND_TLBPRL :
   1062       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL);
   1063       break;
   1064     case FRV_OPERAND_TLBPROPX :
   1065       length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx);
   1066       break;
   1067     case FRV_OPERAND_AE :
   1068       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
   1069       break;
   1070     case FRV_OPERAND_CALLANN :
   1071       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
   1072       break;
   1073     case FRV_OPERAND_CCOND :
   1074       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
   1075       break;
   1076     case FRV_OPERAND_COND :
   1077       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond);
   1078       break;
   1079     case FRV_OPERAND_D12 :
   1080       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
   1081       break;
   1082     case FRV_OPERAND_DEBUG :
   1083       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug);
   1084       break;
   1085     case FRV_OPERAND_EIR :
   1086       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir);
   1087       break;
   1088     case FRV_OPERAND_HINT :
   1089       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
   1090       break;
   1091     case FRV_OPERAND_HINT_NOT_TAKEN :
   1092       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
   1093       break;
   1094     case FRV_OPERAND_HINT_TAKEN :
   1095       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
   1096       break;
   1097     case FRV_OPERAND_LABEL16 :
   1098       {
   1099         long value;
   1100         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, pc, & value);
   1101         value = ((((value) * (4))) + (pc));
   1102         fields->f_label16 = value;
   1103       }
   1104       break;
   1105     case FRV_OPERAND_LABEL24 :
   1106       {
   1107         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6);
   1108         if (length <= 0) break;
   1109         length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
   1110         if (length <= 0) break;
   1111 {
   1112   FLD (f_label24) = ((((((((FLD (f_labelH6)) * (((1) << (18))))) | (FLD (f_labelL18)))) * (4))) + (pc));
   1113 }
   1114       }
   1115       break;
   1116     case FRV_OPERAND_LDANN :
   1117       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
   1118       break;
   1119     case FRV_OPERAND_LDDANN :
   1120       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
   1121       break;
   1122     case FRV_OPERAND_LOCK :
   1123       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
   1124       break;
   1125     case FRV_OPERAND_PACK :
   1126       length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack);
   1127       break;
   1128     case FRV_OPERAND_S10 :
   1129       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10);
   1130       break;
   1131     case FRV_OPERAND_S12 :
   1132       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
   1133       break;
   1134     case FRV_OPERAND_S16 :
   1135       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
   1136       break;
   1137     case FRV_OPERAND_S5 :
   1138       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5);
   1139       break;
   1140     case FRV_OPERAND_S6 :
   1141       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6);
   1142       break;
   1143     case FRV_OPERAND_S6_1 :
   1144       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1);
   1145       break;
   1146     case FRV_OPERAND_SLO16 :
   1147       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
   1148       break;
   1149     case FRV_OPERAND_SPR :
   1150       {
   1151         length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h);
   1152         if (length <= 0) break;
   1153         length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l);
   1154         if (length <= 0) break;
   1155 {
   1156   FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l)));
   1157 }
   1158       }
   1159       break;
   1160     case FRV_OPERAND_U12 :
   1161       {
   1162         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h);
   1163         if (length <= 0) break;
   1164         length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
   1165         if (length <= 0) break;
   1166 {
   1167   FLD (f_u12) = ((((FLD (f_u12_h)) * (64))) | (FLD (f_u12_l)));
   1168 }
   1169       }
   1170       break;
   1171     case FRV_OPERAND_U16 :
   1172       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
   1173       break;
   1174     case FRV_OPERAND_U6 :
   1175       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6);
   1176       break;
   1177     case FRV_OPERAND_UHI16 :
   1178       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
   1179       break;
   1180     case FRV_OPERAND_ULO16 :
   1181       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
   1182       break;
   1183 
   1184     default :
   1185       /* xgettext:c-format */
   1186       opcodes_error_handler
   1187 	(_("internal error: unrecognized field %d while decoding insn"),
   1188 	 opindex);
   1189       abort ();
   1190     }
   1191 
   1192   return length;
   1193 }
   1194 
   1195 cgen_insert_fn * const frv_cgen_insert_handlers[] =
   1196 {
   1197   insert_insn_normal,
   1198 };
   1199 
   1200 cgen_extract_fn * const frv_cgen_extract_handlers[] =
   1201 {
   1202   extract_insn_normal,
   1203 };
   1204 
   1205 int frv_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
   1206 bfd_vma frv_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
   1207 
   1208 /* Getting values from cgen_fields is handled by a collection of functions.
   1209    They are distinguished by the type of the VALUE argument they return.
   1210    TODO: floating point, inlining support, remove cases where result type
   1211    not appropriate.  */
   1212 
   1213 int
   1214 frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1215 			     int opindex,
   1216 			     const CGEN_FIELDS * fields)
   1217 {
   1218   int value;
   1219 
   1220   switch (opindex)
   1221     {
   1222     case FRV_OPERAND_A0 :
   1223       value = fields->f_A;
   1224       break;
   1225     case FRV_OPERAND_A1 :
   1226       value = fields->f_A;
   1227       break;
   1228     case FRV_OPERAND_ACC40SI :
   1229       value = fields->f_ACC40Si;
   1230       break;
   1231     case FRV_OPERAND_ACC40SK :
   1232       value = fields->f_ACC40Sk;
   1233       break;
   1234     case FRV_OPERAND_ACC40UI :
   1235       value = fields->f_ACC40Ui;
   1236       break;
   1237     case FRV_OPERAND_ACC40UK :
   1238       value = fields->f_ACC40Uk;
   1239       break;
   1240     case FRV_OPERAND_ACCGI :
   1241       value = fields->f_ACCGi;
   1242       break;
   1243     case FRV_OPERAND_ACCGK :
   1244       value = fields->f_ACCGk;
   1245       break;
   1246     case FRV_OPERAND_CCI :
   1247       value = fields->f_CCi;
   1248       break;
   1249     case FRV_OPERAND_CPRDOUBLEK :
   1250       value = fields->f_CPRk;
   1251       break;
   1252     case FRV_OPERAND_CPRI :
   1253       value = fields->f_CPRi;
   1254       break;
   1255     case FRV_OPERAND_CPRJ :
   1256       value = fields->f_CPRj;
   1257       break;
   1258     case FRV_OPERAND_CPRK :
   1259       value = fields->f_CPRk;
   1260       break;
   1261     case FRV_OPERAND_CRI :
   1262       value = fields->f_CRi;
   1263       break;
   1264     case FRV_OPERAND_CRJ :
   1265       value = fields->f_CRj;
   1266       break;
   1267     case FRV_OPERAND_CRJ_FLOAT :
   1268       value = fields->f_CRj_float;
   1269       break;
   1270     case FRV_OPERAND_CRJ_INT :
   1271       value = fields->f_CRj_int;
   1272       break;
   1273     case FRV_OPERAND_CRK :
   1274       value = fields->f_CRk;
   1275       break;
   1276     case FRV_OPERAND_FCCI_1 :
   1277       value = fields->f_FCCi_1;
   1278       break;
   1279     case FRV_OPERAND_FCCI_2 :
   1280       value = fields->f_FCCi_2;
   1281       break;
   1282     case FRV_OPERAND_FCCI_3 :
   1283       value = fields->f_FCCi_3;
   1284       break;
   1285     case FRV_OPERAND_FCCK :
   1286       value = fields->f_FCCk;
   1287       break;
   1288     case FRV_OPERAND_FRDOUBLEI :
   1289       value = fields->f_FRi;
   1290       break;
   1291     case FRV_OPERAND_FRDOUBLEJ :
   1292       value = fields->f_FRj;
   1293       break;
   1294     case FRV_OPERAND_FRDOUBLEK :
   1295       value = fields->f_FRk;
   1296       break;
   1297     case FRV_OPERAND_FRI :
   1298       value = fields->f_FRi;
   1299       break;
   1300     case FRV_OPERAND_FRINTI :
   1301       value = fields->f_FRi;
   1302       break;
   1303     case FRV_OPERAND_FRINTIEVEN :
   1304       value = fields->f_FRi;
   1305       break;
   1306     case FRV_OPERAND_FRINTJ :
   1307       value = fields->f_FRj;
   1308       break;
   1309     case FRV_OPERAND_FRINTJEVEN :
   1310       value = fields->f_FRj;
   1311       break;
   1312     case FRV_OPERAND_FRINTK :
   1313       value = fields->f_FRk;
   1314       break;
   1315     case FRV_OPERAND_FRINTKEVEN :
   1316       value = fields->f_FRk;
   1317       break;
   1318     case FRV_OPERAND_FRJ :
   1319       value = fields->f_FRj;
   1320       break;
   1321     case FRV_OPERAND_FRK :
   1322       value = fields->f_FRk;
   1323       break;
   1324     case FRV_OPERAND_FRKHI :
   1325       value = fields->f_FRk;
   1326       break;
   1327     case FRV_OPERAND_FRKLO :
   1328       value = fields->f_FRk;
   1329       break;
   1330     case FRV_OPERAND_GRDOUBLEK :
   1331       value = fields->f_GRk;
   1332       break;
   1333     case FRV_OPERAND_GRI :
   1334       value = fields->f_GRi;
   1335       break;
   1336     case FRV_OPERAND_GRJ :
   1337       value = fields->f_GRj;
   1338       break;
   1339     case FRV_OPERAND_GRK :
   1340       value = fields->f_GRk;
   1341       break;
   1342     case FRV_OPERAND_GRKHI :
   1343       value = fields->f_GRk;
   1344       break;
   1345     case FRV_OPERAND_GRKLO :
   1346       value = fields->f_GRk;
   1347       break;
   1348     case FRV_OPERAND_ICCI_1 :
   1349       value = fields->f_ICCi_1;
   1350       break;
   1351     case FRV_OPERAND_ICCI_2 :
   1352       value = fields->f_ICCi_2;
   1353       break;
   1354     case FRV_OPERAND_ICCI_3 :
   1355       value = fields->f_ICCi_3;
   1356       break;
   1357     case FRV_OPERAND_LI :
   1358       value = fields->f_LI;
   1359       break;
   1360     case FRV_OPERAND_LRAD :
   1361       value = fields->f_LRAD;
   1362       break;
   1363     case FRV_OPERAND_LRAE :
   1364       value = fields->f_LRAE;
   1365       break;
   1366     case FRV_OPERAND_LRAS :
   1367       value = fields->f_LRAS;
   1368       break;
   1369     case FRV_OPERAND_TLBPRL :
   1370       value = fields->f_TLBPRL;
   1371       break;
   1372     case FRV_OPERAND_TLBPROPX :
   1373       value = fields->f_TLBPRopx;
   1374       break;
   1375     case FRV_OPERAND_AE :
   1376       value = fields->f_ae;
   1377       break;
   1378     case FRV_OPERAND_CALLANN :
   1379       value = fields->f_reloc_ann;
   1380       break;
   1381     case FRV_OPERAND_CCOND :
   1382       value = fields->f_ccond;
   1383       break;
   1384     case FRV_OPERAND_COND :
   1385       value = fields->f_cond;
   1386       break;
   1387     case FRV_OPERAND_D12 :
   1388       value = fields->f_d12;
   1389       break;
   1390     case FRV_OPERAND_DEBUG :
   1391       value = fields->f_debug;
   1392       break;
   1393     case FRV_OPERAND_EIR :
   1394       value = fields->f_eir;
   1395       break;
   1396     case FRV_OPERAND_HINT :
   1397       value = fields->f_hint;
   1398       break;
   1399     case FRV_OPERAND_HINT_NOT_TAKEN :
   1400       value = fields->f_hint;
   1401       break;
   1402     case FRV_OPERAND_HINT_TAKEN :
   1403       value = fields->f_hint;
   1404       break;
   1405     case FRV_OPERAND_LABEL16 :
   1406       value = fields->f_label16;
   1407       break;
   1408     case FRV_OPERAND_LABEL24 :
   1409       value = fields->f_label24;
   1410       break;
   1411     case FRV_OPERAND_LDANN :
   1412       value = fields->f_reloc_ann;
   1413       break;
   1414     case FRV_OPERAND_LDDANN :
   1415       value = fields->f_reloc_ann;
   1416       break;
   1417     case FRV_OPERAND_LOCK :
   1418       value = fields->f_lock;
   1419       break;
   1420     case FRV_OPERAND_PACK :
   1421       value = fields->f_pack;
   1422       break;
   1423     case FRV_OPERAND_S10 :
   1424       value = fields->f_s10;
   1425       break;
   1426     case FRV_OPERAND_S12 :
   1427       value = fields->f_d12;
   1428       break;
   1429     case FRV_OPERAND_S16 :
   1430       value = fields->f_s16;
   1431       break;
   1432     case FRV_OPERAND_S5 :
   1433       value = fields->f_s5;
   1434       break;
   1435     case FRV_OPERAND_S6 :
   1436       value = fields->f_s6;
   1437       break;
   1438     case FRV_OPERAND_S6_1 :
   1439       value = fields->f_s6_1;
   1440       break;
   1441     case FRV_OPERAND_SLO16 :
   1442       value = fields->f_s16;
   1443       break;
   1444     case FRV_OPERAND_SPR :
   1445       value = fields->f_spr;
   1446       break;
   1447     case FRV_OPERAND_U12 :
   1448       value = fields->f_u12;
   1449       break;
   1450     case FRV_OPERAND_U16 :
   1451       value = fields->f_u16;
   1452       break;
   1453     case FRV_OPERAND_U6 :
   1454       value = fields->f_u6;
   1455       break;
   1456     case FRV_OPERAND_UHI16 :
   1457       value = fields->f_u16;
   1458       break;
   1459     case FRV_OPERAND_ULO16 :
   1460       value = fields->f_u16;
   1461       break;
   1462 
   1463     default :
   1464       /* xgettext:c-format */
   1465       opcodes_error_handler
   1466 	(_("internal error: unrecognized field %d while getting int operand"),
   1467 	 opindex);
   1468       abort ();
   1469   }
   1470 
   1471   return value;
   1472 }
   1473 
   1474 bfd_vma
   1475 frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1476 			     int opindex,
   1477 			     const CGEN_FIELDS * fields)
   1478 {
   1479   bfd_vma value;
   1480 
   1481   switch (opindex)
   1482     {
   1483     case FRV_OPERAND_A0 :
   1484       value = fields->f_A;
   1485       break;
   1486     case FRV_OPERAND_A1 :
   1487       value = fields->f_A;
   1488       break;
   1489     case FRV_OPERAND_ACC40SI :
   1490       value = fields->f_ACC40Si;
   1491       break;
   1492     case FRV_OPERAND_ACC40SK :
   1493       value = fields->f_ACC40Sk;
   1494       break;
   1495     case FRV_OPERAND_ACC40UI :
   1496       value = fields->f_ACC40Ui;
   1497       break;
   1498     case FRV_OPERAND_ACC40UK :
   1499       value = fields->f_ACC40Uk;
   1500       break;
   1501     case FRV_OPERAND_ACCGI :
   1502       value = fields->f_ACCGi;
   1503       break;
   1504     case FRV_OPERAND_ACCGK :
   1505       value = fields->f_ACCGk;
   1506       break;
   1507     case FRV_OPERAND_CCI :
   1508       value = fields->f_CCi;
   1509       break;
   1510     case FRV_OPERAND_CPRDOUBLEK :
   1511       value = fields->f_CPRk;
   1512       break;
   1513     case FRV_OPERAND_CPRI :
   1514       value = fields->f_CPRi;
   1515       break;
   1516     case FRV_OPERAND_CPRJ :
   1517       value = fields->f_CPRj;
   1518       break;
   1519     case FRV_OPERAND_CPRK :
   1520       value = fields->f_CPRk;
   1521       break;
   1522     case FRV_OPERAND_CRI :
   1523       value = fields->f_CRi;
   1524       break;
   1525     case FRV_OPERAND_CRJ :
   1526       value = fields->f_CRj;
   1527       break;
   1528     case FRV_OPERAND_CRJ_FLOAT :
   1529       value = fields->f_CRj_float;
   1530       break;
   1531     case FRV_OPERAND_CRJ_INT :
   1532       value = fields->f_CRj_int;
   1533       break;
   1534     case FRV_OPERAND_CRK :
   1535       value = fields->f_CRk;
   1536       break;
   1537     case FRV_OPERAND_FCCI_1 :
   1538       value = fields->f_FCCi_1;
   1539       break;
   1540     case FRV_OPERAND_FCCI_2 :
   1541       value = fields->f_FCCi_2;
   1542       break;
   1543     case FRV_OPERAND_FCCI_3 :
   1544       value = fields->f_FCCi_3;
   1545       break;
   1546     case FRV_OPERAND_FCCK :
   1547       value = fields->f_FCCk;
   1548       break;
   1549     case FRV_OPERAND_FRDOUBLEI :
   1550       value = fields->f_FRi;
   1551       break;
   1552     case FRV_OPERAND_FRDOUBLEJ :
   1553       value = fields->f_FRj;
   1554       break;
   1555     case FRV_OPERAND_FRDOUBLEK :
   1556       value = fields->f_FRk;
   1557       break;
   1558     case FRV_OPERAND_FRI :
   1559       value = fields->f_FRi;
   1560       break;
   1561     case FRV_OPERAND_FRINTI :
   1562       value = fields->f_FRi;
   1563       break;
   1564     case FRV_OPERAND_FRINTIEVEN :
   1565       value = fields->f_FRi;
   1566       break;
   1567     case FRV_OPERAND_FRINTJ :
   1568       value = fields->f_FRj;
   1569       break;
   1570     case FRV_OPERAND_FRINTJEVEN :
   1571       value = fields->f_FRj;
   1572       break;
   1573     case FRV_OPERAND_FRINTK :
   1574       value = fields->f_FRk;
   1575       break;
   1576     case FRV_OPERAND_FRINTKEVEN :
   1577       value = fields->f_FRk;
   1578       break;
   1579     case FRV_OPERAND_FRJ :
   1580       value = fields->f_FRj;
   1581       break;
   1582     case FRV_OPERAND_FRK :
   1583       value = fields->f_FRk;
   1584       break;
   1585     case FRV_OPERAND_FRKHI :
   1586       value = fields->f_FRk;
   1587       break;
   1588     case FRV_OPERAND_FRKLO :
   1589       value = fields->f_FRk;
   1590       break;
   1591     case FRV_OPERAND_GRDOUBLEK :
   1592       value = fields->f_GRk;
   1593       break;
   1594     case FRV_OPERAND_GRI :
   1595       value = fields->f_GRi;
   1596       break;
   1597     case FRV_OPERAND_GRJ :
   1598       value = fields->f_GRj;
   1599       break;
   1600     case FRV_OPERAND_GRK :
   1601       value = fields->f_GRk;
   1602       break;
   1603     case FRV_OPERAND_GRKHI :
   1604       value = fields->f_GRk;
   1605       break;
   1606     case FRV_OPERAND_GRKLO :
   1607       value = fields->f_GRk;
   1608       break;
   1609     case FRV_OPERAND_ICCI_1 :
   1610       value = fields->f_ICCi_1;
   1611       break;
   1612     case FRV_OPERAND_ICCI_2 :
   1613       value = fields->f_ICCi_2;
   1614       break;
   1615     case FRV_OPERAND_ICCI_3 :
   1616       value = fields->f_ICCi_3;
   1617       break;
   1618     case FRV_OPERAND_LI :
   1619       value = fields->f_LI;
   1620       break;
   1621     case FRV_OPERAND_LRAD :
   1622       value = fields->f_LRAD;
   1623       break;
   1624     case FRV_OPERAND_LRAE :
   1625       value = fields->f_LRAE;
   1626       break;
   1627     case FRV_OPERAND_LRAS :
   1628       value = fields->f_LRAS;
   1629       break;
   1630     case FRV_OPERAND_TLBPRL :
   1631       value = fields->f_TLBPRL;
   1632       break;
   1633     case FRV_OPERAND_TLBPROPX :
   1634       value = fields->f_TLBPRopx;
   1635       break;
   1636     case FRV_OPERAND_AE :
   1637       value = fields->f_ae;
   1638       break;
   1639     case FRV_OPERAND_CALLANN :
   1640       value = fields->f_reloc_ann;
   1641       break;
   1642     case FRV_OPERAND_CCOND :
   1643       value = fields->f_ccond;
   1644       break;
   1645     case FRV_OPERAND_COND :
   1646       value = fields->f_cond;
   1647       break;
   1648     case FRV_OPERAND_D12 :
   1649       value = fields->f_d12;
   1650       break;
   1651     case FRV_OPERAND_DEBUG :
   1652       value = fields->f_debug;
   1653       break;
   1654     case FRV_OPERAND_EIR :
   1655       value = fields->f_eir;
   1656       break;
   1657     case FRV_OPERAND_HINT :
   1658       value = fields->f_hint;
   1659       break;
   1660     case FRV_OPERAND_HINT_NOT_TAKEN :
   1661       value = fields->f_hint;
   1662       break;
   1663     case FRV_OPERAND_HINT_TAKEN :
   1664       value = fields->f_hint;
   1665       break;
   1666     case FRV_OPERAND_LABEL16 :
   1667       value = fields->f_label16;
   1668       break;
   1669     case FRV_OPERAND_LABEL24 :
   1670       value = fields->f_label24;
   1671       break;
   1672     case FRV_OPERAND_LDANN :
   1673       value = fields->f_reloc_ann;
   1674       break;
   1675     case FRV_OPERAND_LDDANN :
   1676       value = fields->f_reloc_ann;
   1677       break;
   1678     case FRV_OPERAND_LOCK :
   1679       value = fields->f_lock;
   1680       break;
   1681     case FRV_OPERAND_PACK :
   1682       value = fields->f_pack;
   1683       break;
   1684     case FRV_OPERAND_S10 :
   1685       value = fields->f_s10;
   1686       break;
   1687     case FRV_OPERAND_S12 :
   1688       value = fields->f_d12;
   1689       break;
   1690     case FRV_OPERAND_S16 :
   1691       value = fields->f_s16;
   1692       break;
   1693     case FRV_OPERAND_S5 :
   1694       value = fields->f_s5;
   1695       break;
   1696     case FRV_OPERAND_S6 :
   1697       value = fields->f_s6;
   1698       break;
   1699     case FRV_OPERAND_S6_1 :
   1700       value = fields->f_s6_1;
   1701       break;
   1702     case FRV_OPERAND_SLO16 :
   1703       value = fields->f_s16;
   1704       break;
   1705     case FRV_OPERAND_SPR :
   1706       value = fields->f_spr;
   1707       break;
   1708     case FRV_OPERAND_U12 :
   1709       value = fields->f_u12;
   1710       break;
   1711     case FRV_OPERAND_U16 :
   1712       value = fields->f_u16;
   1713       break;
   1714     case FRV_OPERAND_U6 :
   1715       value = fields->f_u6;
   1716       break;
   1717     case FRV_OPERAND_UHI16 :
   1718       value = fields->f_u16;
   1719       break;
   1720     case FRV_OPERAND_ULO16 :
   1721       value = fields->f_u16;
   1722       break;
   1723 
   1724     default :
   1725       /* xgettext:c-format */
   1726       opcodes_error_handler
   1727 	(_("internal error: unrecognized field %d while getting vma operand"),
   1728 	 opindex);
   1729       abort ();
   1730   }
   1731 
   1732   return value;
   1733 }
   1734 
   1735 void frv_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
   1736 void frv_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
   1737 
   1738 /* Stuffing values in cgen_fields is handled by a collection of functions.
   1739    They are distinguished by the type of the VALUE argument they accept.
   1740    TODO: floating point, inlining support, remove cases where argument type
   1741    not appropriate.  */
   1742 
   1743 void
   1744 frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   1745 			     int opindex,
   1746 			     CGEN_FIELDS * fields,
   1747 			     int value)
   1748 {
   1749   switch (opindex)
   1750     {
   1751     case FRV_OPERAND_A0 :
   1752       fields->f_A = value;
   1753       break;
   1754     case FRV_OPERAND_A1 :
   1755       fields->f_A = value;
   1756       break;
   1757     case FRV_OPERAND_ACC40SI :
   1758       fields->f_ACC40Si = value;
   1759       break;
   1760     case FRV_OPERAND_ACC40SK :
   1761       fields->f_ACC40Sk = value;
   1762       break;
   1763     case FRV_OPERAND_ACC40UI :
   1764       fields->f_ACC40Ui = value;
   1765       break;
   1766     case FRV_OPERAND_ACC40UK :
   1767       fields->f_ACC40Uk = value;
   1768       break;
   1769     case FRV_OPERAND_ACCGI :
   1770       fields->f_ACCGi = value;
   1771       break;
   1772     case FRV_OPERAND_ACCGK :
   1773       fields->f_ACCGk = value;
   1774       break;
   1775     case FRV_OPERAND_CCI :
   1776       fields->f_CCi = value;
   1777       break;
   1778     case FRV_OPERAND_CPRDOUBLEK :
   1779       fields->f_CPRk = value;
   1780       break;
   1781     case FRV_OPERAND_CPRI :
   1782       fields->f_CPRi = value;
   1783       break;
   1784     case FRV_OPERAND_CPRJ :
   1785       fields->f_CPRj = value;
   1786       break;
   1787     case FRV_OPERAND_CPRK :
   1788       fields->f_CPRk = value;
   1789       break;
   1790     case FRV_OPERAND_CRI :
   1791       fields->f_CRi = value;
   1792       break;
   1793     case FRV_OPERAND_CRJ :
   1794       fields->f_CRj = value;
   1795       break;
   1796     case FRV_OPERAND_CRJ_FLOAT :
   1797       fields->f_CRj_float = value;
   1798       break;
   1799     case FRV_OPERAND_CRJ_INT :
   1800       fields->f_CRj_int = value;
   1801       break;
   1802     case FRV_OPERAND_CRK :
   1803       fields->f_CRk = value;
   1804       break;
   1805     case FRV_OPERAND_FCCI_1 :
   1806       fields->f_FCCi_1 = value;
   1807       break;
   1808     case FRV_OPERAND_FCCI_2 :
   1809       fields->f_FCCi_2 = value;
   1810       break;
   1811     case FRV_OPERAND_FCCI_3 :
   1812       fields->f_FCCi_3 = value;
   1813       break;
   1814     case FRV_OPERAND_FCCK :
   1815       fields->f_FCCk = value;
   1816       break;
   1817     case FRV_OPERAND_FRDOUBLEI :
   1818       fields->f_FRi = value;
   1819       break;
   1820     case FRV_OPERAND_FRDOUBLEJ :
   1821       fields->f_FRj = value;
   1822       break;
   1823     case FRV_OPERAND_FRDOUBLEK :
   1824       fields->f_FRk = value;
   1825       break;
   1826     case FRV_OPERAND_FRI :
   1827       fields->f_FRi = value;
   1828       break;
   1829     case FRV_OPERAND_FRINTI :
   1830       fields->f_FRi = value;
   1831       break;
   1832     case FRV_OPERAND_FRINTIEVEN :
   1833       fields->f_FRi = value;
   1834       break;
   1835     case FRV_OPERAND_FRINTJ :
   1836       fields->f_FRj = value;
   1837       break;
   1838     case FRV_OPERAND_FRINTJEVEN :
   1839       fields->f_FRj = value;
   1840       break;
   1841     case FRV_OPERAND_FRINTK :
   1842       fields->f_FRk = value;
   1843       break;
   1844     case FRV_OPERAND_FRINTKEVEN :
   1845       fields->f_FRk = value;
   1846       break;
   1847     case FRV_OPERAND_FRJ :
   1848       fields->f_FRj = value;
   1849       break;
   1850     case FRV_OPERAND_FRK :
   1851       fields->f_FRk = value;
   1852       break;
   1853     case FRV_OPERAND_FRKHI :
   1854       fields->f_FRk = value;
   1855       break;
   1856     case FRV_OPERAND_FRKLO :
   1857       fields->f_FRk = value;
   1858       break;
   1859     case FRV_OPERAND_GRDOUBLEK :
   1860       fields->f_GRk = value;
   1861       break;
   1862     case FRV_OPERAND_GRI :
   1863       fields->f_GRi = value;
   1864       break;
   1865     case FRV_OPERAND_GRJ :
   1866       fields->f_GRj = value;
   1867       break;
   1868     case FRV_OPERAND_GRK :
   1869       fields->f_GRk = value;
   1870       break;
   1871     case FRV_OPERAND_GRKHI :
   1872       fields->f_GRk = value;
   1873       break;
   1874     case FRV_OPERAND_GRKLO :
   1875       fields->f_GRk = value;
   1876       break;
   1877     case FRV_OPERAND_ICCI_1 :
   1878       fields->f_ICCi_1 = value;
   1879       break;
   1880     case FRV_OPERAND_ICCI_2 :
   1881       fields->f_ICCi_2 = value;
   1882       break;
   1883     case FRV_OPERAND_ICCI_3 :
   1884       fields->f_ICCi_3 = value;
   1885       break;
   1886     case FRV_OPERAND_LI :
   1887       fields->f_LI = value;
   1888       break;
   1889     case FRV_OPERAND_LRAD :
   1890       fields->f_LRAD = value;
   1891       break;
   1892     case FRV_OPERAND_LRAE :
   1893       fields->f_LRAE = value;
   1894       break;
   1895     case FRV_OPERAND_LRAS :
   1896       fields->f_LRAS = value;
   1897       break;
   1898     case FRV_OPERAND_TLBPRL :
   1899       fields->f_TLBPRL = value;
   1900       break;
   1901     case FRV_OPERAND_TLBPROPX :
   1902       fields->f_TLBPRopx = value;
   1903       break;
   1904     case FRV_OPERAND_AE :
   1905       fields->f_ae = value;
   1906       break;
   1907     case FRV_OPERAND_CALLANN :
   1908       fields->f_reloc_ann = value;
   1909       break;
   1910     case FRV_OPERAND_CCOND :
   1911       fields->f_ccond = value;
   1912       break;
   1913     case FRV_OPERAND_COND :
   1914       fields->f_cond = value;
   1915       break;
   1916     case FRV_OPERAND_D12 :
   1917       fields->f_d12 = value;
   1918       break;
   1919     case FRV_OPERAND_DEBUG :
   1920       fields->f_debug = value;
   1921       break;
   1922     case FRV_OPERAND_EIR :
   1923       fields->f_eir = value;
   1924       break;
   1925     case FRV_OPERAND_HINT :
   1926       fields->f_hint = value;
   1927       break;
   1928     case FRV_OPERAND_HINT_NOT_TAKEN :
   1929       fields->f_hint = value;
   1930       break;
   1931     case FRV_OPERAND_HINT_TAKEN :
   1932       fields->f_hint = value;
   1933       break;
   1934     case FRV_OPERAND_LABEL16 :
   1935       fields->f_label16 = value;
   1936       break;
   1937     case FRV_OPERAND_LABEL24 :
   1938       fields->f_label24 = value;
   1939       break;
   1940     case FRV_OPERAND_LDANN :
   1941       fields->f_reloc_ann = value;
   1942       break;
   1943     case FRV_OPERAND_LDDANN :
   1944       fields->f_reloc_ann = value;
   1945       break;
   1946     case FRV_OPERAND_LOCK :
   1947       fields->f_lock = value;
   1948       break;
   1949     case FRV_OPERAND_PACK :
   1950       fields->f_pack = value;
   1951       break;
   1952     case FRV_OPERAND_S10 :
   1953       fields->f_s10 = value;
   1954       break;
   1955     case FRV_OPERAND_S12 :
   1956       fields->f_d12 = value;
   1957       break;
   1958     case FRV_OPERAND_S16 :
   1959       fields->f_s16 = value;
   1960       break;
   1961     case FRV_OPERAND_S5 :
   1962       fields->f_s5 = value;
   1963       break;
   1964     case FRV_OPERAND_S6 :
   1965       fields->f_s6 = value;
   1966       break;
   1967     case FRV_OPERAND_S6_1 :
   1968       fields->f_s6_1 = value;
   1969       break;
   1970     case FRV_OPERAND_SLO16 :
   1971       fields->f_s16 = value;
   1972       break;
   1973     case FRV_OPERAND_SPR :
   1974       fields->f_spr = value;
   1975       break;
   1976     case FRV_OPERAND_U12 :
   1977       fields->f_u12 = value;
   1978       break;
   1979     case FRV_OPERAND_U16 :
   1980       fields->f_u16 = value;
   1981       break;
   1982     case FRV_OPERAND_U6 :
   1983       fields->f_u6 = value;
   1984       break;
   1985     case FRV_OPERAND_UHI16 :
   1986       fields->f_u16 = value;
   1987       break;
   1988     case FRV_OPERAND_ULO16 :
   1989       fields->f_u16 = value;
   1990       break;
   1991 
   1992     default :
   1993       /* xgettext:c-format */
   1994       opcodes_error_handler
   1995 	(_("internal error: unrecognized field %d while setting int operand"),
   1996 	 opindex);
   1997       abort ();
   1998   }
   1999 }
   2000 
   2001 void
   2002 frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
   2003 			     int opindex,
   2004 			     CGEN_FIELDS * fields,
   2005 			     bfd_vma value)
   2006 {
   2007   switch (opindex)
   2008     {
   2009     case FRV_OPERAND_A0 :
   2010       fields->f_A = value;
   2011       break;
   2012     case FRV_OPERAND_A1 :
   2013       fields->f_A = value;
   2014       break;
   2015     case FRV_OPERAND_ACC40SI :
   2016       fields->f_ACC40Si = value;
   2017       break;
   2018     case FRV_OPERAND_ACC40SK :
   2019       fields->f_ACC40Sk = value;
   2020       break;
   2021     case FRV_OPERAND_ACC40UI :
   2022       fields->f_ACC40Ui = value;
   2023       break;
   2024     case FRV_OPERAND_ACC40UK :
   2025       fields->f_ACC40Uk = value;
   2026       break;
   2027     case FRV_OPERAND_ACCGI :
   2028       fields->f_ACCGi = value;
   2029       break;
   2030     case FRV_OPERAND_ACCGK :
   2031       fields->f_ACCGk = value;
   2032       break;
   2033     case FRV_OPERAND_CCI :
   2034       fields->f_CCi = value;
   2035       break;
   2036     case FRV_OPERAND_CPRDOUBLEK :
   2037       fields->f_CPRk = value;
   2038       break;
   2039     case FRV_OPERAND_CPRI :
   2040       fields->f_CPRi = value;
   2041       break;
   2042     case FRV_OPERAND_CPRJ :
   2043       fields->f_CPRj = value;
   2044       break;
   2045     case FRV_OPERAND_CPRK :
   2046       fields->f_CPRk = value;
   2047       break;
   2048     case FRV_OPERAND_CRI :
   2049       fields->f_CRi = value;
   2050       break;
   2051     case FRV_OPERAND_CRJ :
   2052       fields->f_CRj = value;
   2053       break;
   2054     case FRV_OPERAND_CRJ_FLOAT :
   2055       fields->f_CRj_float = value;
   2056       break;
   2057     case FRV_OPERAND_CRJ_INT :
   2058       fields->f_CRj_int = value;
   2059       break;
   2060     case FRV_OPERAND_CRK :
   2061       fields->f_CRk = value;
   2062       break;
   2063     case FRV_OPERAND_FCCI_1 :
   2064       fields->f_FCCi_1 = value;
   2065       break;
   2066     case FRV_OPERAND_FCCI_2 :
   2067       fields->f_FCCi_2 = value;
   2068       break;
   2069     case FRV_OPERAND_FCCI_3 :
   2070       fields->f_FCCi_3 = value;
   2071       break;
   2072     case FRV_OPERAND_FCCK :
   2073       fields->f_FCCk = value;
   2074       break;
   2075     case FRV_OPERAND_FRDOUBLEI :
   2076       fields->f_FRi = value;
   2077       break;
   2078     case FRV_OPERAND_FRDOUBLEJ :
   2079       fields->f_FRj = value;
   2080       break;
   2081     case FRV_OPERAND_FRDOUBLEK :
   2082       fields->f_FRk = value;
   2083       break;
   2084     case FRV_OPERAND_FRI :
   2085       fields->f_FRi = value;
   2086       break;
   2087     case FRV_OPERAND_FRINTI :
   2088       fields->f_FRi = value;
   2089       break;
   2090     case FRV_OPERAND_FRINTIEVEN :
   2091       fields->f_FRi = value;
   2092       break;
   2093     case FRV_OPERAND_FRINTJ :
   2094       fields->f_FRj = value;
   2095       break;
   2096     case FRV_OPERAND_FRINTJEVEN :
   2097       fields->f_FRj = value;
   2098       break;
   2099     case FRV_OPERAND_FRINTK :
   2100       fields->f_FRk = value;
   2101       break;
   2102     case FRV_OPERAND_FRINTKEVEN :
   2103       fields->f_FRk = value;
   2104       break;
   2105     case FRV_OPERAND_FRJ :
   2106       fields->f_FRj = value;
   2107       break;
   2108     case FRV_OPERAND_FRK :
   2109       fields->f_FRk = value;
   2110       break;
   2111     case FRV_OPERAND_FRKHI :
   2112       fields->f_FRk = value;
   2113       break;
   2114     case FRV_OPERAND_FRKLO :
   2115       fields->f_FRk = value;
   2116       break;
   2117     case FRV_OPERAND_GRDOUBLEK :
   2118       fields->f_GRk = value;
   2119       break;
   2120     case FRV_OPERAND_GRI :
   2121       fields->f_GRi = value;
   2122       break;
   2123     case FRV_OPERAND_GRJ :
   2124       fields->f_GRj = value;
   2125       break;
   2126     case FRV_OPERAND_GRK :
   2127       fields->f_GRk = value;
   2128       break;
   2129     case FRV_OPERAND_GRKHI :
   2130       fields->f_GRk = value;
   2131       break;
   2132     case FRV_OPERAND_GRKLO :
   2133       fields->f_GRk = value;
   2134       break;
   2135     case FRV_OPERAND_ICCI_1 :
   2136       fields->f_ICCi_1 = value;
   2137       break;
   2138     case FRV_OPERAND_ICCI_2 :
   2139       fields->f_ICCi_2 = value;
   2140       break;
   2141     case FRV_OPERAND_ICCI_3 :
   2142       fields->f_ICCi_3 = value;
   2143       break;
   2144     case FRV_OPERAND_LI :
   2145       fields->f_LI = value;
   2146       break;
   2147     case FRV_OPERAND_LRAD :
   2148       fields->f_LRAD = value;
   2149       break;
   2150     case FRV_OPERAND_LRAE :
   2151       fields->f_LRAE = value;
   2152       break;
   2153     case FRV_OPERAND_LRAS :
   2154       fields->f_LRAS = value;
   2155       break;
   2156     case FRV_OPERAND_TLBPRL :
   2157       fields->f_TLBPRL = value;
   2158       break;
   2159     case FRV_OPERAND_TLBPROPX :
   2160       fields->f_TLBPRopx = value;
   2161       break;
   2162     case FRV_OPERAND_AE :
   2163       fields->f_ae = value;
   2164       break;
   2165     case FRV_OPERAND_CALLANN :
   2166       fields->f_reloc_ann = value;
   2167       break;
   2168     case FRV_OPERAND_CCOND :
   2169       fields->f_ccond = value;
   2170       break;
   2171     case FRV_OPERAND_COND :
   2172       fields->f_cond = value;
   2173       break;
   2174     case FRV_OPERAND_D12 :
   2175       fields->f_d12 = value;
   2176       break;
   2177     case FRV_OPERAND_DEBUG :
   2178       fields->f_debug = value;
   2179       break;
   2180     case FRV_OPERAND_EIR :
   2181       fields->f_eir = value;
   2182       break;
   2183     case FRV_OPERAND_HINT :
   2184       fields->f_hint = value;
   2185       break;
   2186     case FRV_OPERAND_HINT_NOT_TAKEN :
   2187       fields->f_hint = value;
   2188       break;
   2189     case FRV_OPERAND_HINT_TAKEN :
   2190       fields->f_hint = value;
   2191       break;
   2192     case FRV_OPERAND_LABEL16 :
   2193       fields->f_label16 = value;
   2194       break;
   2195     case FRV_OPERAND_LABEL24 :
   2196       fields->f_label24 = value;
   2197       break;
   2198     case FRV_OPERAND_LDANN :
   2199       fields->f_reloc_ann = value;
   2200       break;
   2201     case FRV_OPERAND_LDDANN :
   2202       fields->f_reloc_ann = value;
   2203       break;
   2204     case FRV_OPERAND_LOCK :
   2205       fields->f_lock = value;
   2206       break;
   2207     case FRV_OPERAND_PACK :
   2208       fields->f_pack = value;
   2209       break;
   2210     case FRV_OPERAND_S10 :
   2211       fields->f_s10 = value;
   2212       break;
   2213     case FRV_OPERAND_S12 :
   2214       fields->f_d12 = value;
   2215       break;
   2216     case FRV_OPERAND_S16 :
   2217       fields->f_s16 = value;
   2218       break;
   2219     case FRV_OPERAND_S5 :
   2220       fields->f_s5 = value;
   2221       break;
   2222     case FRV_OPERAND_S6 :
   2223       fields->f_s6 = value;
   2224       break;
   2225     case FRV_OPERAND_S6_1 :
   2226       fields->f_s6_1 = value;
   2227       break;
   2228     case FRV_OPERAND_SLO16 :
   2229       fields->f_s16 = value;
   2230       break;
   2231     case FRV_OPERAND_SPR :
   2232       fields->f_spr = value;
   2233       break;
   2234     case FRV_OPERAND_U12 :
   2235       fields->f_u12 = value;
   2236       break;
   2237     case FRV_OPERAND_U16 :
   2238       fields->f_u16 = value;
   2239       break;
   2240     case FRV_OPERAND_U6 :
   2241       fields->f_u6 = value;
   2242       break;
   2243     case FRV_OPERAND_UHI16 :
   2244       fields->f_u16 = value;
   2245       break;
   2246     case FRV_OPERAND_ULO16 :
   2247       fields->f_u16 = value;
   2248       break;
   2249 
   2250     default :
   2251       /* xgettext:c-format */
   2252       opcodes_error_handler
   2253 	(_("internal error: unrecognized field %d while setting vma operand"),
   2254 	 opindex);
   2255       abort ();
   2256   }
   2257 }
   2258 
   2259 /* Function to call before using the instruction builder tables.  */
   2260 
   2261 void
   2262 frv_cgen_init_ibld_table (CGEN_CPU_DESC cd)
   2263 {
   2264   cd->insert_handlers = & frv_cgen_insert_handlers[0];
   2265   cd->extract_handlers = & frv_cgen_extract_handlers[0];
   2266 
   2267   cd->insert_operand = frv_cgen_insert_operand;
   2268   cd->extract_operand = frv_cgen_extract_operand;
   2269 
   2270   cd->get_int_operand = frv_cgen_get_int_operand;
   2271   cd->set_int_operand = frv_cgen_set_int_operand;
   2272   cd->get_vma_operand = frv_cgen_get_vma_operand;
   2273   cd->set_vma_operand = frv_cgen_set_vma_operand;
   2274 }
   2275