/* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
/* Instruction building/extraction support for frv. -*- C -*-

   THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
   - the resultant file is machine generated, cgen-ibld.in isn't

   Copyright (C) 1996-2021 Free Software Foundation, Inc.

   This file is part of libopcodes.

   This library is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   It is distributed in the hope that it will be useful, but WITHOUT
   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
   License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software Foundation, Inc.,
   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */

/* ??? Eventually more and more of this stuff can go to cpu-independent files.
   Keep that in mind.  */

#include "sysdep.h"
#include <stdio.h>
#include "ansidecl.h"
#include "dis-asm.h"
#include "bfd.h"
#include "symcat.h"
#include "frv-desc.h"
#include "frv-opc.h"
#include "cgen/basic-modes.h"
#include "opintl.h"
#include "safe-ctype.h"

#undef  min
#define min(a,b) ((a) < (b) ? (a) : (b))
#undef  max
#define max(a,b) ((a) > (b) ? (a) : (b))

/* Used by the ifield rtx function.  */
#define FLD(f) (fields->f)

static const char * insert_normal
  (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
   unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
static const char * insert_insn_normal
  (CGEN_CPU_DESC, const CGEN_INSN *,
   CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
static int extract_normal
  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
   unsigned int, unsigned int, unsigned int, unsigned int,
   unsigned int, unsigned int, bfd_vma, long *);
static int extract_insn_normal
  (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
   CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
#if CGEN_INT_INSN_P
static void put_insn_int_value
  (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
#endif
#if ! CGEN_INT_INSN_P
static CGEN_INLINE void insert_1
  (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
static CGEN_INLINE int fill_cache
  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
static CGEN_INLINE long extract_1
  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
#endif

/* Operand insertion.  */

#if ! CGEN_INT_INSN_P

/* Subroutine of insert_normal.  */

static CGEN_INLINE void
insert_1 (CGEN_CPU_DESC cd,
	  unsigned long value,
	  int start,
	  int length,
	  int word_length,
	  unsigned char *bufp)
{
  unsigned long x, mask;
  int shift;

  x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);

  /* Written this way to avoid undefined behaviour.  */
  mask = (1UL << (length - 1) << 1) - 1;
  if (CGEN_INSN_LSB0_P)
    shift = (start + 1) - length;
  else
    shift = (word_length - (start + length));
  x = (x & ~(mask << shift)) | ((value & mask) << shift);

  cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x, cd->endian);
}

#endif /* ! CGEN_INT_INSN_P */

/* Default insertion routine.

   ATTRS is a mask of the boolean attributes.
   WORD_OFFSET is the offset in bits from the start of the insn of the value.
   WORD_LENGTH is the length of the word in bits in which the value resides.
   START is the starting bit number in the word, architecture origin.
   LENGTH is the length of VALUE in bits.
   TOTAL_LENGTH is the total length of the insn in bits.

   The result is an error message or NULL if success.  */

/* ??? This duplicates functionality with bfd's howto table and
   bfd_install_relocation.  */
/* ??? This doesn't handle bfd_vma's.  Create another function when
   necessary.  */

static const char *
insert_normal (CGEN_CPU_DESC cd,
	       long value,
	       unsigned int attrs,
	       unsigned int word_offset,
	       unsigned int start,
	       unsigned int length,
	       unsigned int word_length,
	       unsigned int total_length,
	       CGEN_INSN_BYTES_PTR buffer)
{
  static char errbuf[100];
  unsigned long mask;

  /* If LENGTH is zero, this operand doesn't contribute to the value.  */
  if (length == 0)
    return NULL;

  /* Written this way to avoid undefined behaviour.  */
  mask = (1UL << (length - 1) << 1) - 1;

  if (word_length > 8 * sizeof (CGEN_INSN_INT))
    abort ();

  /* For architectures with insns smaller than the base-insn-bitsize,
     word_length may be too big.  */
  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    {
      if (word_offset == 0
	  && word_length > total_length)
	word_length = total_length;
    }

  /* Ensure VALUE will fit.  */
  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
    {
      long minval = - (1UL << (length - 1));
      unsigned long maxval = mask;

      if ((value > 0 && (unsigned long) value > maxval)
	  || value < minval)
	{
	  /* xgettext:c-format */
	  sprintf (errbuf,
		   _("operand out of range (%ld not between %ld and %lu)"),
		   value, minval, maxval);
	  return errbuf;
	}
    }
  else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
    {
      unsigned long maxval = mask;
      unsigned long val = (unsigned long) value;

      /* For hosts with a word size > 32 check to see if value has been sign
	 extended beyond 32 bits.  If so then ignore these higher sign bits
	 as the user is attempting to store a 32-bit signed value into an
	 unsigned 32-bit field which is allowed.  */
      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
	val &= 0xFFFFFFFF;

      if (val > maxval)
	{
	  /* xgettext:c-format */
	  sprintf (errbuf,
		   _("operand out of range (0x%lx not between 0 and 0x%lx)"),
		   val, maxval);
	  return errbuf;
	}
    }
  else
    {
      if (! cgen_signed_overflow_ok_p (cd))
	{
	  long minval = - (1UL << (length - 1));
	  long maxval =   (1UL << (length - 1)) - 1;

	  if (value < minval || value > maxval)
	    {
	      sprintf
		/* xgettext:c-format */
		(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
		 value, minval, maxval);
	      return errbuf;
	    }
	}
    }

#if CGEN_INT_INSN_P

  {
    int shift_within_word, shift_to_word, shift;

    /* How to shift the value to BIT0 of the word.  */
    shift_to_word = total_length - (word_offset + word_length);

    /* How to shift the value to the field within the word.  */
    if (CGEN_INSN_LSB0_P)
      shift_within_word = start + 1 - length;
    else
      shift_within_word = word_length - start - length;

    /* The total SHIFT, then mask in the value.  */
    shift = shift_to_word + shift_within_word;
    *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
  }

#else /* ! CGEN_INT_INSN_P */

  {
    unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;

    insert_1 (cd, value, start, length, word_length, bufp);
  }

#endif /* ! CGEN_INT_INSN_P */

  return NULL;
}

/* Default insn builder (insert handler).
   The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
   that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
   recorded in host byte order, otherwise BUFFER is an array of bytes
   and the value is recorded in target byte order).
   The result is an error message or NULL if success.  */

static const char *
insert_insn_normal (CGEN_CPU_DESC cd,
		    const CGEN_INSN * insn,
		    CGEN_FIELDS * fields,
		    CGEN_INSN_BYTES_PTR buffer,
		    bfd_vma pc)
{
  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
  unsigned long value;
  const CGEN_SYNTAX_CHAR_TYPE * syn;

  CGEN_INIT_INSERT (cd);
  value = CGEN_INSN_BASE_VALUE (insn);

  /* If we're recording insns as numbers (rather than a string of bytes),
     target byte order handling is deferred until later.  */

#if CGEN_INT_INSN_P

  put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
		      CGEN_FIELDS_BITSIZE (fields), value);

#else

  cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
                                        (unsigned) CGEN_FIELDS_BITSIZE (fields)),
		       value, cd->insn_endian);

