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