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