#endif /* ! CGEN_INT_INSN_P */

  /* ??? It would be better to scan the format's fields.
     Still need to be able to insert a value based on the operand though;
     e.g. storing a branch displacement that got resolved later.
     Needs more thought first.  */

  for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
    {
      const char *errmsg;

      if (CGEN_SYNTAX_CHAR_P (* syn))
	continue;

      errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
				       fields, buffer, pc);
      if (errmsg)
	return errmsg;
    }

  return NULL;
}

#if CGEN_INT_INSN_P
/* Cover function to store an insn value into an integral insn.  Must go here
   because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */

static void
put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
		    CGEN_INSN_BYTES_PTR buf,
		    int length,
		    int insn_length,
		    CGEN_INSN_INT value)
{
  /* For architectures with insns smaller than the base-insn-bitsize,
     length may be too big.  */
  if (length > insn_length)
    *buf = value;
  else
    {
      int shift = insn_length - length;
      /* Written this way to avoid undefined behaviour.  */
      CGEN_INSN_INT mask = length == 0 ? 0 : (1UL << (length - 1) << 1) - 1;

      *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
    }
}
#endif

/* Operand extraction.  */

#if ! CGEN_INT_INSN_P

/* Subroutine of extract_normal.
   Ensure sufficient bytes are cached in EX_INFO.
   OFFSET is the offset in bytes from the start of the insn of the value.
   BYTES is the length of the needed value.
   Returns 1 for success, 0 for failure.  */

static CGEN_INLINE int
fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
	    CGEN_EXTRACT_INFO *ex_info,
	    int offset,
	    int bytes,
	    bfd_vma pc)
{
  /* It's doubtful that the middle part has already been fetched so
     we don't optimize that case.  kiss.  */
  unsigned int mask;
  disassemble_info *info = (disassemble_info *) ex_info->dis_info;

  /* First do a quick check.  */
  mask = (1 << bytes) - 1;
  if (((ex_info->valid >> offset) & mask) == mask)
    return 1;

  /* Search for the first byte we need to read.  */
  for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
    if (! (mask & ex_info->valid))
      break;

  if (bytes)
    {
      int status;

      pc += offset;
      status = (*info->read_memory_func)
	(pc, ex_info->insn_bytes + offset, bytes, info);

      if (status != 0)
	{
	  (*info->memory_error_func) (status, pc, info);
	  return 0;
	}

      ex_info->valid |= ((1 << bytes) - 1) << offset;
    }

  return 1;
}

/* Subroutine of extract_normal.  */

static CGEN_INLINE long
extract_1 (CGEN_CPU_DESC cd,
	   CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
	   int start,
	   int length,
	   int word_length,
	   unsigned char *bufp,
	   bfd_vma pc ATTRIBUTE_UNUSED)
{
  unsigned long x;
  int shift;

  x = cgen_get_insn_value (cd, bufp, word_length, cd->endian);

  if (CGEN_INSN_LSB0_P)
    shift = (start + 1) - length;
  else
    shift = (word_length - (start + length));
  return x >> shift;
}

#endif /* ! CGEN_INT_INSN_P */

/* Default extraction routine.

   INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
   or sometimes less for cases like the m32r where the base insn size is 32
   but some insns are 16 bits.
   ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
   but for generality we take a bitmask of all of them.
   WORD_OFFSET is the offset in bits from the start of the insn of the value.
   WORD_LENGTH is the length of the word in bits in which the value resides.
   START is the starting bit number in the word, architecture origin.
   LENGTH is the length of VALUE in bits.
   TOTAL_LENGTH is the total length of the insn in bits.

   Returns 1 for success, 0 for failure.  */

/* ??? The return code isn't properly used.  wip.  */

/* ??? This doesn't handle bfd_vma's.  Create another function when
   necessary.  */

static int
extract_normal (CGEN_CPU_DESC cd,
#if ! CGEN_INT_INSN_P
		CGEN_EXTRACT_INFO *ex_info,
#else
		CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
#endif
		CGEN_INSN_INT insn_value,
		unsigned int attrs,
		unsigned int word_offset,
		unsigned int start,
		unsigned int length,
		unsigned int word_length,
		unsigned int total_length,
#if ! CGEN_INT_INSN_P
		bfd_vma pc,
#else
		bfd_vma pc ATTRIBUTE_UNUSED,
#endif
		long *valuep)
{
  long value, mask;

  /* If LENGTH is zero, this operand doesn't contribute to the value
     so give it a standard value of zero.  */
  if (length == 0)
    {
      *valuep = 0;
      return 1;
    }

  if (word_length > 8 * sizeof (CGEN_INSN_INT))
    abort ();

  /* For architectures with insns smaller than the insn-base-bitsize,
     word_length may be too big.  */
  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
    {
      if (word_offset + word_length > total_length)
	word_length = total_length - word_offset;
    }

  /* Does the value reside in INSN_VALUE, and at the right alignment?  */

  if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
    {
      if (CGEN_INSN_LSB0_P)
	value = insn_value >> ((word_offset + start + 1) - length);
      else
	value = insn_value >> (total_length - ( word_offset + start + length));
    }

#if ! CGEN_INT_INSN_P

  else
    {
      unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;

      if (word_length > 8 * sizeof (CGEN_INSN_INT))
	abort ();

      if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
	{
	  *valuep = 0;
	  return 0;
	}

      value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
    }

#endif /* ! CGEN_INT_INSN_P */

  /* Written this way to avoid undefined behaviour.  */
  mask = (1UL << (length - 1) << 1) - 1;

  value &= mask;
  /* sign extend? */
  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
      && (value & (1UL << (length - 1))))
    value |= ~mask;

  *valuep = value;

  return 1;
}

