1214571Sdim/* Instruction building/extraction support for mep. -*- C -*-
2214571Sdim
3214571Sdim   THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
4214571Sdim   - the resultant file is machine generated, cgen-ibld.in isn't
5214571Sdim
6214571Sdim   Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006
7214571Sdim   Free Software Foundation, Inc.
8214571Sdim
9214571Sdim   This file is part of the GNU Binutils and GDB, the GNU debugger.
10214571Sdim
11214571Sdim   This program is free software; you can redistribute it and/or modify
12214571Sdim   it under the terms of the GNU General Public License as published by
13214571Sdim   the Free Software Foundation; either version 2, or (at your option)
14214571Sdim   any later version.
15214571Sdim
16214571Sdim   This program is distributed in the hope that it will be useful,
17214571Sdim   but WITHOUT ANY WARRANTY; without even the implied warranty of
18214571Sdim   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19214571Sdim   GNU General Public License for more details.
20214571Sdim
21214571Sdim   You should have received a copy of the GNU General Public License
22214571Sdim   along with this program; if not, write to the Free Software Foundation, Inc.,
23214571Sdim   51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
24214571Sdim
25214571Sdim/* ??? Eventually more and more of this stuff can go to cpu-independent files.
26214571Sdim   Keep that in mind.  */
27214571Sdim
28214571Sdim#include "sysdep.h"
29214571Sdim#include <stdio.h>
30214571Sdim#include "ansidecl.h"
31214571Sdim#include "dis-asm.h"
32214571Sdim#include "bfd.h"
33214571Sdim#include "symcat.h"
34214571Sdim#include "mep-desc.h"
35214571Sdim#include "mep-opc.h"
36214571Sdim#include "opintl.h"
37214571Sdim#include "safe-ctype.h"
38214571Sdim
39214571Sdim#undef  min
40214571Sdim#define min(a,b) ((a) < (b) ? (a) : (b))
41214571Sdim#undef  max
42214571Sdim#define max(a,b) ((a) > (b) ? (a) : (b))
43214571Sdim
44214571Sdim/* Used by the ifield rtx function.  */
45214571Sdim#define FLD(f) (fields->f)
46214571Sdim
47214571Sdimstatic const char * insert_normal
48214571Sdim  (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
49214571Sdim   unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
50214571Sdimstatic const char * insert_insn_normal
51214571Sdim  (CGEN_CPU_DESC, const CGEN_INSN *,
52214571Sdim   CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
53214571Sdimstatic int extract_normal
54214571Sdim  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
55214571Sdim   unsigned int, unsigned int, unsigned int, unsigned int,
56214571Sdim   unsigned int, unsigned int, bfd_vma, long *);
57214571Sdimstatic int extract_insn_normal
58214571Sdim  (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
59214571Sdim   CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
60214571Sdim#if CGEN_INT_INSN_P
61214571Sdimstatic void put_insn_int_value
62214571Sdim  (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
63214571Sdim#endif
64214571Sdim#if ! CGEN_INT_INSN_P
65214571Sdimstatic CGEN_INLINE void insert_1
66214571Sdim  (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
67214571Sdimstatic CGEN_INLINE int fill_cache
68214571Sdim  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
69214571Sdimstatic CGEN_INLINE long extract_1
70214571Sdim  (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
71214571Sdim#endif
72214571Sdim
73214571Sdim/* Operand insertion.  */
74214571Sdim
75214571Sdim#if ! CGEN_INT_INSN_P
76214571Sdim
77214571Sdim/* Subroutine of insert_normal.  */
78214571Sdim
79214571Sdimstatic CGEN_INLINE void
80214571Sdiminsert_1 (CGEN_CPU_DESC cd,
81214571Sdim	  unsigned long value,
82214571Sdim	  int start,
83214571Sdim	  int length,
84214571Sdim	  int word_length,
85214571Sdim	  unsigned char *bufp)
86214571Sdim{
87214571Sdim  unsigned long x,mask;
88214571Sdim  int shift;
89214571Sdim
90214571Sdim  x = cgen_get_insn_value (cd, bufp, word_length);
91214571Sdim
92214571Sdim  /* Written this way to avoid undefined behaviour.  */
93214571Sdim  mask = (((1L << (length - 1)) - 1) << 1) | 1;
94214571Sdim  if (CGEN_INSN_LSB0_P)
95214571Sdim    shift = (start + 1) - length;
96214571Sdim  else
97214571Sdim    shift = (word_length - (start + length));
98214571Sdim  x = (x & ~(mask << shift)) | ((value & mask) << shift);
99214571Sdim
100214571Sdim  cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
101214571Sdim}
102214571Sdim
103214571Sdim#endif /* ! CGEN_INT_INSN_P */
104214571Sdim
105214571Sdim/* Default insertion routine.
106214571Sdim
107214571Sdim   ATTRS is a mask of the boolean attributes.
108214571Sdim   WORD_OFFSET is the offset in bits from the start of the insn of the value.
109214571Sdim   WORD_LENGTH is the length of the word in bits in which the value resides.
110214571Sdim   START is the starting bit number in the word, architecture origin.
111214571Sdim   LENGTH is the length of VALUE in bits.
112214571Sdim   TOTAL_LENGTH is the total length of the insn in bits.
113214571Sdim
114214571Sdim   The result is an error message or NULL if success.  */
115214571Sdim
116214571Sdim/* ??? This duplicates functionality with bfd's howto table and
117214571Sdim   bfd_install_relocation.  */
118214571Sdim/* ??? This doesn't handle bfd_vma's.  Create another function when
119214571Sdim   necessary.  */
120214571Sdim
121214571Sdimstatic const char *
122214571Sdiminsert_normal (CGEN_CPU_DESC cd,
123214571Sdim	       long value,
124214571Sdim	       unsigned int attrs,
125214571Sdim	       unsigned int word_offset,
126214571Sdim	       unsigned int start,
127214571Sdim	       unsigned int length,
128214571Sdim	       unsigned int word_length,
129214571Sdim	       unsigned int total_length,
130214571Sdim	       CGEN_INSN_BYTES_PTR buffer)
131214571Sdim{
132214571Sdim  static char errbuf[100];
133214571Sdim  /* Written this way to avoid undefined behaviour.  */
134214571Sdim  unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
135214571Sdim
136214571Sdim  /* If LENGTH is zero, this operand doesn't contribute to the value.  */
137214571Sdim  if (length == 0)
138214571Sdim    return NULL;
139214571Sdim
140214571Sdim  if (word_length > 32)
141214571Sdim    abort ();
142214571Sdim
143214571Sdim  /* For architectures with insns smaller than the base-insn-bitsize,
144214571Sdim     word_length may be too big.  */
145214571Sdim  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
146214571Sdim    {
147214571Sdim      if (word_offset == 0
148214571Sdim	  && word_length > total_length)
149214571Sdim	word_length = total_length;
150214571Sdim    }
151214571Sdim
152214571Sdim  /* Ensure VALUE will fit.  */
153214571Sdim  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
154214571Sdim    {
155214571Sdim      long minval = - (1L << (length - 1));
156214571Sdim      unsigned long maxval = mask;
157214571Sdim
158214571Sdim      if ((value > 0 && (unsigned long) value > maxval)
159214571Sdim	  || value < minval)
160214571Sdim	{
161214571Sdim	  /* xgettext:c-format */
162214571Sdim	  sprintf (errbuf,
163214571Sdim		   _("operand out of range (%ld not between %ld and %lu)"),
164214571Sdim		   value, minval, maxval);
165214571Sdim	  return errbuf;
166214571Sdim	}
167214571Sdim    }
168214571Sdim  else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
169214571Sdim    {
170214571Sdim      unsigned long maxval = mask;
171214571Sdim      unsigned long val = (unsigned long) value;
172214571Sdim
173214571Sdim      /* For hosts with a word size > 32 check to see if value has been sign
174214571Sdim	 extended beyond 32 bits.  If so then ignore these higher sign bits
175214571Sdim	 as the user is attempting to store a 32-bit signed value into an
176214571Sdim	 unsigned 32-bit field which is allowed.  */
177214571Sdim      if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
178214571Sdim	val &= 0xFFFFFFFF;
179214571Sdim
180214571Sdim      if (val > maxval)
181214571Sdim	{
182214571Sdim	  /* xgettext:c-format */
183214571Sdim	  sprintf (errbuf,
184214571Sdim		   _("operand out of range (0x%lx not between 0 and 0x%lx)"),
185214571Sdim		   val, maxval);
186214571Sdim	  return errbuf;
187214571Sdim	}
188214571Sdim    }
189214571Sdim  else
190214571Sdim    {
191214571Sdim      if (! cgen_signed_overflow_ok_p (cd))
192214571Sdim	{
193214571Sdim	  long minval = - (1L << (length - 1));
194214571Sdim	  long maxval =   (1L << (length - 1)) - 1;
195214571Sdim
196214571Sdim	  if (value < minval || value > maxval)
197214571Sdim	    {
198214571Sdim	      sprintf
199214571Sdim		/* xgettext:c-format */
200214571Sdim		(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
201214571Sdim		 value, minval, maxval);
202214571Sdim	      return errbuf;
203214571Sdim	    }
204214571Sdim	}
205214571Sdim    }
206214571Sdim
207214571Sdim#if CGEN_INT_INSN_P
208214571Sdim
209214571Sdim  {
210214571Sdim    int shift;
211214571Sdim
212214571Sdim    if (CGEN_INSN_LSB0_P)
213214571Sdim      shift = (word_offset + start + 1) - length;
214214571Sdim    else
215214571Sdim      shift = total_length - (word_offset + start + length);
216214571Sdim    *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
217214571Sdim  }
218214571Sdim
219214571Sdim#else /* ! CGEN_INT_INSN_P */
220214571Sdim
221214571Sdim  {
222214571Sdim    unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
223214571Sdim
224214571Sdim    insert_1 (cd, value, start, length, word_length, bufp);
225214571Sdim  }
226214571Sdim
227214571Sdim#endif /* ! CGEN_INT_INSN_P */
228214571Sdim
229214571Sdim  return NULL;
230214571Sdim}
231214571Sdim
232214571Sdim/* Default insn builder (insert handler).
233214571Sdim   The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
234214571Sdim   that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
235214571Sdim   recorded in host byte order, otherwise BUFFER is an array of bytes
236214571Sdim   and the value is recorded in target byte order).
237214571Sdim   The result is an error message or NULL if success.  */
238214571Sdim
239214571Sdimstatic const char *
240214571Sdiminsert_insn_normal (CGEN_CPU_DESC cd,
241214571Sdim		    const CGEN_INSN * insn,
242214571Sdim		    CGEN_FIELDS * fields,
243214571Sdim		    CGEN_INSN_BYTES_PTR buffer,
244214571Sdim		    bfd_vma pc)
245214571Sdim{
246214571Sdim  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
247214571Sdim  unsigned long value;
248214571Sdim  const CGEN_SYNTAX_CHAR_TYPE * syn;
249214571Sdim
250214571Sdim  CGEN_INIT_INSERT (cd);
251214571Sdim  value = CGEN_INSN_BASE_VALUE (insn);
252214571Sdim
253214571Sdim  /* If we're recording insns as numbers (rather than a string of bytes),
254214571Sdim     target byte order handling is deferred until later.  */
255214571Sdim
256214571Sdim#if CGEN_INT_INSN_P
257214571Sdim
258214571Sdim  put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
259214571Sdim		      CGEN_FIELDS_BITSIZE (fields), value);
260214571Sdim
261214571Sdim#else
262214571Sdim
263214571Sdim  cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
264214571Sdim					(unsigned) CGEN_FIELDS_BITSIZE (fields)),
265214571Sdim		       value);
266214571Sdim
267214571Sdim#endif /* ! CGEN_INT_INSN_P */
268214571Sdim
269214571Sdim  /* ??? It would be better to scan the format's fields.
270214571Sdim     Still need to be able to insert a value based on the operand though;
271214571Sdim     e.g. storing a branch displacement that got resolved later.
272214571Sdim     Needs more thought first.  */
273214571Sdim
274214571Sdim  for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
275214571Sdim    {
276214571Sdim      const char *errmsg;
277214571Sdim
278214571Sdim      if (CGEN_SYNTAX_CHAR_P (* syn))
279214571Sdim	continue;
280214571Sdim
281214571Sdim      errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
282214571Sdim				       fields, buffer, pc);
283214571Sdim      if (errmsg)
284214571Sdim	return errmsg;
285214571Sdim    }
286214571Sdim
287214571Sdim  return NULL;
288214571Sdim}
289214571Sdim
290214571Sdim#if CGEN_INT_INSN_P
291214571Sdim/* Cover function to store an insn value into an integral insn.  Must go here
292214571Sdim   because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */
293214571Sdim
294214571Sdimstatic void
295214571Sdimput_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
296214571Sdim		    CGEN_INSN_BYTES_PTR buf,
297214571Sdim		    int length,
298214571Sdim		    int insn_length,
299214571Sdim		    CGEN_INSN_INT value)
300214571Sdim{
301214571Sdim  /* For architectures with insns smaller than the base-insn-bitsize,
302214571Sdim     length may be too big.  */
303214571Sdim  if (length > insn_length)
304214571Sdim    *buf = value;
305214571Sdim  else
306214571Sdim    {
307214571Sdim      int shift = insn_length - length;
308214571Sdim      /* Written this way to avoid undefined behaviour.  */
309214571Sdim      CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
310214571Sdim
311214571Sdim      *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
312214571Sdim    }
313214571Sdim}
314214571Sdim#endif
315214571Sdim
316214571Sdim/* Operand extraction.  */
317214571Sdim
318214571Sdim#if ! CGEN_INT_INSN_P
319214571Sdim
320214571Sdim/* Subroutine of extract_normal.
321214571Sdim   Ensure sufficient bytes are cached in EX_INFO.
322214571Sdim   OFFSET is the offset in bytes from the start of the insn of the value.
323214571Sdim   BYTES is the length of the needed value.
324214571Sdim   Returns 1 for success, 0 for failure.  */
325214571Sdim
326214571Sdimstatic CGEN_INLINE int
327214571Sdimfill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
328214571Sdim	    CGEN_EXTRACT_INFO *ex_info,
329214571Sdim	    int offset,
330214571Sdim	    int bytes,
331214571Sdim	    bfd_vma pc)
332214571Sdim{
333214571Sdim  /* It's doubtful that the middle part has already been fetched so
334214571Sdim     we don't optimize that case.  kiss.  */
335214571Sdim  unsigned int mask;
336214571Sdim  disassemble_info *info = (disassemble_info *) ex_info->dis_info;
337214571Sdim
338214571Sdim  /* First do a quick check.  */
339214571Sdim  mask = (1 << bytes) - 1;
340214571Sdim  if (((ex_info->valid >> offset) & mask) == mask)
341214571Sdim    return 1;
342214571Sdim
343214571Sdim  /* Search for the first byte we need to read.  */
344214571Sdim  for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
345214571Sdim    if (! (mask & ex_info->valid))
346214571Sdim      break;
347214571Sdim
348214571Sdim  if (bytes)
349214571Sdim    {
350214571Sdim      int status;
351214571Sdim
352214571Sdim      pc += offset;
353214571Sdim      status = (*info->read_memory_func)
354214571Sdim	(pc, ex_info->insn_bytes + offset, bytes, info);
355214571Sdim
356214571Sdim      if (status != 0)
357214571Sdim	{
358214571Sdim	  (*info->memory_error_func) (status, pc, info);
359214571Sdim	  return 0;
360214571Sdim	}
361214571Sdim
362214571Sdim      ex_info->valid |= ((1 << bytes) - 1) << offset;
363214571Sdim    }
364214571Sdim
365214571Sdim  return 1;
366214571Sdim}
367214571Sdim
368214571Sdim/* Subroutine of extract_normal.  */
369214571Sdim
370214571Sdimstatic CGEN_INLINE long
371214571Sdimextract_1 (CGEN_CPU_DESC cd,
372214571Sdim	   CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
373214571Sdim	   int start,
374214571Sdim	   int length,
375214571Sdim	   int word_length,
376214571Sdim	   unsigned char *bufp,
377214571Sdim	   bfd_vma pc ATTRIBUTE_UNUSED)
378214571Sdim{
379214571Sdim  unsigned long x;
380214571Sdim  int shift;
381214571Sdim
382214571Sdim  x = cgen_get_insn_value (cd, bufp, word_length);
383214571Sdim
384214571Sdim  if (CGEN_INSN_LSB0_P)
385214571Sdim    shift = (start + 1) - length;
386214571Sdim  else
387214571Sdim    shift = (word_length - (start + length));
388214571Sdim  return x >> shift;
389214571Sdim}
390214571Sdim
391214571Sdim#endif /* ! CGEN_INT_INSN_P */
392214571Sdim
393214571Sdim/* Default extraction routine.
394214571Sdim
395214571Sdim   INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
396214571Sdim   or sometimes less for cases like the m32r where the base insn size is 32
397214571Sdim   but some insns are 16 bits.
398214571Sdim   ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
399214571Sdim   but for generality we take a bitmask of all of them.
400214571Sdim   WORD_OFFSET is the offset in bits from the start of the insn of the value.
401214571Sdim   WORD_LENGTH is the length of the word in bits in which the value resides.
402214571Sdim   START is the starting bit number in the word, architecture origin.
403214571Sdim   LENGTH is the length of VALUE in bits.
404214571Sdim   TOTAL_LENGTH is the total length of the insn in bits.
405214571Sdim
406214571Sdim   Returns 1 for success, 0 for failure.  */
407214571Sdim
408214571Sdim/* ??? The return code isn't properly used.  wip.  */
409214571Sdim
410214571Sdim/* ??? This doesn't handle bfd_vma's.  Create another function when
411214571Sdim   necessary.  */
412214571Sdim
413214571Sdimstatic int
414214571Sdimextract_normal (CGEN_CPU_DESC cd,
415214571Sdim#if ! CGEN_INT_INSN_P
416214571Sdim		CGEN_EXTRACT_INFO *ex_info,
417214571Sdim#else
418214571Sdim		CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
419214571Sdim#endif
420214571Sdim		CGEN_INSN_INT insn_value,
421214571Sdim		unsigned int attrs,
422214571Sdim		unsigned int word_offset,
423214571Sdim		unsigned int start,
424214571Sdim		unsigned int length,
425214571Sdim		unsigned int word_length,
426214571Sdim		unsigned int total_length,
427214571Sdim#if ! CGEN_INT_INSN_P
428214571Sdim		bfd_vma pc,
429214571Sdim#else
430214571Sdim		bfd_vma pc ATTRIBUTE_UNUSED,
431214571Sdim#endif
432214571Sdim		long *valuep)
433214571Sdim{
434214571Sdim  long value, mask;
435214571Sdim
436214571Sdim  /* If LENGTH is zero, this operand doesn't contribute to the value
437214571Sdim     so give it a standard value of zero.  */
438214571Sdim  if (length == 0)
439214571Sdim    {
440214571Sdim      *valuep = 0;
441214571Sdim      return 1;
442214571Sdim    }
443214571Sdim
444214571Sdim  if (word_length > 32)
445214571Sdim    abort ();
446214571Sdim
447214571Sdim  /* For architectures with insns smaller than the insn-base-bitsize,
448214571Sdim     word_length may be too big.  */
449214571Sdim  if (cd->min_insn_bitsize < cd->base_insn_bitsize)
450214571Sdim    {
451214571Sdim      if (word_offset + word_length > total_length)
452214571Sdim	word_length = total_length - word_offset;
453214571Sdim    }
454214571Sdim
455214571Sdim  /* Does the value reside in INSN_VALUE, and at the right alignment?  */
456214571Sdim
457214571Sdim  if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
458214571Sdim    {
459214571Sdim      if (CGEN_INSN_LSB0_P)
460214571Sdim	value = insn_value >> ((word_offset + start + 1) - length);
461214571Sdim      else
462214571Sdim	value = insn_value >> (total_length - ( word_offset + start + length));
463214571Sdim    }
464214571Sdim
465214571Sdim#if ! CGEN_INT_INSN_P
466214571Sdim
467214571Sdim  else
468214571Sdim    {
469214571Sdim      unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
470214571Sdim
471214571Sdim      if (word_length > 32)
472214571Sdim	abort ();
473214571Sdim
474214571Sdim      if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
475214571Sdim	return 0;
476214571Sdim
477214571Sdim      value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
478214571Sdim    }
479214571Sdim
480214571Sdim#endif /* ! CGEN_INT_INSN_P */
481214571Sdim
482214571Sdim  /* Written this way to avoid undefined behaviour.  */
483214571Sdim  mask = (((1L << (length - 1)) - 1) << 1) | 1;
484214571Sdim
485214571Sdim  value &= mask;
486214571Sdim  /* sign extend? */
487214571Sdim  if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
488214571Sdim      && (value & (1L << (length - 1))))
489214571Sdim    value |= ~mask;
490214571Sdim
491214571Sdim  *valuep = value;
492214571Sdim
493214571Sdim  return 1;
494214571Sdim}
495214571Sdim
496214571Sdim/* Default insn extractor.
497214571Sdim
498214571Sdim   INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
499214571Sdim   The extracted fields are stored in FIELDS.
500214571Sdim   EX_INFO is used to handle reading variable length insns.
501214571Sdim   Return the length of the insn in bits, or 0 if no match,
502214571Sdim   or -1 if an error occurs fetching data (memory_error_func will have
503214571Sdim   been called).  */
504214571Sdim
505214571Sdimstatic int
506214571Sdimextract_insn_normal (CGEN_CPU_DESC cd,
507214571Sdim		     const CGEN_INSN *insn,
508214571Sdim		     CGEN_EXTRACT_INFO *ex_info,
509214571Sdim		     CGEN_INSN_INT insn_value,
510214571Sdim		     CGEN_FIELDS *fields,
511214571Sdim		     bfd_vma pc)
512214571Sdim{
513214571Sdim  const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
514214571Sdim  const CGEN_SYNTAX_CHAR_TYPE *syn;
515214571Sdim
516214571Sdim  CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
517214571Sdim
518214571Sdim  CGEN_INIT_EXTRACT (cd);
519214571Sdim
520214571Sdim  for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
521214571Sdim    {
522214571Sdim      int length;
523214571Sdim
524214571Sdim      if (CGEN_SYNTAX_CHAR_P (*syn))
525214571Sdim	continue;
526214571Sdim
527214571Sdim      length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
528214571Sdim					ex_info, insn_value, fields, pc);
529214571Sdim      if (length <= 0)
530214571Sdim	return length;
531214571Sdim    }
532214571Sdim
533214571Sdim  /* We recognized and successfully extracted this insn.  */
534214571Sdim  return CGEN_INSN_BITSIZE (insn);
535214571Sdim}
536214571Sdim
537214571Sdim/* Machine generated code added here.  */
538214571Sdim
539214571Sdimconst char * mep_cgen_insert_operand
540214571Sdim  (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
541214571Sdim
542214571Sdim/* Main entry point for operand insertion.
543214571Sdim
544214571Sdim   This function is basically just a big switch statement.  Earlier versions
545214571Sdim   used tables to look up the function to use, but
546214571Sdim   - if the table contains both assembler and disassembler functions then
547214571Sdim     the disassembler contains much of the assembler and vice-versa,
548214571Sdim   - there's a lot of inlining possibilities as things grow,
549214571Sdim   - using a switch statement avoids the function call overhead.
550214571Sdim
551214571Sdim   This function could be moved into `parse_insn_normal', but keeping it
552214571Sdim   separate makes clear the interface between `parse_insn_normal' and each of
553214571Sdim   the handlers.  It's also needed by GAS to insert operands that couldn't be
554214571Sdim   resolved during parsing.  */
555214571Sdim
556214571Sdimconst char *
557214571Sdimmep_cgen_insert_operand (CGEN_CPU_DESC cd,
558214571Sdim			     int opindex,
559214571Sdim			     CGEN_FIELDS * fields,
560214571Sdim			     CGEN_INSN_BYTES_PTR buffer,
561214571Sdim			     bfd_vma pc ATTRIBUTE_UNUSED)
562214571Sdim{
563214571Sdim  const char * errmsg = NULL;
564214571Sdim  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
565214571Sdim
566214571Sdim  switch (opindex)
567214571Sdim    {
568214571Sdim    case MEP_OPERAND_ADDR24A4 :
569214571Sdim      {
570214571Sdim{
571214571Sdim  FLD (f_24u8a4n_hi) = ((unsigned int) (FLD (f_24u8a4n)) >> (8));
572214571Sdim  FLD (f_24u8a4n_lo) = ((unsigned int) (((FLD (f_24u8a4n)) & (252))) >> (2));
573214571Sdim}
574214571Sdim        errmsg = insert_normal (cd, fields->f_24u8a4n_hi, 0, 0, 16, 16, 32, total_length, buffer);
575214571Sdim        if (errmsg)
576214571Sdim          break;
577214571Sdim        errmsg = insert_normal (cd, fields->f_24u8a4n_lo, 0, 0, 8, 6, 32, total_length, buffer);
578214571Sdim        if (errmsg)
579214571Sdim          break;
580214571Sdim      }
581214571Sdim      break;
582214571Sdim    case MEP_OPERAND_CALLNUM :
583214571Sdim      {
584214571Sdim{
585214571Sdim  FLD (f_5) = ((((unsigned int) (FLD (f_callnum)) >> (3))) & (1));
586214571Sdim  FLD (f_6) = ((((unsigned int) (FLD (f_callnum)) >> (2))) & (1));
587214571Sdim  FLD (f_7) = ((((unsigned int) (FLD (f_callnum)) >> (1))) & (1));
588214571Sdim  FLD (f_11) = ((FLD (f_callnum)) & (1));
589214571Sdim}
590214571Sdim        errmsg = insert_normal (cd, fields->f_5, 0, 0, 5, 1, 32, total_length, buffer);
591214571Sdim        if (errmsg)
592214571Sdim          break;
593214571Sdim        errmsg = insert_normal (cd, fields->f_6, 0, 0, 6, 1, 32, total_length, buffer);
594214571Sdim        if (errmsg)
595214571Sdim          break;
596214571Sdim        errmsg = insert_normal (cd, fields->f_7, 0, 0, 7, 1, 32, total_length, buffer);
597214571Sdim        if (errmsg)
598214571Sdim          break;
599214571Sdim        errmsg = insert_normal (cd, fields->f_11, 0, 0, 11, 1, 32, total_length, buffer);
600214571Sdim        if (errmsg)
601214571Sdim          break;
602214571Sdim      }
603214571Sdim      break;
604214571Sdim    case MEP_OPERAND_CCCC :
605214571Sdim      errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
606214571Sdim      break;
607214571Sdim    case MEP_OPERAND_CCRN :
608214571Sdim      {
609214571Sdim{
610214571Sdim  FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3));
611214571Sdim  FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15));
612214571Sdim}
613214571Sdim        errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer);
614214571Sdim        if (errmsg)
615214571Sdim          break;
616214571Sdim        errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer);
617214571Sdim        if (errmsg)
618214571Sdim          break;
619214571Sdim      }
620214571Sdim      break;
621214571Sdim    case MEP_OPERAND_CDISP8 :
622214571Sdim      errmsg = insert_normal (cd, fields->f_8s24, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, buffer);
623214571Sdim      break;
624214571Sdim    case MEP_OPERAND_CDISP8A2 :
625214571Sdim      {
626214571Sdim        long value = fields->f_8s24a2;
627214571Sdim        value = ((int) (value) >> (1));
628214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, buffer);
629214571Sdim      }
630214571Sdim      break;
631214571Sdim    case MEP_OPERAND_CDISP8A4 :
632214571Sdim      {
633214571Sdim        long value = fields->f_8s24a4;
634214571Sdim        value = ((int) (value) >> (2));
635214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, buffer);
636214571Sdim      }
637214571Sdim      break;
638214571Sdim    case MEP_OPERAND_CDISP8A8 :
639214571Sdim      {
640214571Sdim        long value = fields->f_8s24a8;
641214571Sdim        value = ((int) (value) >> (3));
642214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, buffer);
643214571Sdim      }
644214571Sdim      break;
645214571Sdim    case MEP_OPERAND_CIMM4 :
646214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
647214571Sdim      break;
648214571Sdim    case MEP_OPERAND_CIMM5 :
649214571Sdim      errmsg = insert_normal (cd, fields->f_5u24, 0, 0, 24, 5, 32, total_length, buffer);
650214571Sdim      break;
651214571Sdim    case MEP_OPERAND_CODE16 :
652214571Sdim      errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
653214571Sdim      break;
654214571Sdim    case MEP_OPERAND_CODE24 :
655214571Sdim      {
656214571Sdim{
657214571Sdim  FLD (f_24u4n_hi) = ((unsigned int) (FLD (f_24u4n)) >> (16));
658214571Sdim  FLD (f_24u4n_lo) = ((FLD (f_24u4n)) & (65535));
659214571Sdim}
660214571Sdim        errmsg = insert_normal (cd, fields->f_24u4n_hi, 0, 0, 4, 8, 32, total_length, buffer);
661214571Sdim        if (errmsg)
662214571Sdim          break;
663214571Sdim        errmsg = insert_normal (cd, fields->f_24u4n_lo, 0, 0, 16, 16, 32, total_length, buffer);
664214571Sdim        if (errmsg)
665214571Sdim          break;
666214571Sdim      }
667214571Sdim      break;
668214571Sdim    case MEP_OPERAND_CP_FLAG :
669214571Sdim      break;
670214571Sdim    case MEP_OPERAND_CRN :
671214571Sdim      errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
672214571Sdim      break;
673214571Sdim    case MEP_OPERAND_CRN64 :
674214571Sdim      errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
675214571Sdim      break;
676214571Sdim    case MEP_OPERAND_CRNX :
677214571Sdim      {
678214571Sdim{
679214571Sdim  FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
680214571Sdim  FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
681214571Sdim}
682214571Sdim        errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
683214571Sdim        if (errmsg)
684214571Sdim          break;
685214571Sdim        errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
686214571Sdim        if (errmsg)
687214571Sdim          break;
688214571Sdim      }
689214571Sdim      break;
690214571Sdim    case MEP_OPERAND_CRNX64 :
691214571Sdim      {
692214571Sdim{
693214571Sdim  FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
694214571Sdim  FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
695214571Sdim}
696214571Sdim        errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
697214571Sdim        if (errmsg)
698214571Sdim          break;
699214571Sdim        errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
700214571Sdim        if (errmsg)
701214571Sdim          break;
702214571Sdim      }
703214571Sdim      break;
704214571Sdim    case MEP_OPERAND_CSRN :
705214571Sdim      {
706214571Sdim{
707214571Sdim  FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
708214571Sdim  FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
709214571Sdim}
710214571Sdim        errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
711214571Sdim        if (errmsg)
712214571Sdim          break;
713214571Sdim        errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
714214571Sdim        if (errmsg)
715214571Sdim          break;
716214571Sdim      }
717214571Sdim      break;
718214571Sdim    case MEP_OPERAND_CSRN_IDX :
719214571Sdim      {
720214571Sdim{
721214571Sdim  FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
722214571Sdim  FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
723214571Sdim}
724214571Sdim        errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
725214571Sdim        if (errmsg)
726214571Sdim          break;
727214571Sdim        errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
728214571Sdim        if (errmsg)
729214571Sdim          break;
730214571Sdim      }
731214571Sdim      break;
732214571Sdim    case MEP_OPERAND_DBG :
733214571Sdim      break;
734214571Sdim    case MEP_OPERAND_DEPC :
735214571Sdim      break;
736214571Sdim    case MEP_OPERAND_EPC :
737214571Sdim      break;
738214571Sdim    case MEP_OPERAND_EXC :
739214571Sdim      break;
740214571Sdim    case MEP_OPERAND_FMAX_CCRN :
741214571Sdim      errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer);
742214571Sdim      break;
743214571Sdim    case MEP_OPERAND_FMAX_FRD :
744214571Sdim      {
745214571Sdim{
746214571Sdim  FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15));
747214571Sdim  FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4));
748214571Sdim}
749214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer);
750214571Sdim        if (errmsg)
751214571Sdim          break;
752214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer);
753214571Sdim        if (errmsg)
754214571Sdim          break;
755214571Sdim      }
756214571Sdim      break;
757214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
758214571Sdim      {
759214571Sdim{
760214571Sdim  FLD (f_fmax_4_4) = ((FLD (f_fmax_frd)) & (15));
761214571Sdim  FLD (f_fmax_28_1) = ((unsigned int) (FLD (f_fmax_frd)) >> (4));
762214571Sdim}
763214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_28_1, 0, 0, 28, 1, 32, total_length, buffer);
764214571Sdim        if (errmsg)
765214571Sdim          break;
766214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_4_4, 0, 0, 4, 4, 32, total_length, buffer);
767214571Sdim        if (errmsg)
768214571Sdim          break;
769214571Sdim      }
770214571Sdim      break;
771214571Sdim    case MEP_OPERAND_FMAX_FRM :
772214571Sdim      {
773214571Sdim{
774214571Sdim  FLD (f_fmax_24_4) = ((FLD (f_fmax_frm)) & (15));
775214571Sdim  FLD (f_fmax_30_1) = ((unsigned int) (FLD (f_fmax_frm)) >> (4));
776214571Sdim}
777214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_30_1, 0, 0, 30, 1, 32, total_length, buffer);
778214571Sdim        if (errmsg)
779214571Sdim          break;
780214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_24_4, 0, 0, 24, 4, 32, total_length, buffer);
781214571Sdim        if (errmsg)
782214571Sdim          break;
783214571Sdim      }
784214571Sdim      break;
785214571Sdim    case MEP_OPERAND_FMAX_FRN :
786214571Sdim      {
787214571Sdim{
788214571Sdim  FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15));
789214571Sdim  FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4));
790214571Sdim}
791214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer);
792214571Sdim        if (errmsg)
793214571Sdim          break;
794214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer);
795214571Sdim        if (errmsg)
796214571Sdim          break;
797214571Sdim      }
798214571Sdim      break;
799214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
800214571Sdim      {
801214571Sdim{
802214571Sdim  FLD (f_fmax_20_4) = ((FLD (f_fmax_frn)) & (15));
803214571Sdim  FLD (f_fmax_29_1) = ((unsigned int) (FLD (f_fmax_frn)) >> (4));
804214571Sdim}
805214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_29_1, 0, 0, 29, 1, 32, total_length, buffer);
806214571Sdim        if (errmsg)
807214571Sdim          break;
808214571Sdim        errmsg = insert_normal (cd, fields->f_fmax_20_4, 0, 0, 20, 4, 32, total_length, buffer);
809214571Sdim        if (errmsg)
810214571Sdim          break;
811214571Sdim      }
812214571Sdim      break;
813214571Sdim    case MEP_OPERAND_FMAX_RM :
814214571Sdim      errmsg = insert_normal (cd, fields->f_fmax_rm, 0, 0, 8, 4, 32, total_length, buffer);
815214571Sdim      break;
816214571Sdim    case MEP_OPERAND_HI :
817214571Sdim      break;
818214571Sdim    case MEP_OPERAND_LO :
819214571Sdim      break;
820214571Sdim    case MEP_OPERAND_LP :
821214571Sdim      break;
822214571Sdim    case MEP_OPERAND_MB0 :
823214571Sdim      break;
824214571Sdim    case MEP_OPERAND_MB1 :
825214571Sdim      break;
826214571Sdim    case MEP_OPERAND_ME0 :
827214571Sdim      break;
828214571Sdim    case MEP_OPERAND_ME1 :
829214571Sdim      break;
830214571Sdim    case MEP_OPERAND_NPC :
831214571Sdim      break;
832214571Sdim    case MEP_OPERAND_OPT :
833214571Sdim      break;
834214571Sdim    case MEP_OPERAND_PCABS24A2 :
835214571Sdim      {
836214571Sdim{
837214571Sdim  FLD (f_24u5a2n_lo) = ((unsigned int) (((FLD (f_24u5a2n)) & (255))) >> (1));
838214571Sdim  FLD (f_24u5a2n_hi) = ((unsigned int) (FLD (f_24u5a2n)) >> (8));
839214571Sdim}
840214571Sdim        errmsg = insert_normal (cd, fields->f_24u5a2n_hi, 0, 0, 16, 16, 32, total_length, buffer);
841214571Sdim        if (errmsg)
842214571Sdim          break;
843214571Sdim        errmsg = insert_normal (cd, fields->f_24u5a2n_lo, 0, 0, 5, 7, 32, total_length, buffer);
844214571Sdim        if (errmsg)
845214571Sdim          break;
846214571Sdim      }
847214571Sdim      break;
848214571Sdim    case MEP_OPERAND_PCREL12A2 :
849214571Sdim      {
850214571Sdim        long value = fields->f_12s4a2;
851214571Sdim        value = ((int) (((value) - (pc))) >> (1));
852214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, buffer);
853214571Sdim      }
854214571Sdim      break;
855214571Sdim    case MEP_OPERAND_PCREL17A2 :
856214571Sdim      {
857214571Sdim        long value = fields->f_17s16a2;
858214571Sdim        value = ((int) (((value) - (pc))) >> (1));
859214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer);
860214571Sdim      }
861214571Sdim      break;
862214571Sdim    case MEP_OPERAND_PCREL24A2 :
863214571Sdim      {
864214571Sdim{
865214571Sdim  FLD (f_24s5a2n) = ((FLD (f_24s5a2n)) - (pc));
866214571Sdim  FLD (f_24s5a2n_lo) = ((unsigned int) (((FLD (f_24s5a2n)) & (254))) >> (1));
867214571Sdim  FLD (f_24s5a2n_hi) = ((int) (FLD (f_24s5a2n)) >> (8));
868214571Sdim}
869214571Sdim        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);
870214571Sdim        if (errmsg)
871214571Sdim          break;
872214571Sdim        errmsg = insert_normal (cd, fields->f_24s5a2n_lo, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, buffer);
873214571Sdim        if (errmsg)
874214571Sdim          break;
875214571Sdim      }
876214571Sdim      break;
877214571Sdim    case MEP_OPERAND_PCREL8A2 :
878214571Sdim      {
879214571Sdim        long value = fields->f_8s8a2;
880214571Sdim        value = ((int) (((value) - (pc))) >> (1));
881214571Sdim        errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, buffer);
882214571Sdim      }
883214571Sdim      break;
884214571Sdim    case MEP_OPERAND_PSW :
885214571Sdim      break;
886214571Sdim    case MEP_OPERAND_R0 :
887214571Sdim      break;
888214571Sdim    case MEP_OPERAND_R1 :
889214571Sdim      break;
890214571Sdim    case MEP_OPERAND_RL :
891214571Sdim      errmsg = insert_normal (cd, fields->f_rl, 0, 0, 12, 4, 32, total_length, buffer);
892214571Sdim      break;
893214571Sdim    case MEP_OPERAND_RM :
894214571Sdim      errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
895214571Sdim      break;
896214571Sdim    case MEP_OPERAND_RMA :
897214571Sdim      errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
898214571Sdim      break;
899214571Sdim    case MEP_OPERAND_RN :
900214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
901214571Sdim      break;
902214571Sdim    case MEP_OPERAND_RN3 :
903214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
904214571Sdim      break;
905214571Sdim    case MEP_OPERAND_RN3C :
906214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
907214571Sdim      break;
908214571Sdim    case MEP_OPERAND_RN3L :
909214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
910214571Sdim      break;
911214571Sdim    case MEP_OPERAND_RN3S :
912214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
913214571Sdim      break;
914214571Sdim    case MEP_OPERAND_RN3UC :
915214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
916214571Sdim      break;
917214571Sdim    case MEP_OPERAND_RN3UL :
918214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
919214571Sdim      break;
920214571Sdim    case MEP_OPERAND_RN3US :
921214571Sdim      errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
922214571Sdim      break;
923214571Sdim    case MEP_OPERAND_RNC :
924214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
925214571Sdim      break;
926214571Sdim    case MEP_OPERAND_RNL :
927214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
928214571Sdim      break;
929214571Sdim    case MEP_OPERAND_RNS :
930214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
931214571Sdim      break;
932214571Sdim    case MEP_OPERAND_RNUC :
933214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
934214571Sdim      break;
935214571Sdim    case MEP_OPERAND_RNUL :
936214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
937214571Sdim      break;
938214571Sdim    case MEP_OPERAND_RNUS :
939214571Sdim      errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
940214571Sdim      break;
941214571Sdim    case MEP_OPERAND_SAR :
942214571Sdim      break;
943214571Sdim    case MEP_OPERAND_SDISP16 :
944214571Sdim      errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
945214571Sdim      break;
946214571Sdim    case MEP_OPERAND_SIMM16 :
947214571Sdim      errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
948214571Sdim      break;
949214571Sdim    case MEP_OPERAND_SIMM6 :
950214571Sdim      errmsg = insert_normal (cd, fields->f_6s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, buffer);
951214571Sdim      break;
952214571Sdim    case MEP_OPERAND_SIMM8 :
953214571Sdim      errmsg = insert_normal (cd, fields->f_8s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer);
954214571Sdim      break;
955214571Sdim    case MEP_OPERAND_SP :
956214571Sdim      break;
957214571Sdim    case MEP_OPERAND_SPR :
958214571Sdim      break;
959214571Sdim    case MEP_OPERAND_TP :
960214571Sdim      break;
961214571Sdim    case MEP_OPERAND_TPR :
962214571Sdim      break;
963214571Sdim    case MEP_OPERAND_UDISP2 :
964214571Sdim      errmsg = insert_normal (cd, fields->f_2u6, 0, 0, 6, 2, 32, total_length, buffer);
965214571Sdim      break;
966214571Sdim    case MEP_OPERAND_UDISP7 :
967214571Sdim      errmsg = insert_normal (cd, fields->f_7u9, 0, 0, 9, 7, 32, total_length, buffer);
968214571Sdim      break;
969214571Sdim    case MEP_OPERAND_UDISP7A2 :
970214571Sdim      {
971214571Sdim        long value = fields->f_7u9a2;
972214571Sdim        value = ((unsigned int) (value) >> (1));
973214571Sdim        errmsg = insert_normal (cd, value, 0, 0, 9, 6, 32, total_length, buffer);
974214571Sdim      }
975214571Sdim      break;
976214571Sdim    case MEP_OPERAND_UDISP7A4 :
977214571Sdim      {
978214571Sdim        long value = fields->f_7u9a4;
979214571Sdim        value = ((unsigned int) (value) >> (2));
980214571Sdim        errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
981214571Sdim      }
982214571Sdim      break;
983214571Sdim    case MEP_OPERAND_UIMM16 :
984214571Sdim      errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
985214571Sdim      break;
986214571Sdim    case MEP_OPERAND_UIMM2 :
987214571Sdim      errmsg = insert_normal (cd, fields->f_2u10, 0, 0, 10, 2, 32, total_length, buffer);
988214571Sdim      break;
989214571Sdim    case MEP_OPERAND_UIMM24 :
990214571Sdim      {
991214571Sdim{
992214571Sdim  FLD (f_24u8n_hi) = ((unsigned int) (FLD (f_24u8n)) >> (8));
993214571Sdim  FLD (f_24u8n_lo) = ((FLD (f_24u8n)) & (255));
994214571Sdim}
995214571Sdim        errmsg = insert_normal (cd, fields->f_24u8n_hi, 0, 0, 16, 16, 32, total_length, buffer);
996214571Sdim        if (errmsg)
997214571Sdim          break;
998214571Sdim        errmsg = insert_normal (cd, fields->f_24u8n_lo, 0, 0, 8, 8, 32, total_length, buffer);
999214571Sdim        if (errmsg)
1000214571Sdim          break;
1001214571Sdim      }
1002214571Sdim      break;
1003214571Sdim    case MEP_OPERAND_UIMM3 :
1004214571Sdim      errmsg = insert_normal (cd, fields->f_3u5, 0, 0, 5, 3, 32, total_length, buffer);
1005214571Sdim      break;
1006214571Sdim    case MEP_OPERAND_UIMM4 :
1007214571Sdim      errmsg = insert_normal (cd, fields->f_4u8, 0, 0, 8, 4, 32, total_length, buffer);
1008214571Sdim      break;
1009214571Sdim    case MEP_OPERAND_UIMM5 :
1010214571Sdim      errmsg = insert_normal (cd, fields->f_5u8, 0, 0, 8, 5, 32, total_length, buffer);
1011214571Sdim      break;
1012214571Sdim    case MEP_OPERAND_UIMM7A4 :
1013214571Sdim      {
1014214571Sdim        long value = fields->f_7u9a4;
1015214571Sdim        value = ((unsigned int) (value) >> (2));
1016214571Sdim        errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
1017214571Sdim      }
1018214571Sdim      break;
1019214571Sdim    case MEP_OPERAND_ZERO :
1020214571Sdim      break;
1021214571Sdim
1022214571Sdim    default :
1023214571Sdim      /* xgettext:c-format */
1024214571Sdim      fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
1025214571Sdim	       opindex);
1026214571Sdim      abort ();
1027214571Sdim  }
1028214571Sdim
1029214571Sdim  return errmsg;
1030214571Sdim}
1031214571Sdim
1032214571Sdimint mep_cgen_extract_operand
1033214571Sdim  (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
1034214571Sdim
1035214571Sdim/* Main entry point for operand extraction.
1036214571Sdim   The result is <= 0 for error, >0 for success.
1037214571Sdim   ??? Actual values aren't well defined right now.
1038214571Sdim
1039214571Sdim   This function is basically just a big switch statement.  Earlier versions
1040214571Sdim   used tables to look up the function to use, but
1041214571Sdim   - if the table contains both assembler and disassembler functions then
1042214571Sdim     the disassembler contains much of the assembler and vice-versa,
1043214571Sdim   - there's a lot of inlining possibilities as things grow,
1044214571Sdim   - using a switch statement avoids the function call overhead.
1045214571Sdim
1046214571Sdim   This function could be moved into `print_insn_normal', but keeping it
1047214571Sdim   separate makes clear the interface between `print_insn_normal' and each of
1048214571Sdim   the handlers.  */
1049214571Sdim
1050214571Sdimint
1051214571Sdimmep_cgen_extract_operand (CGEN_CPU_DESC cd,
1052214571Sdim			     int opindex,
1053214571Sdim			     CGEN_EXTRACT_INFO *ex_info,
1054214571Sdim			     CGEN_INSN_INT insn_value,
1055214571Sdim			     CGEN_FIELDS * fields,
1056214571Sdim			     bfd_vma pc)
1057214571Sdim{
1058214571Sdim  /* Assume success (for those operands that are nops).  */
1059214571Sdim  int length = 1;
1060214571Sdim  unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
1061214571Sdim
1062214571Sdim  switch (opindex)
1063214571Sdim    {
1064214571Sdim    case MEP_OPERAND_ADDR24A4 :
1065214571Sdim      {
1066214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8a4n_hi);
1067214571Sdim        if (length <= 0) break;
1068214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 6, 32, total_length, pc, & fields->f_24u8a4n_lo);
1069214571Sdim        if (length <= 0) break;
1070214571Sdim  FLD (f_24u8a4n) = ((((FLD (f_24u8a4n_hi)) << (8))) | (((FLD (f_24u8a4n_lo)) << (2))));
1071214571Sdim      }
1072214571Sdim      break;
1073214571Sdim    case MEP_OPERAND_CALLNUM :
1074214571Sdim      {
1075214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_5);
1076214571Sdim        if (length <= 0) break;
1077214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_6);
1078214571Sdim        if (length <= 0) break;
1079214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_7);
1080214571Sdim        if (length <= 0) break;
1081214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_11);
1082214571Sdim        if (length <= 0) break;
1083214571Sdim  FLD (f_callnum) = ((((FLD (f_5)) << (3))) | (((((FLD (f_6)) << (2))) | (((((FLD (f_7)) << (1))) | (FLD (f_11)))))));
1084214571Sdim      }
1085214571Sdim      break;
1086214571Sdim    case MEP_OPERAND_CCCC :
1087214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1088214571Sdim      break;
1089214571Sdim    case MEP_OPERAND_CCRN :
1090214571Sdim      {
1091214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi);
1092214571Sdim        if (length <= 0) break;
1093214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo);
1094214571Sdim        if (length <= 0) break;
1095214571Sdim  FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo)));
1096214571Sdim      }
1097214571Sdim      break;
1098214571Sdim    case MEP_OPERAND_CDISP8 :
1099214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 8, 32, total_length, pc, & fields->f_8s24);
1100214571Sdim      break;
1101214571Sdim    case MEP_OPERAND_CDISP8A2 :
1102214571Sdim      {
1103214571Sdim        long value;
1104214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 7, 32, total_length, pc, & value);
1105214571Sdim        value = ((value) << (1));
1106214571Sdim        fields->f_8s24a2 = value;
1107214571Sdim      }
1108214571Sdim      break;
1109214571Sdim    case MEP_OPERAND_CDISP8A4 :
1110214571Sdim      {
1111214571Sdim        long value;
1112214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 6, 32, total_length, pc, & value);
1113214571Sdim        value = ((value) << (2));
1114214571Sdim        fields->f_8s24a4 = value;
1115214571Sdim      }
1116214571Sdim      break;
1117214571Sdim    case MEP_OPERAND_CDISP8A8 :
1118214571Sdim      {
1119214571Sdim        long value;
1120214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 24, 5, 32, total_length, pc, & value);
1121214571Sdim        value = ((value) << (3));
1122214571Sdim        fields->f_8s24a8 = value;
1123214571Sdim      }
1124214571Sdim      break;
1125214571Sdim    case MEP_OPERAND_CIMM4 :
1126214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1127214571Sdim      break;
1128214571Sdim    case MEP_OPERAND_CIMM5 :
1129214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 5, 32, total_length, pc, & fields->f_5u24);
1130214571Sdim      break;
1131214571Sdim    case MEP_OPERAND_CODE16 :
1132214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1133214571Sdim      break;
1134214571Sdim    case MEP_OPERAND_CODE24 :
1135214571Sdim      {
1136214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_24u4n_hi);
1137214571Sdim        if (length <= 0) break;
1138214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u4n_lo);
1139214571Sdim        if (length <= 0) break;
1140214571Sdim  FLD (f_24u4n) = ((((FLD (f_24u4n_hi)) << (16))) | (FLD (f_24u4n_lo)));
1141214571Sdim      }
1142214571Sdim      break;
1143214571Sdim    case MEP_OPERAND_CP_FLAG :
1144214571Sdim      break;
1145214571Sdim    case MEP_OPERAND_CRN :
1146214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1147214571Sdim      break;
1148214571Sdim    case MEP_OPERAND_CRN64 :
1149214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1150214571Sdim      break;
1151214571Sdim    case MEP_OPERAND_CRNX :
1152214571Sdim      {
1153214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1154214571Sdim        if (length <= 0) break;
1155214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1156214571Sdim        if (length <= 0) break;
1157214571Sdim  FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1158214571Sdim      }
1159214571Sdim      break;
1160214571Sdim    case MEP_OPERAND_CRNX64 :
1161214571Sdim      {
1162214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1163214571Sdim        if (length <= 0) break;
1164214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1165214571Sdim        if (length <= 0) break;
1166214571Sdim  FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1167214571Sdim      }
1168214571Sdim      break;
1169214571Sdim    case MEP_OPERAND_CSRN :
1170214571Sdim      {
1171214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1172214571Sdim        if (length <= 0) break;
1173214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1174214571Sdim        if (length <= 0) break;
1175214571Sdim  FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1176214571Sdim      }
1177214571Sdim      break;
1178214571Sdim    case MEP_OPERAND_CSRN_IDX :
1179214571Sdim      {
1180214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1181214571Sdim        if (length <= 0) break;
1182214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1183214571Sdim        if (length <= 0) break;
1184214571Sdim  FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1185214571Sdim      }
1186214571Sdim      break;
1187214571Sdim    case MEP_OPERAND_DBG :
1188214571Sdim      break;
1189214571Sdim    case MEP_OPERAND_DEPC :
1190214571Sdim      break;
1191214571Sdim    case MEP_OPERAND_EPC :
1192214571Sdim      break;
1193214571Sdim    case MEP_OPERAND_EXC :
1194214571Sdim      break;
1195214571Sdim    case MEP_OPERAND_FMAX_CCRN :
1196214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4);
1197214571Sdim      break;
1198214571Sdim    case MEP_OPERAND_FMAX_FRD :
1199214571Sdim      {
1200214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1);
1201214571Sdim        if (length <= 0) break;
1202214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4);
1203214571Sdim        if (length <= 0) break;
1204214571Sdim  FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4)));
1205214571Sdim      }
1206214571Sdim      break;
1207214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
1208214571Sdim      {
1209214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_fmax_28_1);
1210214571Sdim        if (length <= 0) break;
1211214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_fmax_4_4);
1212214571Sdim        if (length <= 0) break;
1213214571Sdim  FLD (f_fmax_frd) = ((((FLD (f_fmax_28_1)) << (4))) | (FLD (f_fmax_4_4)));
1214214571Sdim      }
1215214571Sdim      break;
1216214571Sdim    case MEP_OPERAND_FMAX_FRM :
1217214571Sdim      {
1218214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 1, 32, total_length, pc, & fields->f_fmax_30_1);
1219214571Sdim        if (length <= 0) break;
1220214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 4, 32, total_length, pc, & fields->f_fmax_24_4);
1221214571Sdim        if (length <= 0) break;
1222214571Sdim  FLD (f_fmax_frm) = ((((FLD (f_fmax_30_1)) << (4))) | (FLD (f_fmax_24_4)));
1223214571Sdim      }
1224214571Sdim      break;
1225214571Sdim    case MEP_OPERAND_FMAX_FRN :
1226214571Sdim      {
1227214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1);
1228214571Sdim        if (length <= 0) break;
1229214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4);
1230214571Sdim        if (length <= 0) break;
1231214571Sdim  FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4)));
1232214571Sdim      }
1233214571Sdim      break;
1234214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
1235214571Sdim      {
1236214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 29, 1, 32, total_length, pc, & fields->f_fmax_29_1);
1237214571Sdim        if (length <= 0) break;
1238214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_fmax_20_4);
1239214571Sdim        if (length <= 0) break;
1240214571Sdim  FLD (f_fmax_frn) = ((((FLD (f_fmax_29_1)) << (4))) | (FLD (f_fmax_20_4)));
1241214571Sdim      }
1242214571Sdim      break;
1243214571Sdim    case MEP_OPERAND_FMAX_RM :
1244214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_fmax_rm);
1245214571Sdim      break;
1246214571Sdim    case MEP_OPERAND_HI :
1247214571Sdim      break;
1248214571Sdim    case MEP_OPERAND_LO :
1249214571Sdim      break;
1250214571Sdim    case MEP_OPERAND_LP :
1251214571Sdim      break;
1252214571Sdim    case MEP_OPERAND_MB0 :
1253214571Sdim      break;
1254214571Sdim    case MEP_OPERAND_MB1 :
1255214571Sdim      break;
1256214571Sdim    case MEP_OPERAND_ME0 :
1257214571Sdim      break;
1258214571Sdim    case MEP_OPERAND_ME1 :
1259214571Sdim      break;
1260214571Sdim    case MEP_OPERAND_NPC :
1261214571Sdim      break;
1262214571Sdim    case MEP_OPERAND_OPT :
1263214571Sdim      break;
1264214571Sdim    case MEP_OPERAND_PCABS24A2 :
1265214571Sdim      {
1266214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u5a2n_hi);
1267214571Sdim        if (length <= 0) break;
1268214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 7, 32, total_length, pc, & fields->f_24u5a2n_lo);
1269214571Sdim        if (length <= 0) break;
1270214571Sdim  FLD (f_24u5a2n) = ((((FLD (f_24u5a2n_hi)) << (8))) | (((FLD (f_24u5a2n_lo)) << (1))));
1271214571Sdim      }
1272214571Sdim      break;
1273214571Sdim    case MEP_OPERAND_PCREL12A2 :
1274214571Sdim      {
1275214571Sdim        long value;
1276214571Sdim        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);
1277214571Sdim        value = ((((value) << (1))) + (pc));
1278214571Sdim        fields->f_12s4a2 = value;
1279214571Sdim      }
1280214571Sdim      break;
1281214571Sdim    case MEP_OPERAND_PCREL17A2 :
1282214571Sdim      {
1283214571Sdim        long value;
1284214571Sdim        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);
1285214571Sdim        value = ((((value) << (1))) + (pc));
1286214571Sdim        fields->f_17s16a2 = value;
1287214571Sdim      }
1288214571Sdim      break;
1289214571Sdim    case MEP_OPERAND_PCREL24A2 :
1290214571Sdim      {
1291214571Sdim        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);
1292214571Sdim        if (length <= 0) break;
1293214571Sdim        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);
1294214571Sdim        if (length <= 0) break;
1295214571Sdim  FLD (f_24s5a2n) = ((((((FLD (f_24s5a2n_hi)) << (8))) | (((FLD (f_24s5a2n_lo)) << (1))))) + (pc));
1296214571Sdim      }
1297214571Sdim      break;
1298214571Sdim    case MEP_OPERAND_PCREL8A2 :
1299214571Sdim      {
1300214571Sdim        long value;
1301214571Sdim        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);
1302214571Sdim        value = ((((value) << (1))) + (pc));
1303214571Sdim        fields->f_8s8a2 = value;
1304214571Sdim      }
1305214571Sdim      break;
1306214571Sdim    case MEP_OPERAND_PSW :
1307214571Sdim      break;
1308214571Sdim    case MEP_OPERAND_R0 :
1309214571Sdim      break;
1310214571Sdim    case MEP_OPERAND_R1 :
1311214571Sdim      break;
1312214571Sdim    case MEP_OPERAND_RL :
1313214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_rl);
1314214571Sdim      break;
1315214571Sdim    case MEP_OPERAND_RM :
1316214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1317214571Sdim      break;
1318214571Sdim    case MEP_OPERAND_RMA :
1319214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1320214571Sdim      break;
1321214571Sdim    case MEP_OPERAND_RN :
1322214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1323214571Sdim      break;
1324214571Sdim    case MEP_OPERAND_RN3 :
1325214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1326214571Sdim      break;
1327214571Sdim    case MEP_OPERAND_RN3C :
1328214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1329214571Sdim      break;
1330214571Sdim    case MEP_OPERAND_RN3L :
1331214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1332214571Sdim      break;
1333214571Sdim    case MEP_OPERAND_RN3S :
1334214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1335214571Sdim      break;
1336214571Sdim    case MEP_OPERAND_RN3UC :
1337214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1338214571Sdim      break;
1339214571Sdim    case MEP_OPERAND_RN3UL :
1340214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1341214571Sdim      break;
1342214571Sdim    case MEP_OPERAND_RN3US :
1343214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1344214571Sdim      break;
1345214571Sdim    case MEP_OPERAND_RNC :
1346214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1347214571Sdim      break;
1348214571Sdim    case MEP_OPERAND_RNL :
1349214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1350214571Sdim      break;
1351214571Sdim    case MEP_OPERAND_RNS :
1352214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1353214571Sdim      break;
1354214571Sdim    case MEP_OPERAND_RNUC :
1355214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1356214571Sdim      break;
1357214571Sdim    case MEP_OPERAND_RNUL :
1358214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1359214571Sdim      break;
1360214571Sdim    case MEP_OPERAND_RNUS :
1361214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1362214571Sdim      break;
1363214571Sdim    case MEP_OPERAND_SAR :
1364214571Sdim      break;
1365214571Sdim    case MEP_OPERAND_SDISP16 :
1366214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1367214571Sdim      break;
1368214571Sdim    case MEP_OPERAND_SIMM16 :
1369214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1370214571Sdim      break;
1371214571Sdim    case MEP_OPERAND_SIMM6 :
1372214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, pc, & fields->f_6s8);
1373214571Sdim      break;
1374214571Sdim    case MEP_OPERAND_SIMM8 :
1375214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_8s8);
1376214571Sdim      break;
1377214571Sdim    case MEP_OPERAND_SP :
1378214571Sdim      break;
1379214571Sdim    case MEP_OPERAND_SPR :
1380214571Sdim      break;
1381214571Sdim    case MEP_OPERAND_TP :
1382214571Sdim      break;
1383214571Sdim    case MEP_OPERAND_TPR :
1384214571Sdim      break;
1385214571Sdim    case MEP_OPERAND_UDISP2 :
1386214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_2u6);
1387214571Sdim      break;
1388214571Sdim    case MEP_OPERAND_UDISP7 :
1389214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_7u9);
1390214571Sdim      break;
1391214571Sdim    case MEP_OPERAND_UDISP7A2 :
1392214571Sdim      {
1393214571Sdim        long value;
1394214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 6, 32, total_length, pc, & value);
1395214571Sdim        value = ((value) << (1));
1396214571Sdim        fields->f_7u9a2 = value;
1397214571Sdim      }
1398214571Sdim      break;
1399214571Sdim    case MEP_OPERAND_UDISP7A4 :
1400214571Sdim      {
1401214571Sdim        long value;
1402214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1403214571Sdim        value = ((value) << (2));
1404214571Sdim        fields->f_7u9a4 = value;
1405214571Sdim      }
1406214571Sdim      break;
1407214571Sdim    case MEP_OPERAND_UIMM16 :
1408214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1409214571Sdim      break;
1410214571Sdim    case MEP_OPERAND_UIMM2 :
1411214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 2, 32, total_length, pc, & fields->f_2u10);
1412214571Sdim      break;
1413214571Sdim    case MEP_OPERAND_UIMM24 :
1414214571Sdim      {
1415214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8n_hi);
1416214571Sdim        if (length <= 0) break;
1417214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_24u8n_lo);
1418214571Sdim        if (length <= 0) break;
1419214571Sdim  FLD (f_24u8n) = ((((FLD (f_24u8n_hi)) << (8))) | (FLD (f_24u8n_lo)));
1420214571Sdim      }
1421214571Sdim      break;
1422214571Sdim    case MEP_OPERAND_UIMM3 :
1423214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_3u5);
1424214571Sdim      break;
1425214571Sdim    case MEP_OPERAND_UIMM4 :
1426214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_4u8);
1427214571Sdim      break;
1428214571Sdim    case MEP_OPERAND_UIMM5 :
1429214571Sdim      length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_5u8);
1430214571Sdim      break;
1431214571Sdim    case MEP_OPERAND_UIMM7A4 :
1432214571Sdim      {
1433214571Sdim        long value;
1434214571Sdim        length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1435214571Sdim        value = ((value) << (2));
1436214571Sdim        fields->f_7u9a4 = value;
1437214571Sdim      }
1438214571Sdim      break;
1439214571Sdim    case MEP_OPERAND_ZERO :
1440214571Sdim      break;
1441214571Sdim
1442214571Sdim    default :
1443214571Sdim      /* xgettext:c-format */
1444214571Sdim      fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
1445214571Sdim	       opindex);
1446214571Sdim      abort ();
1447214571Sdim    }
1448214571Sdim
1449214571Sdim  return length;
1450214571Sdim}
1451214571Sdim
1452214571Sdimcgen_insert_fn * const mep_cgen_insert_handlers[] =
1453214571Sdim{
1454214571Sdim  insert_insn_normal,
1455214571Sdim};
1456214571Sdim
1457214571Sdimcgen_extract_fn * const mep_cgen_extract_handlers[] =
1458214571Sdim{
1459214571Sdim  extract_insn_normal,
1460214571Sdim};
1461214571Sdim
1462214571Sdimint mep_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1463214571Sdimbfd_vma mep_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1464214571Sdim
1465214571Sdim/* Getting values from cgen_fields is handled by a collection of functions.
1466214571Sdim   They are distinguished by the type of the VALUE argument they return.
1467214571Sdim   TODO: floating point, inlining support, remove cases where result type
1468214571Sdim   not appropriate.  */
1469214571Sdim
1470214571Sdimint
1471214571Sdimmep_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1472214571Sdim			     int opindex,
1473214571Sdim			     const CGEN_FIELDS * fields)
1474214571Sdim{
1475214571Sdim  int value;
1476214571Sdim
1477214571Sdim  switch (opindex)
1478214571Sdim    {
1479214571Sdim    case MEP_OPERAND_ADDR24A4 :
1480214571Sdim      value = fields->f_24u8a4n;
1481214571Sdim      break;
1482214571Sdim    case MEP_OPERAND_CALLNUM :
1483214571Sdim      value = fields->f_callnum;
1484214571Sdim      break;
1485214571Sdim    case MEP_OPERAND_CCCC :
1486214571Sdim      value = fields->f_rm;
1487214571Sdim      break;
1488214571Sdim    case MEP_OPERAND_CCRN :
1489214571Sdim      value = fields->f_ccrn;
1490214571Sdim      break;
1491214571Sdim    case MEP_OPERAND_CDISP8 :
1492214571Sdim      value = fields->f_8s24;
1493214571Sdim      break;
1494214571Sdim    case MEP_OPERAND_CDISP8A2 :
1495214571Sdim      value = fields->f_8s24a2;
1496214571Sdim      break;
1497214571Sdim    case MEP_OPERAND_CDISP8A4 :
1498214571Sdim      value = fields->f_8s24a4;
1499214571Sdim      break;
1500214571Sdim    case MEP_OPERAND_CDISP8A8 :
1501214571Sdim      value = fields->f_8s24a8;
1502214571Sdim      break;
1503214571Sdim    case MEP_OPERAND_CIMM4 :
1504214571Sdim      value = fields->f_rn;
1505214571Sdim      break;
1506214571Sdim    case MEP_OPERAND_CIMM5 :
1507214571Sdim      value = fields->f_5u24;
1508214571Sdim      break;
1509214571Sdim    case MEP_OPERAND_CODE16 :
1510214571Sdim      value = fields->f_16u16;
1511214571Sdim      break;
1512214571Sdim    case MEP_OPERAND_CODE24 :
1513214571Sdim      value = fields->f_24u4n;
1514214571Sdim      break;
1515214571Sdim    case MEP_OPERAND_CP_FLAG :
1516214571Sdim      value = 0;
1517214571Sdim      break;
1518214571Sdim    case MEP_OPERAND_CRN :
1519214571Sdim      value = fields->f_crn;
1520214571Sdim      break;
1521214571Sdim    case MEP_OPERAND_CRN64 :
1522214571Sdim      value = fields->f_crn;
1523214571Sdim      break;
1524214571Sdim    case MEP_OPERAND_CRNX :
1525214571Sdim      value = fields->f_crnx;
1526214571Sdim      break;
1527214571Sdim    case MEP_OPERAND_CRNX64 :
1528214571Sdim      value = fields->f_crnx;
1529214571Sdim      break;
1530214571Sdim    case MEP_OPERAND_CSRN :
1531214571Sdim      value = fields->f_csrn;
1532214571Sdim      break;
1533214571Sdim    case MEP_OPERAND_CSRN_IDX :
1534214571Sdim      value = fields->f_csrn;
1535214571Sdim      break;
1536214571Sdim    case MEP_OPERAND_DBG :
1537214571Sdim      value = 0;
1538214571Sdim      break;
1539214571Sdim    case MEP_OPERAND_DEPC :
1540214571Sdim      value = 0;
1541214571Sdim      break;
1542214571Sdim    case MEP_OPERAND_EPC :
1543214571Sdim      value = 0;
1544214571Sdim      break;
1545214571Sdim    case MEP_OPERAND_EXC :
1546214571Sdim      value = 0;
1547214571Sdim      break;
1548214571Sdim    case MEP_OPERAND_FMAX_CCRN :
1549214571Sdim      value = fields->f_fmax_4_4;
1550214571Sdim      break;
1551214571Sdim    case MEP_OPERAND_FMAX_FRD :
1552214571Sdim      value = fields->f_fmax_frd;
1553214571Sdim      break;
1554214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
1555214571Sdim      value = fields->f_fmax_frd;
1556214571Sdim      break;
1557214571Sdim    case MEP_OPERAND_FMAX_FRM :
1558214571Sdim      value = fields->f_fmax_frm;
1559214571Sdim      break;
1560214571Sdim    case MEP_OPERAND_FMAX_FRN :
1561214571Sdim      value = fields->f_fmax_frn;
1562214571Sdim      break;
1563214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
1564214571Sdim      value = fields->f_fmax_frn;
1565214571Sdim      break;
1566214571Sdim    case MEP_OPERAND_FMAX_RM :
1567214571Sdim      value = fields->f_fmax_rm;
1568214571Sdim      break;
1569214571Sdim    case MEP_OPERAND_HI :
1570214571Sdim      value = 0;
1571214571Sdim      break;
1572214571Sdim    case MEP_OPERAND_LO :
1573214571Sdim      value = 0;
1574214571Sdim      break;
1575214571Sdim    case MEP_OPERAND_LP :
1576214571Sdim      value = 0;
1577214571Sdim      break;
1578214571Sdim    case MEP_OPERAND_MB0 :
1579214571Sdim      value = 0;
1580214571Sdim      break;
1581214571Sdim    case MEP_OPERAND_MB1 :
1582214571Sdim      value = 0;
1583214571Sdim      break;
1584214571Sdim    case MEP_OPERAND_ME0 :
1585214571Sdim      value = 0;
1586214571Sdim      break;
1587214571Sdim    case MEP_OPERAND_ME1 :
1588214571Sdim      value = 0;
1589214571Sdim      break;
1590214571Sdim    case MEP_OPERAND_NPC :
1591214571Sdim      value = 0;
1592214571Sdim      break;
1593214571Sdim    case MEP_OPERAND_OPT :
1594214571Sdim      value = 0;
1595214571Sdim      break;
1596214571Sdim    case MEP_OPERAND_PCABS24A2 :
1597214571Sdim      value = fields->f_24u5a2n;
1598214571Sdim      break;
1599214571Sdim    case MEP_OPERAND_PCREL12A2 :
1600214571Sdim      value = fields->f_12s4a2;
1601214571Sdim      break;
1602214571Sdim    case MEP_OPERAND_PCREL17A2 :
1603214571Sdim      value = fields->f_17s16a2;
1604214571Sdim      break;
1605214571Sdim    case MEP_OPERAND_PCREL24A2 :
1606214571Sdim      value = fields->f_24s5a2n;
1607214571Sdim      break;
1608214571Sdim    case MEP_OPERAND_PCREL8A2 :
1609214571Sdim      value = fields->f_8s8a2;
1610214571Sdim      break;
1611214571Sdim    case MEP_OPERAND_PSW :
1612214571Sdim      value = 0;
1613214571Sdim      break;
1614214571Sdim    case MEP_OPERAND_R0 :
1615214571Sdim      value = 0;
1616214571Sdim      break;
1617214571Sdim    case MEP_OPERAND_R1 :
1618214571Sdim      value = 0;
1619214571Sdim      break;
1620214571Sdim    case MEP_OPERAND_RL :
1621214571Sdim      value = fields->f_rl;
1622214571Sdim      break;
1623214571Sdim    case MEP_OPERAND_RM :
1624214571Sdim      value = fields->f_rm;
1625214571Sdim      break;
1626214571Sdim    case MEP_OPERAND_RMA :
1627214571Sdim      value = fields->f_rm;
1628214571Sdim      break;
1629214571Sdim    case MEP_OPERAND_RN :
1630214571Sdim      value = fields->f_rn;
1631214571Sdim      break;
1632214571Sdim    case MEP_OPERAND_RN3 :
1633214571Sdim      value = fields->f_rn3;
1634214571Sdim      break;
1635214571Sdim    case MEP_OPERAND_RN3C :
1636214571Sdim      value = fields->f_rn3;
1637214571Sdim      break;
1638214571Sdim    case MEP_OPERAND_RN3L :
1639214571Sdim      value = fields->f_rn3;
1640214571Sdim      break;
1641214571Sdim    case MEP_OPERAND_RN3S :
1642214571Sdim      value = fields->f_rn3;
1643214571Sdim      break;
1644214571Sdim    case MEP_OPERAND_RN3UC :
1645214571Sdim      value = fields->f_rn3;
1646214571Sdim      break;
1647214571Sdim    case MEP_OPERAND_RN3UL :
1648214571Sdim      value = fields->f_rn3;
1649214571Sdim      break;
1650214571Sdim    case MEP_OPERAND_RN3US :
1651214571Sdim      value = fields->f_rn3;
1652214571Sdim      break;
1653214571Sdim    case MEP_OPERAND_RNC :
1654214571Sdim      value = fields->f_rn;
1655214571Sdim      break;
1656214571Sdim    case MEP_OPERAND_RNL :
1657214571Sdim      value = fields->f_rn;
1658214571Sdim      break;
1659214571Sdim    case MEP_OPERAND_RNS :
1660214571Sdim      value = fields->f_rn;
1661214571Sdim      break;
1662214571Sdim    case MEP_OPERAND_RNUC :
1663214571Sdim      value = fields->f_rn;
1664214571Sdim      break;
1665214571Sdim    case MEP_OPERAND_RNUL :
1666214571Sdim      value = fields->f_rn;
1667214571Sdim      break;
1668214571Sdim    case MEP_OPERAND_RNUS :
1669214571Sdim      value = fields->f_rn;
1670214571Sdim      break;
1671214571Sdim    case MEP_OPERAND_SAR :
1672214571Sdim      value = 0;
1673214571Sdim      break;
1674214571Sdim    case MEP_OPERAND_SDISP16 :
1675214571Sdim      value = fields->f_16s16;
1676214571Sdim      break;
1677214571Sdim    case MEP_OPERAND_SIMM16 :
1678214571Sdim      value = fields->f_16s16;
1679214571Sdim      break;
1680214571Sdim    case MEP_OPERAND_SIMM6 :
1681214571Sdim      value = fields->f_6s8;
1682214571Sdim      break;
1683214571Sdim    case MEP_OPERAND_SIMM8 :
1684214571Sdim      value = fields->f_8s8;
1685214571Sdim      break;
1686214571Sdim    case MEP_OPERAND_SP :
1687214571Sdim      value = 0;
1688214571Sdim      break;
1689214571Sdim    case MEP_OPERAND_SPR :
1690214571Sdim      value = 0;
1691214571Sdim      break;
1692214571Sdim    case MEP_OPERAND_TP :
1693214571Sdim      value = 0;
1694214571Sdim      break;
1695214571Sdim    case MEP_OPERAND_TPR :
1696214571Sdim      value = 0;
1697214571Sdim      break;
1698214571Sdim    case MEP_OPERAND_UDISP2 :
1699214571Sdim      value = fields->f_2u6;
1700214571Sdim      break;
1701214571Sdim    case MEP_OPERAND_UDISP7 :
1702214571Sdim      value = fields->f_7u9;
1703214571Sdim      break;
1704214571Sdim    case MEP_OPERAND_UDISP7A2 :
1705214571Sdim      value = fields->f_7u9a2;
1706214571Sdim      break;
1707214571Sdim    case MEP_OPERAND_UDISP7A4 :
1708214571Sdim      value = fields->f_7u9a4;
1709214571Sdim      break;
1710214571Sdim    case MEP_OPERAND_UIMM16 :
1711214571Sdim      value = fields->f_16u16;
1712214571Sdim      break;
1713214571Sdim    case MEP_OPERAND_UIMM2 :
1714214571Sdim      value = fields->f_2u10;
1715214571Sdim      break;
1716214571Sdim    case MEP_OPERAND_UIMM24 :
1717214571Sdim      value = fields->f_24u8n;
1718214571Sdim      break;
1719214571Sdim    case MEP_OPERAND_UIMM3 :
1720214571Sdim      value = fields->f_3u5;
1721214571Sdim      break;
1722214571Sdim    case MEP_OPERAND_UIMM4 :
1723214571Sdim      value = fields->f_4u8;
1724214571Sdim      break;
1725214571Sdim    case MEP_OPERAND_UIMM5 :
1726214571Sdim      value = fields->f_5u8;
1727214571Sdim      break;
1728214571Sdim    case MEP_OPERAND_UIMM7A4 :
1729214571Sdim      value = fields->f_7u9a4;
1730214571Sdim      break;
1731214571Sdim    case MEP_OPERAND_ZERO :
1732214571Sdim      value = 0;
1733214571Sdim      break;
1734214571Sdim
1735214571Sdim    default :
1736214571Sdim      /* xgettext:c-format */
1737214571Sdim      fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1738214571Sdim		       opindex);
1739214571Sdim      abort ();
1740214571Sdim  }
1741214571Sdim
1742214571Sdim  return value;
1743214571Sdim}
1744214571Sdim
1745214571Sdimbfd_vma
1746214571Sdimmep_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1747214571Sdim			     int opindex,
1748214571Sdim			     const CGEN_FIELDS * fields)
1749214571Sdim{
1750214571Sdim  bfd_vma value;
1751214571Sdim
1752214571Sdim  switch (opindex)
1753214571Sdim    {
1754214571Sdim    case MEP_OPERAND_ADDR24A4 :
1755214571Sdim      value = fields->f_24u8a4n;
1756214571Sdim      break;
1757214571Sdim    case MEP_OPERAND_CALLNUM :
1758214571Sdim      value = fields->f_callnum;
1759214571Sdim      break;
1760214571Sdim    case MEP_OPERAND_CCCC :
1761214571Sdim      value = fields->f_rm;
1762214571Sdim      break;
1763214571Sdim    case MEP_OPERAND_CCRN :
1764214571Sdim      value = fields->f_ccrn;
1765214571Sdim      break;
1766214571Sdim    case MEP_OPERAND_CDISP8 :
1767214571Sdim      value = fields->f_8s24;
1768214571Sdim      break;
1769214571Sdim    case MEP_OPERAND_CDISP8A2 :
1770214571Sdim      value = fields->f_8s24a2;
1771214571Sdim      break;
1772214571Sdim    case MEP_OPERAND_CDISP8A4 :
1773214571Sdim      value = fields->f_8s24a4;
1774214571Sdim      break;
1775214571Sdim    case MEP_OPERAND_CDISP8A8 :
1776214571Sdim      value = fields->f_8s24a8;
1777214571Sdim      break;
1778214571Sdim    case MEP_OPERAND_CIMM4 :
1779214571Sdim      value = fields->f_rn;
1780214571Sdim      break;
1781214571Sdim    case MEP_OPERAND_CIMM5 :
1782214571Sdim      value = fields->f_5u24;
1783214571Sdim      break;
1784214571Sdim    case MEP_OPERAND_CODE16 :
1785214571Sdim      value = fields->f_16u16;
1786214571Sdim      break;
1787214571Sdim    case MEP_OPERAND_CODE24 :
1788214571Sdim      value = fields->f_24u4n;
1789214571Sdim      break;
1790214571Sdim    case MEP_OPERAND_CP_FLAG :
1791214571Sdim      value = 0;
1792214571Sdim      break;
1793214571Sdim    case MEP_OPERAND_CRN :
1794214571Sdim      value = fields->f_crn;
1795214571Sdim      break;
1796214571Sdim    case MEP_OPERAND_CRN64 :
1797214571Sdim      value = fields->f_crn;
1798214571Sdim      break;
1799214571Sdim    case MEP_OPERAND_CRNX :
1800214571Sdim      value = fields->f_crnx;
1801214571Sdim      break;
1802214571Sdim    case MEP_OPERAND_CRNX64 :
1803214571Sdim      value = fields->f_crnx;
1804214571Sdim      break;
1805214571Sdim    case MEP_OPERAND_CSRN :
1806214571Sdim      value = fields->f_csrn;
1807214571Sdim      break;
1808214571Sdim    case MEP_OPERAND_CSRN_IDX :
1809214571Sdim      value = fields->f_csrn;
1810214571Sdim      break;
1811214571Sdim    case MEP_OPERAND_DBG :
1812214571Sdim      value = 0;
1813214571Sdim      break;
1814214571Sdim    case MEP_OPERAND_DEPC :
1815214571Sdim      value = 0;
1816214571Sdim      break;
1817214571Sdim    case MEP_OPERAND_EPC :
1818214571Sdim      value = 0;
1819214571Sdim      break;
1820214571Sdim    case MEP_OPERAND_EXC :
1821214571Sdim      value = 0;
1822214571Sdim      break;
1823214571Sdim    case MEP_OPERAND_FMAX_CCRN :
1824214571Sdim      value = fields->f_fmax_4_4;
1825214571Sdim      break;
1826214571Sdim    case MEP_OPERAND_FMAX_FRD :
1827214571Sdim      value = fields->f_fmax_frd;
1828214571Sdim      break;
1829214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
1830214571Sdim      value = fields->f_fmax_frd;
1831214571Sdim      break;
1832214571Sdim    case MEP_OPERAND_FMAX_FRM :
1833214571Sdim      value = fields->f_fmax_frm;
1834214571Sdim      break;
1835214571Sdim    case MEP_OPERAND_FMAX_FRN :
1836214571Sdim      value = fields->f_fmax_frn;
1837214571Sdim      break;
1838214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
1839214571Sdim      value = fields->f_fmax_frn;
1840214571Sdim      break;
1841214571Sdim    case MEP_OPERAND_FMAX_RM :
1842214571Sdim      value = fields->f_fmax_rm;
1843214571Sdim      break;
1844214571Sdim    case MEP_OPERAND_HI :
1845214571Sdim      value = 0;
1846214571Sdim      break;
1847214571Sdim    case MEP_OPERAND_LO :
1848214571Sdim      value = 0;
1849214571Sdim      break;
1850214571Sdim    case MEP_OPERAND_LP :
1851214571Sdim      value = 0;
1852214571Sdim      break;
1853214571Sdim    case MEP_OPERAND_MB0 :
1854214571Sdim      value = 0;
1855214571Sdim      break;
1856214571Sdim    case MEP_OPERAND_MB1 :
1857214571Sdim      value = 0;
1858214571Sdim      break;
1859214571Sdim    case MEP_OPERAND_ME0 :
1860214571Sdim      value = 0;
1861214571Sdim      break;
1862214571Sdim    case MEP_OPERAND_ME1 :
1863214571Sdim      value = 0;
1864214571Sdim      break;
1865214571Sdim    case MEP_OPERAND_NPC :
1866214571Sdim      value = 0;
1867214571Sdim      break;
1868214571Sdim    case MEP_OPERAND_OPT :
1869214571Sdim      value = 0;
1870214571Sdim      break;
1871214571Sdim    case MEP_OPERAND_PCABS24A2 :
1872214571Sdim      value = fields->f_24u5a2n;
1873214571Sdim      break;
1874214571Sdim    case MEP_OPERAND_PCREL12A2 :
1875214571Sdim      value = fields->f_12s4a2;
1876214571Sdim      break;
1877214571Sdim    case MEP_OPERAND_PCREL17A2 :
1878214571Sdim      value = fields->f_17s16a2;
1879214571Sdim      break;
1880214571Sdim    case MEP_OPERAND_PCREL24A2 :
1881214571Sdim      value = fields->f_24s5a2n;
1882214571Sdim      break;
1883214571Sdim    case MEP_OPERAND_PCREL8A2 :
1884214571Sdim      value = fields->f_8s8a2;
1885214571Sdim      break;
1886214571Sdim    case MEP_OPERAND_PSW :
1887214571Sdim      value = 0;
1888214571Sdim      break;
1889214571Sdim    case MEP_OPERAND_R0 :
1890214571Sdim      value = 0;
1891214571Sdim      break;
1892214571Sdim    case MEP_OPERAND_R1 :
1893214571Sdim      value = 0;
1894214571Sdim      break;
1895214571Sdim    case MEP_OPERAND_RL :
1896214571Sdim      value = fields->f_rl;
1897214571Sdim      break;
1898214571Sdim    case MEP_OPERAND_RM :
1899214571Sdim      value = fields->f_rm;
1900214571Sdim      break;
1901214571Sdim    case MEP_OPERAND_RMA :
1902214571Sdim      value = fields->f_rm;
1903214571Sdim      break;
1904214571Sdim    case MEP_OPERAND_RN :
1905214571Sdim      value = fields->f_rn;
1906214571Sdim      break;
1907214571Sdim    case MEP_OPERAND_RN3 :
1908214571Sdim      value = fields->f_rn3;
1909214571Sdim      break;
1910214571Sdim    case MEP_OPERAND_RN3C :
1911214571Sdim      value = fields->f_rn3;
1912214571Sdim      break;
1913214571Sdim    case MEP_OPERAND_RN3L :
1914214571Sdim      value = fields->f_rn3;
1915214571Sdim      break;
1916214571Sdim    case MEP_OPERAND_RN3S :
1917214571Sdim      value = fields->f_rn3;
1918214571Sdim      break;
1919214571Sdim    case MEP_OPERAND_RN3UC :
1920214571Sdim      value = fields->f_rn3;
1921214571Sdim      break;
1922214571Sdim    case MEP_OPERAND_RN3UL :
1923214571Sdim      value = fields->f_rn3;
1924214571Sdim      break;
1925214571Sdim    case MEP_OPERAND_RN3US :
1926214571Sdim      value = fields->f_rn3;
1927214571Sdim      break;
1928214571Sdim    case MEP_OPERAND_RNC :
1929214571Sdim      value = fields->f_rn;
1930214571Sdim      break;
1931214571Sdim    case MEP_OPERAND_RNL :
1932214571Sdim      value = fields->f_rn;
1933214571Sdim      break;
1934214571Sdim    case MEP_OPERAND_RNS :
1935214571Sdim      value = fields->f_rn;
1936214571Sdim      break;
1937214571Sdim    case MEP_OPERAND_RNUC :
1938214571Sdim      value = fields->f_rn;
1939214571Sdim      break;
1940214571Sdim    case MEP_OPERAND_RNUL :
1941214571Sdim      value = fields->f_rn;
1942214571Sdim      break;
1943214571Sdim    case MEP_OPERAND_RNUS :
1944214571Sdim      value = fields->f_rn;
1945214571Sdim      break;
1946214571Sdim    case MEP_OPERAND_SAR :
1947214571Sdim      value = 0;
1948214571Sdim      break;
1949214571Sdim    case MEP_OPERAND_SDISP16 :
1950214571Sdim      value = fields->f_16s16;
1951214571Sdim      break;
1952214571Sdim    case MEP_OPERAND_SIMM16 :
1953214571Sdim      value = fields->f_16s16;
1954214571Sdim      break;
1955214571Sdim    case MEP_OPERAND_SIMM6 :
1956214571Sdim      value = fields->f_6s8;
1957214571Sdim      break;
1958214571Sdim    case MEP_OPERAND_SIMM8 :
1959214571Sdim      value = fields->f_8s8;
1960214571Sdim      break;
1961214571Sdim    case MEP_OPERAND_SP :
1962214571Sdim      value = 0;
1963214571Sdim      break;
1964214571Sdim    case MEP_OPERAND_SPR :
1965214571Sdim      value = 0;
1966214571Sdim      break;
1967214571Sdim    case MEP_OPERAND_TP :
1968214571Sdim      value = 0;
1969214571Sdim      break;
1970214571Sdim    case MEP_OPERAND_TPR :
1971214571Sdim      value = 0;
1972214571Sdim      break;
1973214571Sdim    case MEP_OPERAND_UDISP2 :
1974214571Sdim      value = fields->f_2u6;
1975214571Sdim      break;
1976214571Sdim    case MEP_OPERAND_UDISP7 :
1977214571Sdim      value = fields->f_7u9;
1978214571Sdim      break;
1979214571Sdim    case MEP_OPERAND_UDISP7A2 :
1980214571Sdim      value = fields->f_7u9a2;
1981214571Sdim      break;
1982214571Sdim    case MEP_OPERAND_UDISP7A4 :
1983214571Sdim      value = fields->f_7u9a4;
1984214571Sdim      break;
1985214571Sdim    case MEP_OPERAND_UIMM16 :
1986214571Sdim      value = fields->f_16u16;
1987214571Sdim      break;
1988214571Sdim    case MEP_OPERAND_UIMM2 :
1989214571Sdim      value = fields->f_2u10;
1990214571Sdim      break;
1991214571Sdim    case MEP_OPERAND_UIMM24 :
1992214571Sdim      value = fields->f_24u8n;
1993214571Sdim      break;
1994214571Sdim    case MEP_OPERAND_UIMM3 :
1995214571Sdim      value = fields->f_3u5;
1996214571Sdim      break;
1997214571Sdim    case MEP_OPERAND_UIMM4 :
1998214571Sdim      value = fields->f_4u8;
1999214571Sdim      break;
2000214571Sdim    case MEP_OPERAND_UIMM5 :
2001214571Sdim      value = fields->f_5u8;
2002214571Sdim      break;
2003214571Sdim    case MEP_OPERAND_UIMM7A4 :
2004214571Sdim      value = fields->f_7u9a4;
2005214571Sdim      break;
2006214571Sdim    case MEP_OPERAND_ZERO :
2007214571Sdim      value = 0;
2008214571Sdim      break;
2009214571Sdim
2010214571Sdim    default :
2011214571Sdim      /* xgettext:c-format */
2012214571Sdim      fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
2013214571Sdim		       opindex);
2014214571Sdim      abort ();
2015214571Sdim  }
2016214571Sdim
2017214571Sdim  return value;
2018214571Sdim}
2019214571Sdim
2020214571Sdimvoid mep_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
2021214571Sdimvoid mep_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
2022214571Sdim
2023214571Sdim/* Stuffing values in cgen_fields is handled by a collection of functions.
2024214571Sdim   They are distinguished by the type of the VALUE argument they accept.
2025214571Sdim   TODO: floating point, inlining support, remove cases where argument type
2026214571Sdim   not appropriate.  */
2027214571Sdim
2028214571Sdimvoid
2029214571Sdimmep_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2030214571Sdim			     int opindex,
2031214571Sdim			     CGEN_FIELDS * fields,
2032214571Sdim			     int value)
2033214571Sdim{
2034214571Sdim  switch (opindex)
2035214571Sdim    {
2036214571Sdim    case MEP_OPERAND_ADDR24A4 :
2037214571Sdim      fields->f_24u8a4n = value;
2038214571Sdim      break;
2039214571Sdim    case MEP_OPERAND_CALLNUM :
2040214571Sdim      fields->f_callnum = value;
2041214571Sdim      break;
2042214571Sdim    case MEP_OPERAND_CCCC :
2043214571Sdim      fields->f_rm = value;
2044214571Sdim      break;
2045214571Sdim    case MEP_OPERAND_CCRN :
2046214571Sdim      fields->f_ccrn = value;
2047214571Sdim      break;
2048214571Sdim    case MEP_OPERAND_CDISP8 :
2049214571Sdim      fields->f_8s24 = value;
2050214571Sdim      break;
2051214571Sdim    case MEP_OPERAND_CDISP8A2 :
2052214571Sdim      fields->f_8s24a2 = value;
2053214571Sdim      break;
2054214571Sdim    case MEP_OPERAND_CDISP8A4 :
2055214571Sdim      fields->f_8s24a4 = value;
2056214571Sdim      break;
2057214571Sdim    case MEP_OPERAND_CDISP8A8 :
2058214571Sdim      fields->f_8s24a8 = value;
2059214571Sdim      break;
2060214571Sdim    case MEP_OPERAND_CIMM4 :
2061214571Sdim      fields->f_rn = value;
2062214571Sdim      break;
2063214571Sdim    case MEP_OPERAND_CIMM5 :
2064214571Sdim      fields->f_5u24 = value;
2065214571Sdim      break;
2066214571Sdim    case MEP_OPERAND_CODE16 :
2067214571Sdim      fields->f_16u16 = value;
2068214571Sdim      break;
2069214571Sdim    case MEP_OPERAND_CODE24 :
2070214571Sdim      fields->f_24u4n = value;
2071214571Sdim      break;
2072214571Sdim    case MEP_OPERAND_CP_FLAG :
2073214571Sdim      break;
2074214571Sdim    case MEP_OPERAND_CRN :
2075214571Sdim      fields->f_crn = value;
2076214571Sdim      break;
2077214571Sdim    case MEP_OPERAND_CRN64 :
2078214571Sdim      fields->f_crn = value;
2079214571Sdim      break;
2080214571Sdim    case MEP_OPERAND_CRNX :
2081214571Sdim      fields->f_crnx = value;
2082214571Sdim      break;
2083214571Sdim    case MEP_OPERAND_CRNX64 :
2084214571Sdim      fields->f_crnx = value;
2085214571Sdim      break;
2086214571Sdim    case MEP_OPERAND_CSRN :
2087214571Sdim      fields->f_csrn = value;
2088214571Sdim      break;
2089214571Sdim    case MEP_OPERAND_CSRN_IDX :
2090214571Sdim      fields->f_csrn = value;
2091214571Sdim      break;
2092214571Sdim    case MEP_OPERAND_DBG :
2093214571Sdim      break;
2094214571Sdim    case MEP_OPERAND_DEPC :
2095214571Sdim      break;
2096214571Sdim    case MEP_OPERAND_EPC :
2097214571Sdim      break;
2098214571Sdim    case MEP_OPERAND_EXC :
2099214571Sdim      break;
2100214571Sdim    case MEP_OPERAND_FMAX_CCRN :
2101214571Sdim      fields->f_fmax_4_4 = value;
2102214571Sdim      break;
2103214571Sdim    case MEP_OPERAND_FMAX_FRD :
2104214571Sdim      fields->f_fmax_frd = value;
2105214571Sdim      break;
2106214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
2107214571Sdim      fields->f_fmax_frd = value;
2108214571Sdim      break;
2109214571Sdim    case MEP_OPERAND_FMAX_FRM :
2110214571Sdim      fields->f_fmax_frm = value;
2111214571Sdim      break;
2112214571Sdim    case MEP_OPERAND_FMAX_FRN :
2113214571Sdim      fields->f_fmax_frn = value;
2114214571Sdim      break;
2115214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
2116214571Sdim      fields->f_fmax_frn = value;
2117214571Sdim      break;
2118214571Sdim    case MEP_OPERAND_FMAX_RM :
2119214571Sdim      fields->f_fmax_rm = value;
2120214571Sdim      break;
2121214571Sdim    case MEP_OPERAND_HI :
2122214571Sdim      break;
2123214571Sdim    case MEP_OPERAND_LO :
2124214571Sdim      break;
2125214571Sdim    case MEP_OPERAND_LP :
2126214571Sdim      break;
2127214571Sdim    case MEP_OPERAND_MB0 :
2128214571Sdim      break;
2129214571Sdim    case MEP_OPERAND_MB1 :
2130214571Sdim      break;
2131214571Sdim    case MEP_OPERAND_ME0 :
2132214571Sdim      break;
2133214571Sdim    case MEP_OPERAND_ME1 :
2134214571Sdim      break;
2135214571Sdim    case MEP_OPERAND_NPC :
2136214571Sdim      break;
2137214571Sdim    case MEP_OPERAND_OPT :
2138214571Sdim      break;
2139214571Sdim    case MEP_OPERAND_PCABS24A2 :
2140214571Sdim      fields->f_24u5a2n = value;
2141214571Sdim      break;
2142214571Sdim    case MEP_OPERAND_PCREL12A2 :
2143214571Sdim      fields->f_12s4a2 = value;
2144214571Sdim      break;
2145214571Sdim    case MEP_OPERAND_PCREL17A2 :
2146214571Sdim      fields->f_17s16a2 = value;
2147214571Sdim      break;
2148214571Sdim    case MEP_OPERAND_PCREL24A2 :
2149214571Sdim      fields->f_24s5a2n = value;
2150214571Sdim      break;
2151214571Sdim    case MEP_OPERAND_PCREL8A2 :
2152214571Sdim      fields->f_8s8a2 = value;
2153214571Sdim      break;
2154214571Sdim    case MEP_OPERAND_PSW :
2155214571Sdim      break;
2156214571Sdim    case MEP_OPERAND_R0 :
2157214571Sdim      break;
2158214571Sdim    case MEP_OPERAND_R1 :
2159214571Sdim      break;
2160214571Sdim    case MEP_OPERAND_RL :
2161214571Sdim      fields->f_rl = value;
2162214571Sdim      break;
2163214571Sdim    case MEP_OPERAND_RM :
2164214571Sdim      fields->f_rm = value;
2165214571Sdim      break;
2166214571Sdim    case MEP_OPERAND_RMA :
2167214571Sdim      fields->f_rm = value;
2168214571Sdim      break;
2169214571Sdim    case MEP_OPERAND_RN :
2170214571Sdim      fields->f_rn = value;
2171214571Sdim      break;
2172214571Sdim    case MEP_OPERAND_RN3 :
2173214571Sdim      fields->f_rn3 = value;
2174214571Sdim      break;
2175214571Sdim    case MEP_OPERAND_RN3C :
2176214571Sdim      fields->f_rn3 = value;
2177214571Sdim      break;
2178214571Sdim    case MEP_OPERAND_RN3L :
2179214571Sdim      fields->f_rn3 = value;
2180214571Sdim      break;
2181214571Sdim    case MEP_OPERAND_RN3S :
2182214571Sdim      fields->f_rn3 = value;
2183214571Sdim      break;
2184214571Sdim    case MEP_OPERAND_RN3UC :
2185214571Sdim      fields->f_rn3 = value;
2186214571Sdim      break;
2187214571Sdim    case MEP_OPERAND_RN3UL :
2188214571Sdim      fields->f_rn3 = value;
2189214571Sdim      break;
2190214571Sdim    case MEP_OPERAND_RN3US :
2191214571Sdim      fields->f_rn3 = value;
2192214571Sdim      break;
2193214571Sdim    case MEP_OPERAND_RNC :
2194214571Sdim      fields->f_rn = value;
2195214571Sdim      break;
2196214571Sdim    case MEP_OPERAND_RNL :
2197214571Sdim      fields->f_rn = value;
2198214571Sdim      break;
2199214571Sdim    case MEP_OPERAND_RNS :
2200214571Sdim      fields->f_rn = value;
2201214571Sdim      break;
2202214571Sdim    case MEP_OPERAND_RNUC :
2203214571Sdim      fields->f_rn = value;
2204214571Sdim      break;
2205214571Sdim    case MEP_OPERAND_RNUL :
2206214571Sdim      fields->f_rn = value;
2207214571Sdim      break;
2208214571Sdim    case MEP_OPERAND_RNUS :
2209214571Sdim      fields->f_rn = value;
2210214571Sdim      break;
2211214571Sdim    case MEP_OPERAND_SAR :
2212214571Sdim      break;
2213214571Sdim    case MEP_OPERAND_SDISP16 :
2214214571Sdim      fields->f_16s16 = value;
2215214571Sdim      break;
2216214571Sdim    case MEP_OPERAND_SIMM16 :
2217214571Sdim      fields->f_16s16 = value;
2218214571Sdim      break;
2219214571Sdim    case MEP_OPERAND_SIMM6 :
2220214571Sdim      fields->f_6s8 = value;
2221214571Sdim      break;
2222214571Sdim    case MEP_OPERAND_SIMM8 :
2223214571Sdim      fields->f_8s8 = value;
2224214571Sdim      break;
2225214571Sdim    case MEP_OPERAND_SP :
2226214571Sdim      break;
2227214571Sdim    case MEP_OPERAND_SPR :
2228214571Sdim      break;
2229214571Sdim    case MEP_OPERAND_TP :
2230214571Sdim      break;
2231214571Sdim    case MEP_OPERAND_TPR :
2232214571Sdim      break;
2233214571Sdim    case MEP_OPERAND_UDISP2 :
2234214571Sdim      fields->f_2u6 = value;
2235214571Sdim      break;
2236214571Sdim    case MEP_OPERAND_UDISP7 :
2237214571Sdim      fields->f_7u9 = value;
2238214571Sdim      break;
2239214571Sdim    case MEP_OPERAND_UDISP7A2 :
2240214571Sdim      fields->f_7u9a2 = value;
2241214571Sdim      break;
2242214571Sdim    case MEP_OPERAND_UDISP7A4 :
2243214571Sdim      fields->f_7u9a4 = value;
2244214571Sdim      break;
2245214571Sdim    case MEP_OPERAND_UIMM16 :
2246214571Sdim      fields->f_16u16 = value;
2247214571Sdim      break;
2248214571Sdim    case MEP_OPERAND_UIMM2 :
2249214571Sdim      fields->f_2u10 = value;
2250214571Sdim      break;
2251214571Sdim    case MEP_OPERAND_UIMM24 :
2252214571Sdim      fields->f_24u8n = value;
2253214571Sdim      break;
2254214571Sdim    case MEP_OPERAND_UIMM3 :
2255214571Sdim      fields->f_3u5 = value;
2256214571Sdim      break;
2257214571Sdim    case MEP_OPERAND_UIMM4 :
2258214571Sdim      fields->f_4u8 = value;
2259214571Sdim      break;
2260214571Sdim    case MEP_OPERAND_UIMM5 :
2261214571Sdim      fields->f_5u8 = value;
2262214571Sdim      break;
2263214571Sdim    case MEP_OPERAND_UIMM7A4 :
2264214571Sdim      fields->f_7u9a4 = value;
2265214571Sdim      break;
2266214571Sdim    case MEP_OPERAND_ZERO :
2267214571Sdim      break;
2268214571Sdim
2269214571Sdim    default :
2270214571Sdim      /* xgettext:c-format */
2271214571Sdim      fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
2272214571Sdim		       opindex);
2273214571Sdim      abort ();
2274214571Sdim  }
2275214571Sdim}
2276214571Sdim
2277214571Sdimvoid
2278214571Sdimmep_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2279214571Sdim			     int opindex,
2280214571Sdim			     CGEN_FIELDS * fields,
2281214571Sdim			     bfd_vma value)
2282214571Sdim{
2283214571Sdim  switch (opindex)
2284214571Sdim    {
2285214571Sdim    case MEP_OPERAND_ADDR24A4 :
2286214571Sdim      fields->f_24u8a4n = value;
2287214571Sdim      break;
2288214571Sdim    case MEP_OPERAND_CALLNUM :
2289214571Sdim      fields->f_callnum = value;
2290214571Sdim      break;
2291214571Sdim    case MEP_OPERAND_CCCC :
2292214571Sdim      fields->f_rm = value;
2293214571Sdim      break;
2294214571Sdim    case MEP_OPERAND_CCRN :
2295214571Sdim      fields->f_ccrn = value;
2296214571Sdim      break;
2297214571Sdim    case MEP_OPERAND_CDISP8 :
2298214571Sdim      fields->f_8s24 = value;
2299214571Sdim      break;
2300214571Sdim    case MEP_OPERAND_CDISP8A2 :
2301214571Sdim      fields->f_8s24a2 = value;
2302214571Sdim      break;
2303214571Sdim    case MEP_OPERAND_CDISP8A4 :
2304214571Sdim      fields->f_8s24a4 = value;
2305214571Sdim      break;
2306214571Sdim    case MEP_OPERAND_CDISP8A8 :
2307214571Sdim      fields->f_8s24a8 = value;
2308214571Sdim      break;
2309214571Sdim    case MEP_OPERAND_CIMM4 :
2310214571Sdim      fields->f_rn = value;
2311214571Sdim      break;
2312214571Sdim    case MEP_OPERAND_CIMM5 :
2313214571Sdim      fields->f_5u24 = value;
2314214571Sdim      break;
2315214571Sdim    case MEP_OPERAND_CODE16 :
2316214571Sdim      fields->f_16u16 = value;
2317214571Sdim      break;
2318214571Sdim    case MEP_OPERAND_CODE24 :
2319214571Sdim      fields->f_24u4n = value;
2320214571Sdim      break;
2321214571Sdim    case MEP_OPERAND_CP_FLAG :
2322214571Sdim      break;
2323214571Sdim    case MEP_OPERAND_CRN :
2324214571Sdim      fields->f_crn = value;
2325214571Sdim      break;
2326214571Sdim    case MEP_OPERAND_CRN64 :
2327214571Sdim      fields->f_crn = value;
2328214571Sdim      break;
2329214571Sdim    case MEP_OPERAND_CRNX :
2330214571Sdim      fields->f_crnx = value;
2331214571Sdim      break;
2332214571Sdim    case MEP_OPERAND_CRNX64 :
2333214571Sdim      fields->f_crnx = value;
2334214571Sdim      break;
2335214571Sdim    case MEP_OPERAND_CSRN :
2336214571Sdim      fields->f_csrn = value;
2337214571Sdim      break;
2338214571Sdim    case MEP_OPERAND_CSRN_IDX :
2339214571Sdim      fields->f_csrn = value;
2340214571Sdim      break;
2341214571Sdim    case MEP_OPERAND_DBG :
2342214571Sdim      break;
2343214571Sdim    case MEP_OPERAND_DEPC :
2344214571Sdim      break;
2345214571Sdim    case MEP_OPERAND_EPC :
2346214571Sdim      break;
2347214571Sdim    case MEP_OPERAND_EXC :
2348214571Sdim      break;
2349214571Sdim    case MEP_OPERAND_FMAX_CCRN :
2350214571Sdim      fields->f_fmax_4_4 = value;
2351214571Sdim      break;
2352214571Sdim    case MEP_OPERAND_FMAX_FRD :
2353214571Sdim      fields->f_fmax_frd = value;
2354214571Sdim      break;
2355214571Sdim    case MEP_OPERAND_FMAX_FRD_INT :
2356214571Sdim      fields->f_fmax_frd = value;
2357214571Sdim      break;
2358214571Sdim    case MEP_OPERAND_FMAX_FRM :
2359214571Sdim      fields->f_fmax_frm = value;
2360214571Sdim      break;
2361214571Sdim    case MEP_OPERAND_FMAX_FRN :
2362214571Sdim      fields->f_fmax_frn = value;
2363214571Sdim      break;
2364214571Sdim    case MEP_OPERAND_FMAX_FRN_INT :
2365214571Sdim      fields->f_fmax_frn = value;
2366214571Sdim      break;
2367214571Sdim    case MEP_OPERAND_FMAX_RM :
2368214571Sdim      fields->f_fmax_rm = value;
2369214571Sdim      break;
2370214571Sdim    case MEP_OPERAND_HI :
2371214571Sdim      break;
2372214571Sdim    case MEP_OPERAND_LO :
2373214571Sdim      break;
2374214571Sdim    case MEP_OPERAND_LP :
2375214571Sdim      break;
2376214571Sdim    case MEP_OPERAND_MB0 :
2377214571Sdim      break;
2378214571Sdim    case MEP_OPERAND_MB1 :
2379214571Sdim      break;
2380214571Sdim    case MEP_OPERAND_ME0 :
2381214571Sdim      break;
2382214571Sdim    case MEP_OPERAND_ME1 :
2383214571Sdim      break;
2384214571Sdim    case MEP_OPERAND_NPC :
2385214571Sdim      break;
2386214571Sdim    case MEP_OPERAND_OPT :
2387214571Sdim      break;
2388214571Sdim    case MEP_OPERAND_PCABS24A2 :
2389214571Sdim      fields->f_24u5a2n = value;
2390214571Sdim      break;
2391214571Sdim    case MEP_OPERAND_PCREL12A2 :
2392214571Sdim      fields->f_12s4a2 = value;
2393214571Sdim      break;
2394214571Sdim    case MEP_OPERAND_PCREL17A2 :
2395214571Sdim      fields->f_17s16a2 = value;
2396214571Sdim      break;
2397214571Sdim    case MEP_OPERAND_PCREL24A2 :
2398214571Sdim      fields->f_24s5a2n = value;
2399214571Sdim      break;
2400214571Sdim    case MEP_OPERAND_PCREL8A2 :
2401214571Sdim      fields->f_8s8a2 = value;
2402214571Sdim      break;
2403214571Sdim    case MEP_OPERAND_PSW :
2404214571Sdim      break;
2405214571Sdim    case MEP_OPERAND_R0 :
2406214571Sdim      break;
2407214571Sdim    case MEP_OPERAND_R1 :
2408214571Sdim      break;
2409214571Sdim    case MEP_OPERAND_RL :
2410214571Sdim      fields->f_rl = value;
2411214571Sdim      break;
2412214571Sdim    case MEP_OPERAND_RM :
2413214571Sdim      fields->f_rm = value;
2414214571Sdim      break;
2415214571Sdim    case MEP_OPERAND_RMA :
2416214571Sdim      fields->f_rm = value;
2417214571Sdim      break;
2418214571Sdim    case MEP_OPERAND_RN :
2419214571Sdim      fields->f_rn = value;
2420214571Sdim      break;
2421214571Sdim    case MEP_OPERAND_RN3 :
2422214571Sdim      fields->f_rn3 = value;
2423214571Sdim      break;
2424214571Sdim    case MEP_OPERAND_RN3C :
2425214571Sdim      fields->f_rn3 = value;
2426214571Sdim      break;
2427214571Sdim    case MEP_OPERAND_RN3L :
2428214571Sdim      fields->f_rn3 = value;
2429214571Sdim      break;
2430214571Sdim    case MEP_OPERAND_RN3S :
2431214571Sdim      fields->f_rn3 = value;
2432214571Sdim      break;
2433214571Sdim    case MEP_OPERAND_RN3UC :
2434214571Sdim      fields->f_rn3 = value;
2435214571Sdim      break;
2436214571Sdim    case MEP_OPERAND_RN3UL :
2437214571Sdim      fields->f_rn3 = value;
2438214571Sdim      break;
2439214571Sdim    case MEP_OPERAND_RN3US :
2440214571Sdim      fields->f_rn3 = value;
2441214571Sdim      break;
2442214571Sdim    case MEP_OPERAND_RNC :
2443214571Sdim      fields->f_rn = value;
2444214571Sdim      break;
2445214571Sdim    case MEP_OPERAND_RNL :
2446214571Sdim      fields->f_rn = value;
2447214571Sdim      break;
2448214571Sdim    case MEP_OPERAND_RNS :
2449214571Sdim      fields->f_rn = value;
2450214571Sdim      break;
2451214571Sdim    case MEP_OPERAND_RNUC :
2452214571Sdim      fields->f_rn = value;
2453214571Sdim      break;
2454214571Sdim    case MEP_OPERAND_RNUL :
2455214571Sdim      fields->f_rn = value;
2456214571Sdim      break;
2457214571Sdim    case MEP_OPERAND_RNUS :
2458214571Sdim      fields->f_rn = value;
2459214571Sdim      break;
2460214571Sdim    case MEP_OPERAND_SAR :
2461214571Sdim      break;
2462214571Sdim    case MEP_OPERAND_SDISP16 :
2463214571Sdim      fields->f_16s16 = value;
2464214571Sdim      break;
2465214571Sdim    case MEP_OPERAND_SIMM16 :
2466214571Sdim      fields->f_16s16 = value;
2467214571Sdim      break;
2468214571Sdim    case MEP_OPERAND_SIMM6 :
2469214571Sdim      fields->f_6s8 = value;
2470214571Sdim      break;
2471214571Sdim    case MEP_OPERAND_SIMM8 :
2472214571Sdim      fields->f_8s8 = value;
2473214571Sdim      break;
2474214571Sdim    case MEP_OPERAND_SP :
2475214571Sdim      break;
2476214571Sdim    case MEP_OPERAND_SPR :
2477214571Sdim      break;
2478214571Sdim    case MEP_OPERAND_TP :
2479214571Sdim      break;
2480214571Sdim    case MEP_OPERAND_TPR :
2481214571Sdim      break;
2482214571Sdim    case MEP_OPERAND_UDISP2 :
2483214571Sdim      fields->f_2u6 = value;
2484214571Sdim      break;
2485214571Sdim    case MEP_OPERAND_UDISP7 :
2486214571Sdim      fields->f_7u9 = value;
2487214571Sdim      break;
2488214571Sdim    case MEP_OPERAND_UDISP7A2 :
2489214571Sdim      fields->f_7u9a2 = value;
2490214571Sdim      break;
2491214571Sdim    case MEP_OPERAND_UDISP7A4 :
2492214571Sdim      fields->f_7u9a4 = value;
2493214571Sdim      break;
2494214571Sdim    case MEP_OPERAND_UIMM16 :
2495214571Sdim      fields->f_16u16 = value;
2496214571Sdim      break;
2497214571Sdim    case MEP_OPERAND_UIMM2 :
2498214571Sdim      fields->f_2u10 = value;
2499214571Sdim      break;
2500214571Sdim    case MEP_OPERAND_UIMM24 :
2501214571Sdim      fields->f_24u8n = value;
2502214571Sdim      break;
2503214571Sdim    case MEP_OPERAND_UIMM3 :
2504214571Sdim      fields->f_3u5 = value;
2505214571Sdim      break;
2506214571Sdim    case MEP_OPERAND_UIMM4 :
2507214571Sdim      fields->f_4u8 = value;
2508214571Sdim      break;
2509214571Sdim    case MEP_OPERAND_UIMM5 :
2510214571Sdim      fields->f_5u8 = value;
2511214571Sdim      break;
2512214571Sdim    case MEP_OPERAND_UIMM7A4 :
2513214571Sdim      fields->f_7u9a4 = value;
2514214571Sdim      break;
2515214571Sdim    case MEP_OPERAND_ZERO :
2516214571Sdim      break;
2517214571Sdim
2518214571Sdim    default :
2519214571Sdim      /* xgettext:c-format */
2520214571Sdim      fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
2521214571Sdim		       opindex);
2522214571Sdim      abort ();
2523214571Sdim  }
2524214571Sdim}
2525214571Sdim
2526214571Sdim/* Function to call before using the instruction builder tables.  */
2527214571Sdim
2528214571Sdimvoid
2529214571Sdimmep_cgen_init_ibld_table (CGEN_CPU_DESC cd)
2530214571Sdim{
2531214571Sdim  cd->insert_handlers = & mep_cgen_insert_handlers[0];
2532214571Sdim  cd->extract_handlers = & mep_cgen_extract_handlers[0];
2533214571Sdim
2534214571Sdim  cd->insert_operand = mep_cgen_insert_operand;
2535214571Sdim  cd->extract_operand = mep_cgen_extract_operand;
2536214571Sdim
2537214571Sdim  cd->get_int_operand = mep_cgen_get_int_operand;
2538214571Sdim  cd->set_int_operand = mep_cgen_set_int_operand;
2539214571Sdim  cd->get_vma_operand = mep_cgen_get_vma_operand;
2540214571Sdim  cd->set_vma_operand = mep_cgen_set_vma_operand;
2541214571Sdim}
2542