/* Default insn extractor.

   INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
   The extracted fields are stored in FIELDS.
   EX_INFO is used to handle reading variable length insns.
   Return the length of the insn in bits, or 0 if no match,
   or -1 if an error occurs fetching data (memory_error_func will have
   been called).  */

static int
extract_insn_normal (CGEN_CPU_DESC cd,
		     const CGEN_INSN *insn,
		     CGEN_EXTRACT_INFO *ex_info,
		     CGEN_INSN_INT insn_value,
		     CGEN_FIELDS *fields,
		     bfd_vma pc)
{
  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
  const CGEN_SYNTAX_CHAR_TYPE *syn;

  CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);

  CGEN_INIT_EXTRACT (cd);

  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
    {
      int length;

      if (CGEN_SYNTAX_CHAR_P (*syn))
	continue;

      length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
					ex_info, insn_value, fields, pc);
      if (length <= 0)
	return length;
    }

  /* We recognized and successfully extracted this insn.  */
  return CGEN_INSN_BITSIZE (insn);
}

/* Machine generated code added here.  */

const char * frv_cgen_insert_operand
  (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);

/* Main entry point for operand insertion.

   This function is basically just a big switch statement.  Earlier versions
   used tables to look up the function to use, but
   - if the table contains both assembler and disassembler functions then
     the disassembler contains much of the assembler and vice-versa,
   - there's a lot of inlining possibilities as things grow,
   - using a switch statement avoids the function call overhead.

   This function could be moved into `parse_insn_normal', but keeping it
   separate makes clear the interface between `parse_insn_normal' and each of
   the handlers.  It's also needed by GAS to insert operands that couldn't be
   resolved during parsing.  */

const char *
frv_cgen_insert_operand (CGEN_CPU_DESC cd,
			     int opindex,
			     CGEN_FIELDS * fields,
			     CGEN_INSN_BYTES_PTR buffer,
			     bfd_vma pc ATTRIBUTE_UNUSED)
{
  const char * errmsg = NULL;
  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);

  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_A1 :
      errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACC40SI :
      errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACC40SK :
      errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACC40UI :
      errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACC40UK :
      errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACCGI :
      errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ACCGK :
      errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CCI :
      errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CPRI :
      errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CPRJ :
      errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CPRK :
      errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CRI :
      errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CRJ :
      errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CRJ_INT :
      {
        long value = fields->f_CRj_int;
        value = ((value) - (4));
        errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer);
      }
      break;
    case FRV_OPERAND_CRK :
      errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FCCI_1 :
      errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FCCI_2 :
      errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FCCI_3 :
      errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FCCK :
      errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRDOUBLEI :
      errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRDOUBLEK :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRI :
      errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTI :
      errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTIEVEN :
      errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTJ :
      errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTJEVEN :
      errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTK :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRINTKEVEN :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRJ :
      errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRK :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRKHI :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_FRKLO :
      errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRDOUBLEK :
      errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRI :
      errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRJ :
      errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRK :
      errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRKHI :
      errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_GRKLO :
      errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ICCI_1 :
      errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ICCI_2 :
      errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ICCI_3 :
      errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LI :
      errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LRAD :
      errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LRAE :
      errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LRAS :
      errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_TLBPRL :
      errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_TLBPROPX :
      errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer);
      break;
    case FRV_OPERAND_AE :
      errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CALLANN :
      errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
      break;
    case FRV_OPERAND_CCOND :
      errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_COND :
      errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_D12 :
      errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
      break;
    case FRV_OPERAND_DEBUG :
      errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_EIR :
      errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_HINT :
      errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_HINT_TAKEN :
      errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LABEL16 :
      {
        long value = fields->f_label16;
        value = ((SI) (((value) - (pc))) >> (2));
        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer);
      }
      break;
    case FRV_OPERAND_LABEL24 :
      {
{
  FLD (f_labelH6) = ((SI) (((FLD (f_label24)) - (pc))) >> (20));
  FLD (f_labelL18) = ((((UINT) (((FLD (f_label24)) - (pc))) >> (2))) & (262143));
}
        errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer);
        if (errmsg)
          break;
        errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer);
        if (errmsg)
          break;
      }
      break;
    case FRV_OPERAND_LDANN :
      errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LDDANN :
      errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
      break;
    case FRV_OPERAND_LOCK :
      errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_PACK :
      errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S10 :
      errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S12 :
      errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S16 :
      errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S5 :
      errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S6 :
      errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_S6_1 :
      errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_SLO16 :
      errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
      break;
    case FRV_OPERAND_SPR :
      {
{
  FLD (f_spr_h) = ((UINT) (FLD (f_spr)) >> (6));
  FLD (f_spr_l) = ((FLD (f_spr)) & (63));
}
        errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer);
        if (errmsg)
          break;
        errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer);
        if (errmsg)
          break;
      }
      break;
    case FRV_OPERAND_U12 :
      {
{
  FLD (f_u12_h) = ((SI) (FLD (f_u12)) >> (6));
  FLD (f_u12_l) = ((FLD (f_u12)) & (63));
}
        errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer);
        if (errmsg)
          break;
        errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer);
        if (errmsg)
          break;
      }
      break;
    case FRV_OPERAND_U16 :
      errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
      break;
    case FRV_OPERAND_U6 :
      errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer);
      break;
    case FRV_OPERAND_UHI16 :
      errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
      break;
    case FRV_OPERAND_ULO16 :
      errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while building insn"),
	 opindex);
      abort ();
  }

  return errmsg;
}

int frv_cgen_extract_operand
  (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);

/* Main entry point for operand extraction.
   The result is <= 0 for error, >0 for success.
   ??? Actual values aren't well defined right now.

   This function is basically just a big switch statement.  Earlier versions
   used tables to look up the function to use, but
   - if the table contains both assembler and disassembler functions then
     the disassembler contains much of the assembler and vice-versa,
   - there's a lot of inlining possibilities as things grow,
   - using a switch statement avoids the function call overhead.

   This function could be moved into `print_insn_normal', but keeping it
   separate makes clear the interface between `print_insn_normal' and each of
   the handlers.  */

int
frv_cgen_extract_operand (CGEN_CPU_DESC cd,
			     int opindex,
			     CGEN_EXTRACT_INFO *ex_info,
			     CGEN_INSN_INT insn_value,
			     CGEN_FIELDS * fields,
			     bfd_vma pc)
{
  /* Assume success (for those operands that are nops).  */
  int length = 1;
  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);

  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
      break;
    case FRV_OPERAND_A1 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
      break;
    case FRV_OPERAND_ACC40SI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si);
      break;
    case FRV_OPERAND_ACC40SK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk);
      break;
    case FRV_OPERAND_ACC40UI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui);
      break;
    case FRV_OPERAND_ACC40UK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk);
      break;
    case FRV_OPERAND_ACCGI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi);
      break;
    case FRV_OPERAND_ACCGK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk);
      break;
    case FRV_OPERAND_CCI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi);
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
      break;
    case FRV_OPERAND_CPRI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi);
      break;
    case FRV_OPERAND_CPRJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj);
      break;
    case FRV_OPERAND_CPRK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
      break;
    case FRV_OPERAND_CRI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi);
      break;
    case FRV_OPERAND_CRJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj);
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float);
      break;
    case FRV_OPERAND_CRJ_INT :
      {
        long value;
        length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value);
        value = ((value) + (4));
        fields->f_CRj_int = value;
      }
      break;
    case FRV_OPERAND_CRK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk);
      break;
    case FRV_OPERAND_FCCI_1 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1);
      break;
    case FRV_OPERAND_FCCI_2 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2);
      break;
    case FRV_OPERAND_FCCI_3 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3);
      break;
    case FRV_OPERAND_FCCK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk);
      break;
    case FRV_OPERAND_FRDOUBLEI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
      break;
    case FRV_OPERAND_FRDOUBLEK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_FRI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
      break;
    case FRV_OPERAND_FRINTI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
      break;
    case FRV_OPERAND_FRINTIEVEN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
      break;
    case FRV_OPERAND_FRINTJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
      break;
    case FRV_OPERAND_FRINTJEVEN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
      break;
    case FRV_OPERAND_FRINTK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_FRINTKEVEN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_FRJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
      break;
    case FRV_OPERAND_FRK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_FRKHI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_FRKLO :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
      break;
    case FRV_OPERAND_GRDOUBLEK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
      break;
    case FRV_OPERAND_GRI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi);
      break;
    case FRV_OPERAND_GRJ :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj);
      break;
    case FRV_OPERAND_GRK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
      break;
    case FRV_OPERAND_GRKHI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
      break;
    case FRV_OPERAND_GRKLO :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
      break;
    case FRV_OPERAND_ICCI_1 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1);
      break;
    case FRV_OPERAND_ICCI_2 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2);
      break;
    case FRV_OPERAND_ICCI_3 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3);
      break;
    case FRV_OPERAND_LI :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI);
      break;
    case FRV_OPERAND_LRAD :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD);
      break;
    case FRV_OPERAND_LRAE :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE);
      break;
    case FRV_OPERAND_LRAS :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS);
      break;
    case FRV_OPERAND_TLBPRL :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL);
      break;
    case FRV_OPERAND_TLBPROPX :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx);
      break;
    case FRV_OPERAND_AE :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
      break;
    case FRV_OPERAND_CALLANN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
      break;
    case FRV_OPERAND_CCOND :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
      break;
    case FRV_OPERAND_COND :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond);
      break;
    case FRV_OPERAND_D12 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
      break;
    case FRV_OPERAND_DEBUG :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug);
      break;
    case FRV_OPERAND_EIR :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir);
      break;
    case FRV_OPERAND_HINT :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
      break;
    case FRV_OPERAND_HINT_TAKEN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
      break;
    case FRV_OPERAND_LABEL16 :
      {
        long value;
        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);
        value = ((((value) * (4))) + (pc));
        fields->f_label16 = value;
      }
      break;
    case FRV_OPERAND_LABEL24 :
      {
        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6);
        if (length <= 0) break;
        length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
        if (length <= 0) break;
{
  FLD (f_label24) = ((((((((FLD (f_labelH6)) * (((1) << (18))))) | (FLD (f_labelL18)))) * (4))) + (pc));
}
      }
      break;
    case FRV_OPERAND_LDANN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
      break;
    case FRV_OPERAND_LDDANN :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
      break;
    case FRV_OPERAND_LOCK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
      break;
    case FRV_OPERAND_PACK :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack);
      break;
    case FRV_OPERAND_S10 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10);
      break;
    case FRV_OPERAND_S12 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
      break;
    case FRV_OPERAND_S16 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
      break;
    case FRV_OPERAND_S5 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5);
      break;
    case FRV_OPERAND_S6 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6);
      break;
    case FRV_OPERAND_S6_1 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1);
      break;
    case FRV_OPERAND_SLO16 :
      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
      break;
    case FRV_OPERAND_SPR :
      {
        length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h);
        if (length <= 0) break;
        length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l);
        if (length <= 0) break;
{
  FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l)));
}
      }
      break;
    case FRV_OPERAND_U12 :
      {
        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h);
        if (length <= 0) break;
        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
        if (length <= 0) break;
{
  FLD (f_u12) = ((((FLD (f_u12_h)) * (64))) | (FLD (f_u12_l)));
}
      }
      break;
    case FRV_OPERAND_U16 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
      break;
    case FRV_OPERAND_U6 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6);
      break;
    case FRV_OPERAND_UHI16 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
      break;
    case FRV_OPERAND_ULO16 :
      length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while decoding insn"),
	 opindex);
      abort ();
    }

  return length;
}

cgen_insert_fn * const frv_cgen_insert_handlers[] =
{
  insert_insn_normal,
};

cgen_extract_fn * const frv_cgen_extract_handlers[] =
{
  extract_insn_normal,
};

int frv_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
bfd_vma frv_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);

/* Getting values from cgen_fields is handled by a collection of functions.
   They are distinguished by the type of the VALUE argument they return.
   TODO: floating point, inlining support, remove cases where result type
   not appropriate.  */

int
frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
			     int opindex,
			     const CGEN_FIELDS * fields)
{
  int value;

  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      value = fields->f_A;
      break;
    case FRV_OPERAND_A1 :
      value = fields->f_A;
      break;
    case FRV_OPERAND_ACC40SI :
      value = fields->f_ACC40Si;
      break;
    case FRV_OPERAND_ACC40SK :
      value = fields->f_ACC40Sk;
      break;
    case FRV_OPERAND_ACC40UI :
      value = fields->f_ACC40Ui;
      break;
    case FRV_OPERAND_ACC40UK :
      value = fields->f_ACC40Uk;
      break;
    case FRV_OPERAND_ACCGI :
      value = fields->f_ACCGi;
      break;
    case FRV_OPERAND_ACCGK :
      value = fields->f_ACCGk;
      break;
    case FRV_OPERAND_CCI :
      value = fields->f_CCi;
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      value = fields->f_CPRk;
      break;
    case FRV_OPERAND_CPRI :
      value = fields->f_CPRi;
      break;
    case FRV_OPERAND_CPRJ :
      value = fields->f_CPRj;
      break;
    case FRV_OPERAND_CPRK :
      value = fields->f_CPRk;
      break;
    case FRV_OPERAND_CRI :
      value = fields->f_CRi;
      break;
    case FRV_OPERAND_CRJ :
      value = fields->f_CRj;
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      value = fields->f_CRj_float;
      break;
    case FRV_OPERAND_CRJ_INT :
      value = fields->f_CRj_int;
      break;
    case FRV_OPERAND_CRK :
      value = fields->f_CRk;
      break;
    case FRV_OPERAND_FCCI_1 :
      value = fields->f_FCCi_1;
      break;
    case FRV_OPERAND_FCCI_2 :
      value = fields->f_FCCi_2;
      break;
    case FRV_OPERAND_FCCI_3 :
      value = fields->f_FCCi_3;
      break;
    case FRV_OPERAND_FCCK :
      value = fields->f_FCCk;
      break;
    case FRV_OPERAND_FRDOUBLEI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRDOUBLEK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTIEVEN :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRINTJEVEN :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRINTK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRINTKEVEN :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRKHI :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRKLO :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_GRDOUBLEK :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRI :
      value = fields->f_GRi;
      break;
    case FRV_OPERAND_GRJ :
      value = fields->f_GRj;
      break;
    case FRV_OPERAND_GRK :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRKHI :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRKLO :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_ICCI_1 :
      value = fields->f_ICCi_1;
      break;
    case FRV_OPERAND_ICCI_2 :
      value = fields->f_ICCi_2;
      break;
    case FRV_OPERAND_ICCI_3 :
      value = fields->f_ICCi_3;
      break;
    case FRV_OPERAND_LI :
      value = fields->f_LI;
      break;
    case FRV_OPERAND_LRAD :
      value = fields->f_LRAD;
      break;
    case FRV_OPERAND_LRAE :
      value = fields->f_LRAE;
      break;
    case FRV_OPERAND_LRAS :
      value = fields->f_LRAS;
      break;
    case FRV_OPERAND_TLBPRL :
      value = fields->f_TLBPRL;
      break;
    case FRV_OPERAND_TLBPROPX :
      value = fields->f_TLBPRopx;
      break;
    case FRV_OPERAND_AE :
      value = fields->f_ae;
      break;
    case FRV_OPERAND_CALLANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_CCOND :
      value = fields->f_ccond;
      break;
    case FRV_OPERAND_COND :
      value = fields->f_cond;
      break;
    case FRV_OPERAND_D12 :
      value = fields->f_d12;
      break;
    case FRV_OPERAND_DEBUG :
      value = fields->f_debug;
      break;
    case FRV_OPERAND_EIR :
      value = fields->f_eir;
      break;
    case FRV_OPERAND_HINT :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_HINT_TAKEN :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_LABEL16 :
      value = fields->f_label16;
      break;
    case FRV_OPERAND_LABEL24 :
      value = fields->f_label24;
      break;
    case FRV_OPERAND_LDANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_LDDANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_LOCK :
      value = fields->f_lock;
      break;
    case FRV_OPERAND_PACK :
      value = fields->f_pack;
      break;
    case FRV_OPERAND_S10 :
      value = fields->f_s10;
      break;
    case FRV_OPERAND_S12 :
      value = fields->f_d12;
      break;
    case FRV_OPERAND_S16 :
      value = fields->f_s16;
      break;
    case FRV_OPERAND_S5 :
      value = fields->f_s5;
      break;
    case FRV_OPERAND_S6 :
      value = fields->f_s6;
      break;
    case FRV_OPERAND_S6_1 :
      value = fields->f_s6_1;
      break;
    case FRV_OPERAND_SLO16 :
      value = fields->f_s16;
      break;
    case FRV_OPERAND_SPR :
      value = fields->f_spr;
      break;
    case FRV_OPERAND_U12 :
      value = fields->f_u12;
      break;
    case FRV_OPERAND_U16 :
      value = fields->f_u16;
      break;
    case FRV_OPERAND_U6 :
      value = fields->f_u6;
      break;
    case FRV_OPERAND_UHI16 :
      value = fields->f_u16;
      break;
    case FRV_OPERAND_ULO16 :
      value = fields->f_u16;
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while getting int operand"),
	 opindex);
      abort ();
  }

  return value;
}

bfd_vma
frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
			     int opindex,
			     const CGEN_FIELDS * fields)
{
  bfd_vma value;

  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      value = fields->f_A;
      break;
    case FRV_OPERAND_A1 :
      value = fields->f_A;
      break;
    case FRV_OPERAND_ACC40SI :
      value = fields->f_ACC40Si;
      break;
    case FRV_OPERAND_ACC40SK :
      value = fields->f_ACC40Sk;
      break;
    case FRV_OPERAND_ACC40UI :
      value = fields->f_ACC40Ui;
      break;
    case FRV_OPERAND_ACC40UK :
      value = fields->f_ACC40Uk;
      break;
    case FRV_OPERAND_ACCGI :
      value = fields->f_ACCGi;
      break;
    case FRV_OPERAND_ACCGK :
      value = fields->f_ACCGk;
      break;
    case FRV_OPERAND_CCI :
      value = fields->f_CCi;
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      value = fields->f_CPRk;
      break;
    case FRV_OPERAND_CPRI :
      value = fields->f_CPRi;
      break;
    case FRV_OPERAND_CPRJ :
      value = fields->f_CPRj;
      break;
    case FRV_OPERAND_CPRK :
      value = fields->f_CPRk;
      break;
    case FRV_OPERAND_CRI :
      value = fields->f_CRi;
      break;
    case FRV_OPERAND_CRJ :
      value = fields->f_CRj;
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      value = fields->f_CRj_float;
      break;
    case FRV_OPERAND_CRJ_INT :
      value = fields->f_CRj_int;
      break;
    case FRV_OPERAND_CRK :
      value = fields->f_CRk;
      break;
    case FRV_OPERAND_FCCI_1 :
      value = fields->f_FCCi_1;
      break;
    case FRV_OPERAND_FCCI_2 :
      value = fields->f_FCCi_2;
      break;
    case FRV_OPERAND_FCCI_3 :
      value = fields->f_FCCi_3;
      break;
    case FRV_OPERAND_FCCK :
      value = fields->f_FCCk;
      break;
    case FRV_OPERAND_FRDOUBLEI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRDOUBLEK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTI :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTIEVEN :
      value = fields->f_FRi;
      break;
    case FRV_OPERAND_FRINTJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRINTJEVEN :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRINTK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRINTKEVEN :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRJ :
      value = fields->f_FRj;
      break;
    case FRV_OPERAND_FRK :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRKHI :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_FRKLO :
      value = fields->f_FRk;
      break;
    case FRV_OPERAND_GRDOUBLEK :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRI :
      value = fields->f_GRi;
      break;
    case FRV_OPERAND_GRJ :
      value = fields->f_GRj;
      break;
    case FRV_OPERAND_GRK :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRKHI :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_GRKLO :
      value = fields->f_GRk;
      break;
    case FRV_OPERAND_ICCI_1 :
      value = fields->f_ICCi_1;
      break;
    case FRV_OPERAND_ICCI_2 :
      value = fields->f_ICCi_2;
      break;
    case FRV_OPERAND_ICCI_3 :
      value = fields->f_ICCi_3;
      break;
    case FRV_OPERAND_LI :
      value = fields->f_LI;
      break;
    case FRV_OPERAND_LRAD :
      value = fields->f_LRAD;
      break;
    case FRV_OPERAND_LRAE :
      value = fields->f_LRAE;
      break;
    case FRV_OPERAND_LRAS :
      value = fields->f_LRAS;
      break;
    case FRV_OPERAND_TLBPRL :
      value = fields->f_TLBPRL;
      break;
    case FRV_OPERAND_TLBPROPX :
      value = fields->f_TLBPRopx;
      break;
    case FRV_OPERAND_AE :
      value = fields->f_ae;
      break;
    case FRV_OPERAND_CALLANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_CCOND :
      value = fields->f_ccond;
      break;
    case FRV_OPERAND_COND :
      value = fields->f_cond;
      break;
    case FRV_OPERAND_D12 :
      value = fields->f_d12;
      break;
    case FRV_OPERAND_DEBUG :
      value = fields->f_debug;
      break;
    case FRV_OPERAND_EIR :
      value = fields->f_eir;
      break;
    case FRV_OPERAND_HINT :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_HINT_TAKEN :
      value = fields->f_hint;
      break;
    case FRV_OPERAND_LABEL16 :
      value = fields->f_label16;
      break;
    case FRV_OPERAND_LABEL24 :
      value = fields->f_label24;
      break;
    case FRV_OPERAND_LDANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_LDDANN :
      value = fields->f_reloc_ann;
      break;
    case FRV_OPERAND_LOCK :
      value = fields->f_lock;
      break;
    case FRV_OPERAND_PACK :
      value = fields->f_pack;
      break;
    case FRV_OPERAND_S10 :
      value = fields->f_s10;
      break;
    case FRV_OPERAND_S12 :
      value = fields->f_d12;
      break;
    case FRV_OPERAND_S16 :
      value = fields->f_s16;
      break;
    case FRV_OPERAND_S5 :
      value = fields->f_s5;
      break;
    case FRV_OPERAND_S6 :
      value = fields->f_s6;
      break;
    case FRV_OPERAND_S6_1 :
      value = fields->f_s6_1;
      break;
    case FRV_OPERAND_SLO16 :
      value = fields->f_s16;
      break;
    case FRV_OPERAND_SPR :
      value = fields->f_spr;
      break;
    case FRV_OPERAND_U12 :
      value = fields->f_u12;
      break;
    case FRV_OPERAND_U16 :
      value = fields->f_u16;
      break;
    case FRV_OPERAND_U6 :
      value = fields->f_u6;
      break;
    case FRV_OPERAND_UHI16 :
      value = fields->f_u16;
      break;
    case FRV_OPERAND_ULO16 :
      value = fields->f_u16;
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while getting vma operand"),
	 opindex);
      abort ();
  }

  return value;
}

void frv_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
void frv_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);

/* Stuffing values in cgen_fields is handled by a collection of functions.
   They are distinguished by the type of the VALUE argument they accept.
   TODO: floating point, inlining support, remove cases where argument type
   not appropriate.  */

void
frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
			     int opindex,
			     CGEN_FIELDS * fields,
			     int value)
{
  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      fields->f_A = value;
      break;
    case FRV_OPERAND_A1 :
      fields->f_A = value;
      break;
    case FRV_OPERAND_ACC40SI :
      fields->f_ACC40Si = value;
      break;
    case FRV_OPERAND_ACC40SK :
      fields->f_ACC40Sk = value;
      break;
    case FRV_OPERAND_ACC40UI :
      fields->f_ACC40Ui = value;
      break;
    case FRV_OPERAND_ACC40UK :
      fields->f_ACC40Uk = value;
      break;
    case FRV_OPERAND_ACCGI :
      fields->f_ACCGi = value;
      break;
    case FRV_OPERAND_ACCGK :
      fields->f_ACCGk = value;
      break;
    case FRV_OPERAND_CCI :
      fields->f_CCi = value;
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      fields->f_CPRk = value;
      break;
    case FRV_OPERAND_CPRI :
      fields->f_CPRi = value;
      break;
    case FRV_OPERAND_CPRJ :
      fields->f_CPRj = value;
      break;
    case FRV_OPERAND_CPRK :
      fields->f_CPRk = value;
      break;
    case FRV_OPERAND_CRI :
      fields->f_CRi = value;
      break;
    case FRV_OPERAND_CRJ :
      fields->f_CRj = value;
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      fields->f_CRj_float = value;
      break;
    case FRV_OPERAND_CRJ_INT :
      fields->f_CRj_int = value;
      break;
    case FRV_OPERAND_CRK :
      fields->f_CRk = value;
      break;
    case FRV_OPERAND_FCCI_1 :
      fields->f_FCCi_1 = value;
      break;
    case FRV_OPERAND_FCCI_2 :
      fields->f_FCCi_2 = value;
      break;
    case FRV_OPERAND_FCCI_3 :
      fields->f_FCCi_3 = value;
      break;
    case FRV_OPERAND_FCCK :
      fields->f_FCCk = value;
      break;
    case FRV_OPERAND_FRDOUBLEI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRDOUBLEK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTIEVEN :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRINTJEVEN :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRINTK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRINTKEVEN :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRKHI :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRKLO :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_GRDOUBLEK :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRI :
      fields->f_GRi = value;
      break;
    case FRV_OPERAND_GRJ :
      fields->f_GRj = value;
      break;
    case FRV_OPERAND_GRK :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRKHI :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRKLO :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_ICCI_1 :
      fields->f_ICCi_1 = value;
      break;
    case FRV_OPERAND_ICCI_2 :
      fields->f_ICCi_2 = value;
      break;
    case FRV_OPERAND_ICCI_3 :
      fields->f_ICCi_3 = value;
      break;
    case FRV_OPERAND_LI :
      fields->f_LI = value;
      break;
    case FRV_OPERAND_LRAD :
      fields->f_LRAD = value;
      break;
    case FRV_OPERAND_LRAE :
      fields->f_LRAE = value;
      break;
    case FRV_OPERAND_LRAS :
      fields->f_LRAS = value;
      break;
    case FRV_OPERAND_TLBPRL :
      fields->f_TLBPRL = value;
      break;
    case FRV_OPERAND_TLBPROPX :
      fields->f_TLBPRopx = value;
      break;
    case FRV_OPERAND_AE :
      fields->f_ae = value;
      break;
    case FRV_OPERAND_CALLANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_CCOND :
      fields->f_ccond = value;
      break;
    case FRV_OPERAND_COND :
      fields->f_cond = value;
      break;
    case FRV_OPERAND_D12 :
      fields->f_d12 = value;
      break;
    case FRV_OPERAND_DEBUG :
      fields->f_debug = value;
      break;
    case FRV_OPERAND_EIR :
      fields->f_eir = value;
      break;
    case FRV_OPERAND_HINT :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_HINT_TAKEN :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_LABEL16 :
      fields->f_label16 = value;
      break;
    case FRV_OPERAND_LABEL24 :
      fields->f_label24 = value;
      break;
    case FRV_OPERAND_LDANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_LDDANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_LOCK :
      fields->f_lock = value;
      break;
    case FRV_OPERAND_PACK :
      fields->f_pack = value;
      break;
    case FRV_OPERAND_S10 :
      fields->f_s10 = value;
      break;
    case FRV_OPERAND_S12 :
      fields->f_d12 = value;
      break;
    case FRV_OPERAND_S16 :
      fields->f_s16 = value;
      break;
    case FRV_OPERAND_S5 :
      fields->f_s5 = value;
      break;
    case FRV_OPERAND_S6 :
      fields->f_s6 = value;
      break;
    case FRV_OPERAND_S6_1 :
      fields->f_s6_1 = value;
      break;
    case FRV_OPERAND_SLO16 :
      fields->f_s16 = value;
      break;
    case FRV_OPERAND_SPR :
      fields->f_spr = value;
      break;
    case FRV_OPERAND_U12 :
      fields->f_u12 = value;
      break;
    case FRV_OPERAND_U16 :
      fields->f_u16 = value;
      break;
    case FRV_OPERAND_U6 :
      fields->f_u6 = value;
      break;
    case FRV_OPERAND_UHI16 :
      fields->f_u16 = value;
      break;
    case FRV_OPERAND_ULO16 :
      fields->f_u16 = value;
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while setting int operand"),
	 opindex);
      abort ();
  }
}

void
frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
			     int opindex,
			     CGEN_FIELDS * fields,
			     bfd_vma value)
{
  switch (opindex)
    {
    case FRV_OPERAND_A0 :
      fields->f_A = value;
      break;
    case FRV_OPERAND_A1 :
      fields->f_A = value;
      break;
    case FRV_OPERAND_ACC40SI :
      fields->f_ACC40Si = value;
      break;
    case FRV_OPERAND_ACC40SK :
      fields->f_ACC40Sk = value;
      break;
    case FRV_OPERAND_ACC40UI :
      fields->f_ACC40Ui = value;
      break;
    case FRV_OPERAND_ACC40UK :
      fields->f_ACC40Uk = value;
      break;
    case FRV_OPERAND_ACCGI :
      fields->f_ACCGi = value;
      break;
    case FRV_OPERAND_ACCGK :
      fields->f_ACCGk = value;
      break;
    case FRV_OPERAND_CCI :
      fields->f_CCi = value;
      break;
    case FRV_OPERAND_CPRDOUBLEK :
      fields->f_CPRk = value;
      break;
    case FRV_OPERAND_CPRI :
      fields->f_CPRi = value;
      break;
    case FRV_OPERAND_CPRJ :
      fields->f_CPRj = value;
      break;
    case FRV_OPERAND_CPRK :
      fields->f_CPRk = value;
      break;
    case FRV_OPERAND_CRI :
      fields->f_CRi = value;
      break;
    case FRV_OPERAND_CRJ :
      fields->f_CRj = value;
      break;
    case FRV_OPERAND_CRJ_FLOAT :
      fields->f_CRj_float = value;
      break;
    case FRV_OPERAND_CRJ_INT :
      fields->f_CRj_int = value;
      break;
    case FRV_OPERAND_CRK :
      fields->f_CRk = value;
      break;
    case FRV_OPERAND_FCCI_1 :
      fields->f_FCCi_1 = value;
      break;
    case FRV_OPERAND_FCCI_2 :
      fields->f_FCCi_2 = value;
      break;
    case FRV_OPERAND_FCCI_3 :
      fields->f_FCCi_3 = value;
      break;
    case FRV_OPERAND_FCCK :
      fields->f_FCCk = value;
      break;
    case FRV_OPERAND_FRDOUBLEI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRDOUBLEJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRDOUBLEK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTI :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTIEVEN :
      fields->f_FRi = value;
      break;
    case FRV_OPERAND_FRINTJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRINTJEVEN :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRINTK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRINTKEVEN :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRJ :
      fields->f_FRj = value;
      break;
    case FRV_OPERAND_FRK :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRKHI :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_FRKLO :
      fields->f_FRk = value;
      break;
    case FRV_OPERAND_GRDOUBLEK :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRI :
      fields->f_GRi = value;
      break;
    case FRV_OPERAND_GRJ :
      fields->f_GRj = value;
      break;
    case FRV_OPERAND_GRK :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRKHI :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_GRKLO :
      fields->f_GRk = value;
      break;
    case FRV_OPERAND_ICCI_1 :
      fields->f_ICCi_1 = value;
      break;
    case FRV_OPERAND_ICCI_2 :
      fields->f_ICCi_2 = value;
      break;
    case FRV_OPERAND_ICCI_3 :
      fields->f_ICCi_3 = value;
      break;
    case FRV_OPERAND_LI :
      fields->f_LI = value;
      break;
    case FRV_OPERAND_LRAD :
      fields->f_LRAD = value;
      break;
    case FRV_OPERAND_LRAE :
      fields->f_LRAE = value;
      break;
    case FRV_OPERAND_LRAS :
      fields->f_LRAS = value;
      break;
    case FRV_OPERAND_TLBPRL :
      fields->f_TLBPRL = value;
      break;
    case FRV_OPERAND_TLBPROPX :
      fields->f_TLBPRopx = value;
      break;
    case FRV_OPERAND_AE :
      fields->f_ae = value;
      break;
    case FRV_OPERAND_CALLANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_CCOND :
      fields->f_ccond = value;
      break;
    case FRV_OPERAND_COND :
      fields->f_cond = value;
      break;
    case FRV_OPERAND_D12 :
      fields->f_d12 = value;
      break;
    case FRV_OPERAND_DEBUG :
      fields->f_debug = value;
      break;
    case FRV_OPERAND_EIR :
      fields->f_eir = value;
      break;
    case FRV_OPERAND_HINT :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_HINT_NOT_TAKEN :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_HINT_TAKEN :
      fields->f_hint = value;
      break;
    case FRV_OPERAND_LABEL16 :
      fields->f_label16 = value;
      break;
    case FRV_OPERAND_LABEL24 :
      fields->f_label24 = value;
      break;
    case FRV_OPERAND_LDANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_LDDANN :
      fields->f_reloc_ann = value;
      break;
    case FRV_OPERAND_LOCK :
      fields->f_lock = value;
      break;
    case FRV_OPERAND_PACK :
      fields->f_pack = value;
      break;
    case FRV_OPERAND_S10 :
      fields->f_s10 = value;
      break;
    case FRV_OPERAND_S12 :
      fields->f_d12 = value;
      break;
    case FRV_OPERAND_S16 :
      fields->f_s16 = value;
      break;
    case FRV_OPERAND_S5 :
      fields->f_s5 = value;
      break;
    case FRV_OPERAND_S6 :
      fields->f_s6 = value;
      break;
    case FRV_OPERAND_S6_1 :
      fields->f_s6_1 = value;
      break;
    case FRV_OPERAND_SLO16 :
      fields->f_s16 = value;
      break;
    case FRV_OPERAND_SPR :
      fields->f_spr = value;
      break;
    case FRV_OPERAND_U12 :
      fields->f_u12 = value;
      break;
    case FRV_OPERAND_U16 :
      fields->f_u16 = value;
      break;
    case FRV_OPERAND_U6 :
      fields->f_u6 = value;
      break;
    case FRV_OPERAND_UHI16 :
      fields->f_u16 = value;
      break;
    case FRV_OPERAND_ULO16 :
      fields->f_u16 = value;
      break;

    default :
      /* xgettext:c-format */
      opcodes_error_handler
	(_("internal error: unrecognized field %d while setting vma operand"),
	 opindex);
      abort ();
  }
}

/* Function to call before using the instruction builder tables.  */

void
frv_cgen_init_ibld_table (CGEN_CPU_DESC cd)
{
  cd->insert_handlers = & frv_cgen_insert_handlers[0];
  cd->extract_handlers = & frv_cgen_extract_handlers[0];

  cd->insert_operand = frv_cgen_insert_operand;
  cd->extract_operand = frv_cgen_extract_operand;

  cd->get_int_operand = frv_cgen_get_int_operand;
  cd->set_int_operand = frv_cgen_set_int_operand;
  cd->get_vma_operand = frv_cgen_get_vma_operand;
  cd->set_vma_operand = frv_cgen_set_vma_operand;
}
