[cgen]
[platform/upstream/binutils.git] / opcodes / mep-ibld.c
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, 2007,
7    2008  Free Software Foundation, Inc.
8
9    This file is part of libopcodes.
10
11    This library is free software; you can redistribute it and/or modify
12    it under the terms of the GNU General Public License as published by
13    the Free Software Foundation; either version 3, or (at your option)
14    any later version.
15
16    It is distributed in the hope that it will be useful, but WITHOUT
17    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
18    or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
19    License for more details.
20
21    You should have received a copy of the GNU General Public License
22    along with this program; if not, write to the Free Software Foundation, Inc.,
23    51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
24
25 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
26    Keep that in mind.  */
27
28 #include "sysdep.h"
29 #include <stdio.h>
30 #include "ansidecl.h"
31 #include "dis-asm.h"
32 #include "bfd.h"
33 #include "symcat.h"
34 #include "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
47 static 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);
50 static const char * insert_insn_normal
51   (CGEN_CPU_DESC, const CGEN_INSN *,
52    CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
53 static 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 *);
57 static 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
61 static 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
65 static CGEN_INLINE void insert_1
66   (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
67 static CGEN_INLINE int fill_cache
68   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
69 static CGEN_INLINE long extract_1
70   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
71 #endif
72 \f
73 /* Operand insertion.  */
74
75 #if ! CGEN_INT_INSN_P
76
77 /* Subroutine of insert_normal.  */
78
79 static CGEN_INLINE void
80 insert_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
121 static const char *
122 insert_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
239 static const char *
240 insert_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
294 static void
295 put_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 \f
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
326 static CGEN_INLINE int
327 fill_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
370 static CGEN_INLINE long
371 extract_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
413 static int
414 extract_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
505 static int
506 extract_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 \f
537 /* Machine generated code added here.  */
538
539 const 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
556 const char *
557 mep_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_C5RMUIMM20 :
583       {
584 {
585   FLD (f_c5_rm) = ((unsigned int) (FLD (f_c5_rmuimm20)) >> (16));
586   FLD (f_c5_16u16) = ((FLD (f_c5_rmuimm20)) & (65535));
587 }
588         errmsg = insert_normal (cd, fields->f_c5_rm, 0, 0, 8, 4, 32, total_length, buffer);
589         if (errmsg)
590           break;
591         errmsg = insert_normal (cd, fields->f_c5_16u16, 0, 0, 16, 16, 32, total_length, buffer);
592         if (errmsg)
593           break;
594       }
595       break;
596     case MEP_OPERAND_C5RNMUIMM24 :
597       {
598 {
599   FLD (f_c5_rnm) = ((unsigned int) (FLD (f_c5_rnmuimm24)) >> (16));
600   FLD (f_c5_16u16) = ((FLD (f_c5_rnmuimm24)) & (65535));
601 }
602         errmsg = insert_normal (cd, fields->f_c5_rnm, 0, 0, 4, 8, 32, total_length, buffer);
603         if (errmsg)
604           break;
605         errmsg = insert_normal (cd, fields->f_c5_16u16, 0, 0, 16, 16, 32, total_length, buffer);
606         if (errmsg)
607           break;
608       }
609       break;
610     case MEP_OPERAND_CALLNUM :
611       {
612 {
613   FLD (f_5) = ((((unsigned int) (FLD (f_callnum)) >> (3))) & (1));
614   FLD (f_6) = ((((unsigned int) (FLD (f_callnum)) >> (2))) & (1));
615   FLD (f_7) = ((((unsigned int) (FLD (f_callnum)) >> (1))) & (1));
616   FLD (f_11) = ((FLD (f_callnum)) & (1));
617 }
618         errmsg = insert_normal (cd, fields->f_5, 0, 0, 5, 1, 32, total_length, buffer);
619         if (errmsg)
620           break;
621         errmsg = insert_normal (cd, fields->f_6, 0, 0, 6, 1, 32, total_length, buffer);
622         if (errmsg)
623           break;
624         errmsg = insert_normal (cd, fields->f_7, 0, 0, 7, 1, 32, total_length, buffer);
625         if (errmsg)
626           break;
627         errmsg = insert_normal (cd, fields->f_11, 0, 0, 11, 1, 32, total_length, buffer);
628         if (errmsg)
629           break;
630       }
631       break;
632     case MEP_OPERAND_CCCC :
633       errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
634       break;
635     case MEP_OPERAND_CCRN :
636       {
637 {
638   FLD (f_ccrn_hi) = ((((unsigned int) (FLD (f_ccrn)) >> (4))) & (3));
639   FLD (f_ccrn_lo) = ((FLD (f_ccrn)) & (15));
640 }
641         errmsg = insert_normal (cd, fields->f_ccrn_hi, 0, 0, 28, 2, 32, total_length, buffer);
642         if (errmsg)
643           break;
644         errmsg = insert_normal (cd, fields->f_ccrn_lo, 0, 0, 4, 4, 32, total_length, buffer);
645         if (errmsg)
646           break;
647       }
648       break;
649     case MEP_OPERAND_CDISP10 :
650       {
651         long value = fields->f_cdisp10;
652         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
653         errmsg = insert_normal (cd, value, 0, 0, 22, 10, 32, total_length, buffer);
654       }
655       break;
656     case MEP_OPERAND_CDISP10A2 :
657       {
658         long value = fields->f_cdisp10;
659         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
660         errmsg = insert_normal (cd, value, 0, 0, 22, 10, 32, total_length, buffer);
661       }
662       break;
663     case MEP_OPERAND_CDISP10A4 :
664       {
665         long value = fields->f_cdisp10;
666         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
667         errmsg = insert_normal (cd, value, 0, 0, 22, 10, 32, total_length, buffer);
668       }
669       break;
670     case MEP_OPERAND_CDISP10A8 :
671       {
672         long value = fields->f_cdisp10;
673         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
674         errmsg = insert_normal (cd, value, 0, 0, 22, 10, 32, total_length, buffer);
675       }
676       break;
677     case MEP_OPERAND_CDISP12 :
678       errmsg = insert_normal (cd, fields->f_12s20, 0, 0, 20, 12, 32, total_length, buffer);
679       break;
680     case MEP_OPERAND_CIMM4 :
681       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
682       break;
683     case MEP_OPERAND_CIMM5 :
684       errmsg = insert_normal (cd, fields->f_5u24, 0, 0, 24, 5, 32, total_length, buffer);
685       break;
686     case MEP_OPERAND_CODE16 :
687       errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
688       break;
689     case MEP_OPERAND_CODE24 :
690       {
691 {
692   FLD (f_24u4n_hi) = ((unsigned int) (FLD (f_24u4n)) >> (16));
693   FLD (f_24u4n_lo) = ((FLD (f_24u4n)) & (65535));
694 }
695         errmsg = insert_normal (cd, fields->f_24u4n_hi, 0, 0, 4, 8, 32, total_length, buffer);
696         if (errmsg)
697           break;
698         errmsg = insert_normal (cd, fields->f_24u4n_lo, 0, 0, 16, 16, 32, total_length, buffer);
699         if (errmsg)
700           break;
701       }
702       break;
703     case MEP_OPERAND_CP_FLAG :
704       break;
705     case MEP_OPERAND_CRN :
706       errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
707       break;
708     case MEP_OPERAND_CRN64 :
709       errmsg = insert_normal (cd, fields->f_crn, 0, 0, 4, 4, 32, total_length, buffer);
710       break;
711     case MEP_OPERAND_CRNX :
712       {
713 {
714   FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
715   FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
716 }
717         errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
718         if (errmsg)
719           break;
720         errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
721         if (errmsg)
722           break;
723       }
724       break;
725     case MEP_OPERAND_CRNX64 :
726       {
727 {
728   FLD (f_crnx_lo) = ((FLD (f_crnx)) & (15));
729   FLD (f_crnx_hi) = ((unsigned int) (FLD (f_crnx)) >> (4));
730 }
731         errmsg = insert_normal (cd, fields->f_crnx_hi, 0, 0, 28, 1, 32, total_length, buffer);
732         if (errmsg)
733           break;
734         errmsg = insert_normal (cd, fields->f_crnx_lo, 0, 0, 4, 4, 32, total_length, buffer);
735         if (errmsg)
736           break;
737       }
738       break;
739     case MEP_OPERAND_CSRN :
740       {
741 {
742   FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
743   FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
744 }
745         errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
746         if (errmsg)
747           break;
748         errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
749         if (errmsg)
750           break;
751       }
752       break;
753     case MEP_OPERAND_CSRN_IDX :
754       {
755 {
756   FLD (f_csrn_lo) = ((FLD (f_csrn)) & (15));
757   FLD (f_csrn_hi) = ((unsigned int) (FLD (f_csrn)) >> (4));
758 }
759         errmsg = insert_normal (cd, fields->f_csrn_hi, 0, 0, 15, 1, 32, total_length, buffer);
760         if (errmsg)
761           break;
762         errmsg = insert_normal (cd, fields->f_csrn_lo, 0, 0, 8, 4, 32, total_length, buffer);
763         if (errmsg)
764           break;
765       }
766       break;
767     case MEP_OPERAND_DBG :
768       break;
769     case MEP_OPERAND_DEPC :
770       break;
771     case MEP_OPERAND_EPC :
772       break;
773     case MEP_OPERAND_EXC :
774       break;
775     case MEP_OPERAND_HI :
776       break;
777     case MEP_OPERAND_LO :
778       break;
779     case MEP_OPERAND_LP :
780       break;
781     case MEP_OPERAND_MB0 :
782       break;
783     case MEP_OPERAND_MB1 :
784       break;
785     case MEP_OPERAND_ME0 :
786       break;
787     case MEP_OPERAND_ME1 :
788       break;
789     case MEP_OPERAND_NPC :
790       break;
791     case MEP_OPERAND_OPT :
792       break;
793     case MEP_OPERAND_PCABS24A2 :
794       {
795 {
796   FLD (f_24u5a2n_lo) = ((unsigned int) (((FLD (f_24u5a2n)) & (255))) >> (1));
797   FLD (f_24u5a2n_hi) = ((unsigned int) (FLD (f_24u5a2n)) >> (8));
798 }
799         errmsg = insert_normal (cd, fields->f_24u5a2n_hi, 0, 0, 16, 16, 32, total_length, buffer);
800         if (errmsg)
801           break;
802         errmsg = insert_normal (cd, fields->f_24u5a2n_lo, 0, 0, 5, 7, 32, total_length, buffer);
803         if (errmsg)
804           break;
805       }
806       break;
807     case MEP_OPERAND_PCREL12A2 :
808       {
809         long value = fields->f_12s4a2;
810         value = ((int) (((value) - (pc))) >> (1));
811         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 4, 11, 32, total_length, buffer);
812       }
813       break;
814     case MEP_OPERAND_PCREL17A2 :
815       {
816         long value = fields->f_17s16a2;
817         value = ((int) (((value) - (pc))) >> (1));
818         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer);
819       }
820       break;
821     case MEP_OPERAND_PCREL24A2 :
822       {
823 {
824   FLD (f_24s5a2n) = ((FLD (f_24s5a2n)) - (pc));
825   FLD (f_24s5a2n_lo) = ((unsigned int) (((FLD (f_24s5a2n)) & (254))) >> (1));
826   FLD (f_24s5a2n_hi) = ((int) (FLD (f_24s5a2n)) >> (8));
827 }
828         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);
829         if (errmsg)
830           break;
831         errmsg = insert_normal (cd, fields->f_24s5a2n_lo, 0|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 7, 32, total_length, buffer);
832         if (errmsg)
833           break;
834       }
835       break;
836     case MEP_OPERAND_PCREL8A2 :
837       {
838         long value = fields->f_8s8a2;
839         value = ((int) (((value) - (pc))) >> (1));
840         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 7, 32, total_length, buffer);
841       }
842       break;
843     case MEP_OPERAND_PSW :
844       break;
845     case MEP_OPERAND_R0 :
846       break;
847     case MEP_OPERAND_R1 :
848       break;
849     case MEP_OPERAND_RL :
850       errmsg = insert_normal (cd, fields->f_rl, 0, 0, 12, 4, 32, total_length, buffer);
851       break;
852     case MEP_OPERAND_RL5 :
853       errmsg = insert_normal (cd, fields->f_rl5, 0, 0, 20, 4, 32, total_length, buffer);
854       break;
855     case MEP_OPERAND_RM :
856       errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
857       break;
858     case MEP_OPERAND_RMA :
859       errmsg = insert_normal (cd, fields->f_rm, 0, 0, 8, 4, 32, total_length, buffer);
860       break;
861     case MEP_OPERAND_RN :
862       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
863       break;
864     case MEP_OPERAND_RN3 :
865       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
866       break;
867     case MEP_OPERAND_RN3C :
868       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
869       break;
870     case MEP_OPERAND_RN3L :
871       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
872       break;
873     case MEP_OPERAND_RN3S :
874       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
875       break;
876     case MEP_OPERAND_RN3UC :
877       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
878       break;
879     case MEP_OPERAND_RN3UL :
880       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
881       break;
882     case MEP_OPERAND_RN3US :
883       errmsg = insert_normal (cd, fields->f_rn3, 0, 0, 5, 3, 32, total_length, buffer);
884       break;
885     case MEP_OPERAND_RNC :
886       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
887       break;
888     case MEP_OPERAND_RNL :
889       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
890       break;
891     case MEP_OPERAND_RNS :
892       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
893       break;
894     case MEP_OPERAND_RNUC :
895       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
896       break;
897     case MEP_OPERAND_RNUL :
898       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
899       break;
900     case MEP_OPERAND_RNUS :
901       errmsg = insert_normal (cd, fields->f_rn, 0, 0, 4, 4, 32, total_length, buffer);
902       break;
903     case MEP_OPERAND_SAR :
904       break;
905     case MEP_OPERAND_SDISP16 :
906       errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
907       break;
908     case MEP_OPERAND_SIMM16 :
909       errmsg = insert_normal (cd, fields->f_16s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
910       break;
911     case MEP_OPERAND_SIMM6 :
912       errmsg = insert_normal (cd, fields->f_6s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, buffer);
913       break;
914     case MEP_OPERAND_SIMM8 :
915       errmsg = insert_normal (cd, fields->f_8s8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer);
916       break;
917     case MEP_OPERAND_SP :
918       break;
919     case MEP_OPERAND_SPR :
920       break;
921     case MEP_OPERAND_TP :
922       break;
923     case MEP_OPERAND_TPR :
924       break;
925     case MEP_OPERAND_UDISP2 :
926       errmsg = insert_normal (cd, fields->f_2u6, 0, 0, 6, 2, 32, total_length, buffer);
927       break;
928     case MEP_OPERAND_UDISP7 :
929       errmsg = insert_normal (cd, fields->f_7u9, 0, 0, 9, 7, 32, total_length, buffer);
930       break;
931     case MEP_OPERAND_UDISP7A2 :
932       {
933         long value = fields->f_7u9a2;
934         value = ((unsigned int) (value) >> (1));
935         errmsg = insert_normal (cd, value, 0, 0, 9, 6, 32, total_length, buffer);
936       }
937       break;
938     case MEP_OPERAND_UDISP7A4 :
939       {
940         long value = fields->f_7u9a4;
941         value = ((unsigned int) (value) >> (2));
942         errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
943       }
944       break;
945     case MEP_OPERAND_UIMM16 :
946       errmsg = insert_normal (cd, fields->f_16u16, 0, 0, 16, 16, 32, total_length, buffer);
947       break;
948     case MEP_OPERAND_UIMM2 :
949       errmsg = insert_normal (cd, fields->f_2u10, 0, 0, 10, 2, 32, total_length, buffer);
950       break;
951     case MEP_OPERAND_UIMM24 :
952       {
953 {
954   FLD (f_24u8n_hi) = ((unsigned int) (FLD (f_24u8n)) >> (8));
955   FLD (f_24u8n_lo) = ((FLD (f_24u8n)) & (255));
956 }
957         errmsg = insert_normal (cd, fields->f_24u8n_hi, 0, 0, 16, 16, 32, total_length, buffer);
958         if (errmsg)
959           break;
960         errmsg = insert_normal (cd, fields->f_24u8n_lo, 0, 0, 8, 8, 32, total_length, buffer);
961         if (errmsg)
962           break;
963       }
964       break;
965     case MEP_OPERAND_UIMM3 :
966       errmsg = insert_normal (cd, fields->f_3u5, 0, 0, 5, 3, 32, total_length, buffer);
967       break;
968     case MEP_OPERAND_UIMM4 :
969       errmsg = insert_normal (cd, fields->f_4u8, 0, 0, 8, 4, 32, total_length, buffer);
970       break;
971     case MEP_OPERAND_UIMM5 :
972       errmsg = insert_normal (cd, fields->f_5u8, 0, 0, 8, 5, 32, total_length, buffer);
973       break;
974     case MEP_OPERAND_UIMM7A4 :
975       {
976         long value = fields->f_7u9a4;
977         value = ((unsigned int) (value) >> (2));
978         errmsg = insert_normal (cd, value, 0, 0, 9, 5, 32, total_length, buffer);
979       }
980       break;
981     case MEP_OPERAND_ZERO :
982       break;
983
984     default :
985       /* xgettext:c-format */
986       fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
987                opindex);
988       abort ();
989   }
990
991   return errmsg;
992 }
993
994 int mep_cgen_extract_operand
995   (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
996
997 /* Main entry point for operand extraction.
998    The result is <= 0 for error, >0 for success.
999    ??? Actual values aren't well defined right now.
1000
1001    This function is basically just a big switch statement.  Earlier versions
1002    used tables to look up the function to use, but
1003    - if the table contains both assembler and disassembler functions then
1004      the disassembler contains much of the assembler and vice-versa,
1005    - there's a lot of inlining possibilities as things grow,
1006    - using a switch statement avoids the function call overhead.
1007
1008    This function could be moved into `print_insn_normal', but keeping it
1009    separate makes clear the interface between `print_insn_normal' and each of
1010    the handlers.  */
1011
1012 int
1013 mep_cgen_extract_operand (CGEN_CPU_DESC cd,
1014                              int opindex,
1015                              CGEN_EXTRACT_INFO *ex_info,
1016                              CGEN_INSN_INT insn_value,
1017                              CGEN_FIELDS * fields,
1018                              bfd_vma pc)
1019 {
1020   /* Assume success (for those operands that are nops).  */
1021   int length = 1;
1022   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
1023
1024   switch (opindex)
1025     {
1026     case MEP_OPERAND_ADDR24A4 :
1027       {
1028         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8a4n_hi);
1029         if (length <= 0) break;
1030         length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 6, 32, total_length, pc, & fields->f_24u8a4n_lo);
1031         if (length <= 0) break;
1032   FLD (f_24u8a4n) = ((((FLD (f_24u8a4n_hi)) << (8))) | (((FLD (f_24u8a4n_lo)) << (2))));
1033       }
1034       break;
1035     case MEP_OPERAND_C5RMUIMM20 :
1036       {
1037         length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_c5_rm);
1038         if (length <= 0) break;
1039         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_c5_16u16);
1040         if (length <= 0) break;
1041 {
1042   FLD (f_c5_rmuimm20) = ((FLD (f_c5_16u16)) | (((FLD (f_c5_rm)) << (16))));
1043 }
1044       }
1045       break;
1046     case MEP_OPERAND_C5RNMUIMM24 :
1047       {
1048         length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_c5_rnm);
1049         if (length <= 0) break;
1050         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_c5_16u16);
1051         if (length <= 0) break;
1052 {
1053   FLD (f_c5_rnmuimm24) = ((FLD (f_c5_16u16)) | (((FLD (f_c5_rnm)) << (16))));
1054 }
1055       }
1056       break;
1057     case MEP_OPERAND_CALLNUM :
1058       {
1059         length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_5);
1060         if (length <= 0) break;
1061         length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_6);
1062         if (length <= 0) break;
1063         length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_7);
1064         if (length <= 0) break;
1065         length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_11);
1066         if (length <= 0) break;
1067   FLD (f_callnum) = ((((FLD (f_5)) << (3))) | (((((FLD (f_6)) << (2))) | (((((FLD (f_7)) << (1))) | (FLD (f_11)))))));
1068       }
1069       break;
1070     case MEP_OPERAND_CCCC :
1071       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1072       break;
1073     case MEP_OPERAND_CCRN :
1074       {
1075         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 2, 32, total_length, pc, & fields->f_ccrn_hi);
1076         if (length <= 0) break;
1077         length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_ccrn_lo);
1078         if (length <= 0) break;
1079   FLD (f_ccrn) = ((((FLD (f_ccrn_hi)) << (4))) | (FLD (f_ccrn_lo)));
1080       }
1081       break;
1082     case MEP_OPERAND_CDISP10 :
1083       {
1084         long value;
1085         length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 10, 32, total_length, pc, & value);
1086         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
1087         fields->f_cdisp10 = value;
1088       }
1089       break;
1090     case MEP_OPERAND_CDISP10A2 :
1091       {
1092         long value;
1093         length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 10, 32, total_length, pc, & value);
1094         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
1095         fields->f_cdisp10 = value;
1096       }
1097       break;
1098     case MEP_OPERAND_CDISP10A4 :
1099       {
1100         long value;
1101         length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 10, 32, total_length, pc, & value);
1102         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
1103         fields->f_cdisp10 = value;
1104       }
1105       break;
1106     case MEP_OPERAND_CDISP10A8 :
1107       {
1108         long value;
1109         length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 10, 32, total_length, pc, & value);
1110         value = ((((((value) & (128))) ? (((value) ^ (768))) : (value)) & (512))) ? ((((((value) & (128))) ? (((value) ^ (768))) : (value)) - (1024))) : ((((value) & (128))) ? (((value) ^ (768))) : (value));
1111         fields->f_cdisp10 = value;
1112       }
1113       break;
1114     case MEP_OPERAND_CDISP12 :
1115       length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 12, 32, total_length, pc, & fields->f_12s20);
1116       break;
1117     case MEP_OPERAND_CIMM4 :
1118       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1119       break;
1120     case MEP_OPERAND_CIMM5 :
1121       length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 5, 32, total_length, pc, & fields->f_5u24);
1122       break;
1123     case MEP_OPERAND_CODE16 :
1124       length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1125       break;
1126     case MEP_OPERAND_CODE24 :
1127       {
1128         length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 32, total_length, pc, & fields->f_24u4n_hi);
1129         if (length <= 0) break;
1130         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u4n_lo);
1131         if (length <= 0) break;
1132   FLD (f_24u4n) = ((((FLD (f_24u4n_hi)) << (16))) | (FLD (f_24u4n_lo)));
1133       }
1134       break;
1135     case MEP_OPERAND_CP_FLAG :
1136       break;
1137     case MEP_OPERAND_CRN :
1138       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1139       break;
1140     case MEP_OPERAND_CRN64 :
1141       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crn);
1142       break;
1143     case MEP_OPERAND_CRNX :
1144       {
1145         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1146         if (length <= 0) break;
1147         length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1148         if (length <= 0) break;
1149   FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1150       }
1151       break;
1152     case MEP_OPERAND_CRNX64 :
1153       {
1154         length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 1, 32, total_length, pc, & fields->f_crnx_hi);
1155         if (length <= 0) break;
1156         length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_crnx_lo);
1157         if (length <= 0) break;
1158   FLD (f_crnx) = ((((FLD (f_crnx_hi)) << (4))) | (FLD (f_crnx_lo)));
1159       }
1160       break;
1161     case MEP_OPERAND_CSRN :
1162       {
1163         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1164         if (length <= 0) break;
1165         length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1166         if (length <= 0) break;
1167   FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1168       }
1169       break;
1170     case MEP_OPERAND_CSRN_IDX :
1171       {
1172         length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_csrn_hi);
1173         if (length <= 0) break;
1174         length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_csrn_lo);
1175         if (length <= 0) break;
1176   FLD (f_csrn) = ((((FLD (f_csrn_hi)) << (4))) | (FLD (f_csrn_lo)));
1177       }
1178       break;
1179     case MEP_OPERAND_DBG :
1180       break;
1181     case MEP_OPERAND_DEPC :
1182       break;
1183     case MEP_OPERAND_EPC :
1184       break;
1185     case MEP_OPERAND_EXC :
1186       break;
1187     case MEP_OPERAND_HI :
1188       break;
1189     case MEP_OPERAND_LO :
1190       break;
1191     case MEP_OPERAND_LP :
1192       break;
1193     case MEP_OPERAND_MB0 :
1194       break;
1195     case MEP_OPERAND_MB1 :
1196       break;
1197     case MEP_OPERAND_ME0 :
1198       break;
1199     case MEP_OPERAND_ME1 :
1200       break;
1201     case MEP_OPERAND_NPC :
1202       break;
1203     case MEP_OPERAND_OPT :
1204       break;
1205     case MEP_OPERAND_PCABS24A2 :
1206       {
1207         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u5a2n_hi);
1208         if (length <= 0) break;
1209         length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 7, 32, total_length, pc, & fields->f_24u5a2n_lo);
1210         if (length <= 0) break;
1211   FLD (f_24u5a2n) = ((((FLD (f_24u5a2n_hi)) << (8))) | (((FLD (f_24u5a2n_lo)) << (1))));
1212       }
1213       break;
1214     case MEP_OPERAND_PCREL12A2 :
1215       {
1216         long value;
1217         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);
1218         value = ((((value) << (1))) + (pc));
1219         fields->f_12s4a2 = value;
1220       }
1221       break;
1222     case MEP_OPERAND_PCREL17A2 :
1223       {
1224         long value;
1225         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);
1226         value = ((((value) << (1))) + (pc));
1227         fields->f_17s16a2 = value;
1228       }
1229       break;
1230     case MEP_OPERAND_PCREL24A2 :
1231       {
1232         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);
1233         if (length <= 0) break;
1234         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);
1235         if (length <= 0) break;
1236   FLD (f_24s5a2n) = ((((((FLD (f_24s5a2n_hi)) << (8))) | (((FLD (f_24s5a2n_lo)) << (1))))) + (pc));
1237       }
1238       break;
1239     case MEP_OPERAND_PCREL8A2 :
1240       {
1241         long value;
1242         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);
1243         value = ((((value) << (1))) + (pc));
1244         fields->f_8s8a2 = value;
1245       }
1246       break;
1247     case MEP_OPERAND_PSW :
1248       break;
1249     case MEP_OPERAND_R0 :
1250       break;
1251     case MEP_OPERAND_R1 :
1252       break;
1253     case MEP_OPERAND_RL :
1254       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_rl);
1255       break;
1256     case MEP_OPERAND_RL5 :
1257       length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 4, 32, total_length, pc, & fields->f_rl5);
1258       break;
1259     case MEP_OPERAND_RM :
1260       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1261       break;
1262     case MEP_OPERAND_RMA :
1263       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_rm);
1264       break;
1265     case MEP_OPERAND_RN :
1266       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1267       break;
1268     case MEP_OPERAND_RN3 :
1269       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1270       break;
1271     case MEP_OPERAND_RN3C :
1272       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1273       break;
1274     case MEP_OPERAND_RN3L :
1275       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1276       break;
1277     case MEP_OPERAND_RN3S :
1278       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1279       break;
1280     case MEP_OPERAND_RN3UC :
1281       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1282       break;
1283     case MEP_OPERAND_RN3UL :
1284       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1285       break;
1286     case MEP_OPERAND_RN3US :
1287       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_rn3);
1288       break;
1289     case MEP_OPERAND_RNC :
1290       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1291       break;
1292     case MEP_OPERAND_RNL :
1293       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1294       break;
1295     case MEP_OPERAND_RNS :
1296       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1297       break;
1298     case MEP_OPERAND_RNUC :
1299       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1300       break;
1301     case MEP_OPERAND_RNUL :
1302       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1303       break;
1304     case MEP_OPERAND_RNUS :
1305       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_rn);
1306       break;
1307     case MEP_OPERAND_SAR :
1308       break;
1309     case MEP_OPERAND_SDISP16 :
1310       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1311       break;
1312     case MEP_OPERAND_SIMM16 :
1313       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_16s16);
1314       break;
1315     case MEP_OPERAND_SIMM6 :
1316       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 6, 32, total_length, pc, & fields->f_6s8);
1317       break;
1318     case MEP_OPERAND_SIMM8 :
1319       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_8s8);
1320       break;
1321     case MEP_OPERAND_SP :
1322       break;
1323     case MEP_OPERAND_SPR :
1324       break;
1325     case MEP_OPERAND_TP :
1326       break;
1327     case MEP_OPERAND_TPR :
1328       break;
1329     case MEP_OPERAND_UDISP2 :
1330       length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 2, 32, total_length, pc, & fields->f_2u6);
1331       break;
1332     case MEP_OPERAND_UDISP7 :
1333       length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 7, 32, total_length, pc, & fields->f_7u9);
1334       break;
1335     case MEP_OPERAND_UDISP7A2 :
1336       {
1337         long value;
1338         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 6, 32, total_length, pc, & value);
1339         value = ((value) << (1));
1340         fields->f_7u9a2 = value;
1341       }
1342       break;
1343     case MEP_OPERAND_UDISP7A4 :
1344       {
1345         long value;
1346         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1347         value = ((value) << (2));
1348         fields->f_7u9a4 = value;
1349       }
1350       break;
1351     case MEP_OPERAND_UIMM16 :
1352       length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_16u16);
1353       break;
1354     case MEP_OPERAND_UIMM2 :
1355       length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 2, 32, total_length, pc, & fields->f_2u10);
1356       break;
1357     case MEP_OPERAND_UIMM24 :
1358       {
1359         length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_24u8n_hi);
1360         if (length <= 0) break;
1361         length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_24u8n_lo);
1362         if (length <= 0) break;
1363   FLD (f_24u8n) = ((((FLD (f_24u8n_hi)) << (8))) | (FLD (f_24u8n_lo)));
1364       }
1365       break;
1366     case MEP_OPERAND_UIMM3 :
1367       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_3u5);
1368       break;
1369     case MEP_OPERAND_UIMM4 :
1370       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 32, total_length, pc, & fields->f_4u8);
1371       break;
1372     case MEP_OPERAND_UIMM5 :
1373       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 5, 32, total_length, pc, & fields->f_5u8);
1374       break;
1375     case MEP_OPERAND_UIMM7A4 :
1376       {
1377         long value;
1378         length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & value);
1379         value = ((value) << (2));
1380         fields->f_7u9a4 = value;
1381       }
1382       break;
1383     case MEP_OPERAND_ZERO :
1384       break;
1385
1386     default :
1387       /* xgettext:c-format */
1388       fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
1389                opindex);
1390       abort ();
1391     }
1392
1393   return length;
1394 }
1395
1396 cgen_insert_fn * const mep_cgen_insert_handlers[] = 
1397 {
1398   insert_insn_normal,
1399 };
1400
1401 cgen_extract_fn * const mep_cgen_extract_handlers[] = 
1402 {
1403   extract_insn_normal,
1404 };
1405
1406 int mep_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1407 bfd_vma mep_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1408
1409 /* Getting values from cgen_fields is handled by a collection of functions.
1410    They are distinguished by the type of the VALUE argument they return.
1411    TODO: floating point, inlining support, remove cases where result type
1412    not appropriate.  */
1413
1414 int
1415 mep_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1416                              int opindex,
1417                              const CGEN_FIELDS * fields)
1418 {
1419   int value;
1420
1421   switch (opindex)
1422     {
1423     case MEP_OPERAND_ADDR24A4 :
1424       value = fields->f_24u8a4n;
1425       break;
1426     case MEP_OPERAND_C5RMUIMM20 :
1427       value = fields->f_c5_rmuimm20;
1428       break;
1429     case MEP_OPERAND_C5RNMUIMM24 :
1430       value = fields->f_c5_rnmuimm24;
1431       break;
1432     case MEP_OPERAND_CALLNUM :
1433       value = fields->f_callnum;
1434       break;
1435     case MEP_OPERAND_CCCC :
1436       value = fields->f_rm;
1437       break;
1438     case MEP_OPERAND_CCRN :
1439       value = fields->f_ccrn;
1440       break;
1441     case MEP_OPERAND_CDISP10 :
1442       value = fields->f_cdisp10;
1443       break;
1444     case MEP_OPERAND_CDISP10A2 :
1445       value = fields->f_cdisp10;
1446       break;
1447     case MEP_OPERAND_CDISP10A4 :
1448       value = fields->f_cdisp10;
1449       break;
1450     case MEP_OPERAND_CDISP10A8 :
1451       value = fields->f_cdisp10;
1452       break;
1453     case MEP_OPERAND_CDISP12 :
1454       value = fields->f_12s20;
1455       break;
1456     case MEP_OPERAND_CIMM4 :
1457       value = fields->f_rn;
1458       break;
1459     case MEP_OPERAND_CIMM5 :
1460       value = fields->f_5u24;
1461       break;
1462     case MEP_OPERAND_CODE16 :
1463       value = fields->f_16u16;
1464       break;
1465     case MEP_OPERAND_CODE24 :
1466       value = fields->f_24u4n;
1467       break;
1468     case MEP_OPERAND_CP_FLAG :
1469       value = 0;
1470       break;
1471     case MEP_OPERAND_CRN :
1472       value = fields->f_crn;
1473       break;
1474     case MEP_OPERAND_CRN64 :
1475       value = fields->f_crn;
1476       break;
1477     case MEP_OPERAND_CRNX :
1478       value = fields->f_crnx;
1479       break;
1480     case MEP_OPERAND_CRNX64 :
1481       value = fields->f_crnx;
1482       break;
1483     case MEP_OPERAND_CSRN :
1484       value = fields->f_csrn;
1485       break;
1486     case MEP_OPERAND_CSRN_IDX :
1487       value = fields->f_csrn;
1488       break;
1489     case MEP_OPERAND_DBG :
1490       value = 0;
1491       break;
1492     case MEP_OPERAND_DEPC :
1493       value = 0;
1494       break;
1495     case MEP_OPERAND_EPC :
1496       value = 0;
1497       break;
1498     case MEP_OPERAND_EXC :
1499       value = 0;
1500       break;
1501     case MEP_OPERAND_HI :
1502       value = 0;
1503       break;
1504     case MEP_OPERAND_LO :
1505       value = 0;
1506       break;
1507     case MEP_OPERAND_LP :
1508       value = 0;
1509       break;
1510     case MEP_OPERAND_MB0 :
1511       value = 0;
1512       break;
1513     case MEP_OPERAND_MB1 :
1514       value = 0;
1515       break;
1516     case MEP_OPERAND_ME0 :
1517       value = 0;
1518       break;
1519     case MEP_OPERAND_ME1 :
1520       value = 0;
1521       break;
1522     case MEP_OPERAND_NPC :
1523       value = 0;
1524       break;
1525     case MEP_OPERAND_OPT :
1526       value = 0;
1527       break;
1528     case MEP_OPERAND_PCABS24A2 :
1529       value = fields->f_24u5a2n;
1530       break;
1531     case MEP_OPERAND_PCREL12A2 :
1532       value = fields->f_12s4a2;
1533       break;
1534     case MEP_OPERAND_PCREL17A2 :
1535       value = fields->f_17s16a2;
1536       break;
1537     case MEP_OPERAND_PCREL24A2 :
1538       value = fields->f_24s5a2n;
1539       break;
1540     case MEP_OPERAND_PCREL8A2 :
1541       value = fields->f_8s8a2;
1542       break;
1543     case MEP_OPERAND_PSW :
1544       value = 0;
1545       break;
1546     case MEP_OPERAND_R0 :
1547       value = 0;
1548       break;
1549     case MEP_OPERAND_R1 :
1550       value = 0;
1551       break;
1552     case MEP_OPERAND_RL :
1553       value = fields->f_rl;
1554       break;
1555     case MEP_OPERAND_RL5 :
1556       value = fields->f_rl5;
1557       break;
1558     case MEP_OPERAND_RM :
1559       value = fields->f_rm;
1560       break;
1561     case MEP_OPERAND_RMA :
1562       value = fields->f_rm;
1563       break;
1564     case MEP_OPERAND_RN :
1565       value = fields->f_rn;
1566       break;
1567     case MEP_OPERAND_RN3 :
1568       value = fields->f_rn3;
1569       break;
1570     case MEP_OPERAND_RN3C :
1571       value = fields->f_rn3;
1572       break;
1573     case MEP_OPERAND_RN3L :
1574       value = fields->f_rn3;
1575       break;
1576     case MEP_OPERAND_RN3S :
1577       value = fields->f_rn3;
1578       break;
1579     case MEP_OPERAND_RN3UC :
1580       value = fields->f_rn3;
1581       break;
1582     case MEP_OPERAND_RN3UL :
1583       value = fields->f_rn3;
1584       break;
1585     case MEP_OPERAND_RN3US :
1586       value = fields->f_rn3;
1587       break;
1588     case MEP_OPERAND_RNC :
1589       value = fields->f_rn;
1590       break;
1591     case MEP_OPERAND_RNL :
1592       value = fields->f_rn;
1593       break;
1594     case MEP_OPERAND_RNS :
1595       value = fields->f_rn;
1596       break;
1597     case MEP_OPERAND_RNUC :
1598       value = fields->f_rn;
1599       break;
1600     case MEP_OPERAND_RNUL :
1601       value = fields->f_rn;
1602       break;
1603     case MEP_OPERAND_RNUS :
1604       value = fields->f_rn;
1605       break;
1606     case MEP_OPERAND_SAR :
1607       value = 0;
1608       break;
1609     case MEP_OPERAND_SDISP16 :
1610       value = fields->f_16s16;
1611       break;
1612     case MEP_OPERAND_SIMM16 :
1613       value = fields->f_16s16;
1614       break;
1615     case MEP_OPERAND_SIMM6 :
1616       value = fields->f_6s8;
1617       break;
1618     case MEP_OPERAND_SIMM8 :
1619       value = fields->f_8s8;
1620       break;
1621     case MEP_OPERAND_SP :
1622       value = 0;
1623       break;
1624     case MEP_OPERAND_SPR :
1625       value = 0;
1626       break;
1627     case MEP_OPERAND_TP :
1628       value = 0;
1629       break;
1630     case MEP_OPERAND_TPR :
1631       value = 0;
1632       break;
1633     case MEP_OPERAND_UDISP2 :
1634       value = fields->f_2u6;
1635       break;
1636     case MEP_OPERAND_UDISP7 :
1637       value = fields->f_7u9;
1638       break;
1639     case MEP_OPERAND_UDISP7A2 :
1640       value = fields->f_7u9a2;
1641       break;
1642     case MEP_OPERAND_UDISP7A4 :
1643       value = fields->f_7u9a4;
1644       break;
1645     case MEP_OPERAND_UIMM16 :
1646       value = fields->f_16u16;
1647       break;
1648     case MEP_OPERAND_UIMM2 :
1649       value = fields->f_2u10;
1650       break;
1651     case MEP_OPERAND_UIMM24 :
1652       value = fields->f_24u8n;
1653       break;
1654     case MEP_OPERAND_UIMM3 :
1655       value = fields->f_3u5;
1656       break;
1657     case MEP_OPERAND_UIMM4 :
1658       value = fields->f_4u8;
1659       break;
1660     case MEP_OPERAND_UIMM5 :
1661       value = fields->f_5u8;
1662       break;
1663     case MEP_OPERAND_UIMM7A4 :
1664       value = fields->f_7u9a4;
1665       break;
1666     case MEP_OPERAND_ZERO :
1667       value = 0;
1668       break;
1669
1670     default :
1671       /* xgettext:c-format */
1672       fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1673                        opindex);
1674       abort ();
1675   }
1676
1677   return value;
1678 }
1679
1680 bfd_vma
1681 mep_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1682                              int opindex,
1683                              const CGEN_FIELDS * fields)
1684 {
1685   bfd_vma value;
1686
1687   switch (opindex)
1688     {
1689     case MEP_OPERAND_ADDR24A4 :
1690       value = fields->f_24u8a4n;
1691       break;
1692     case MEP_OPERAND_C5RMUIMM20 :
1693       value = fields->f_c5_rmuimm20;
1694       break;
1695     case MEP_OPERAND_C5RNMUIMM24 :
1696       value = fields->f_c5_rnmuimm24;
1697       break;
1698     case MEP_OPERAND_CALLNUM :
1699       value = fields->f_callnum;
1700       break;
1701     case MEP_OPERAND_CCCC :
1702       value = fields->f_rm;
1703       break;
1704     case MEP_OPERAND_CCRN :
1705       value = fields->f_ccrn;
1706       break;
1707     case MEP_OPERAND_CDISP10 :
1708       value = fields->f_cdisp10;
1709       break;
1710     case MEP_OPERAND_CDISP10A2 :
1711       value = fields->f_cdisp10;
1712       break;
1713     case MEP_OPERAND_CDISP10A4 :
1714       value = fields->f_cdisp10;
1715       break;
1716     case MEP_OPERAND_CDISP10A8 :
1717       value = fields->f_cdisp10;
1718       break;
1719     case MEP_OPERAND_CDISP12 :
1720       value = fields->f_12s20;
1721       break;
1722     case MEP_OPERAND_CIMM4 :
1723       value = fields->f_rn;
1724       break;
1725     case MEP_OPERAND_CIMM5 :
1726       value = fields->f_5u24;
1727       break;
1728     case MEP_OPERAND_CODE16 :
1729       value = fields->f_16u16;
1730       break;
1731     case MEP_OPERAND_CODE24 :
1732       value = fields->f_24u4n;
1733       break;
1734     case MEP_OPERAND_CP_FLAG :
1735       value = 0;
1736       break;
1737     case MEP_OPERAND_CRN :
1738       value = fields->f_crn;
1739       break;
1740     case MEP_OPERAND_CRN64 :
1741       value = fields->f_crn;
1742       break;
1743     case MEP_OPERAND_CRNX :
1744       value = fields->f_crnx;
1745       break;
1746     case MEP_OPERAND_CRNX64 :
1747       value = fields->f_crnx;
1748       break;
1749     case MEP_OPERAND_CSRN :
1750       value = fields->f_csrn;
1751       break;
1752     case MEP_OPERAND_CSRN_IDX :
1753       value = fields->f_csrn;
1754       break;
1755     case MEP_OPERAND_DBG :
1756       value = 0;
1757       break;
1758     case MEP_OPERAND_DEPC :
1759       value = 0;
1760       break;
1761     case MEP_OPERAND_EPC :
1762       value = 0;
1763       break;
1764     case MEP_OPERAND_EXC :
1765       value = 0;
1766       break;
1767     case MEP_OPERAND_HI :
1768       value = 0;
1769       break;
1770     case MEP_OPERAND_LO :
1771       value = 0;
1772       break;
1773     case MEP_OPERAND_LP :
1774       value = 0;
1775       break;
1776     case MEP_OPERAND_MB0 :
1777       value = 0;
1778       break;
1779     case MEP_OPERAND_MB1 :
1780       value = 0;
1781       break;
1782     case MEP_OPERAND_ME0 :
1783       value = 0;
1784       break;
1785     case MEP_OPERAND_ME1 :
1786       value = 0;
1787       break;
1788     case MEP_OPERAND_NPC :
1789       value = 0;
1790       break;
1791     case MEP_OPERAND_OPT :
1792       value = 0;
1793       break;
1794     case MEP_OPERAND_PCABS24A2 :
1795       value = fields->f_24u5a2n;
1796       break;
1797     case MEP_OPERAND_PCREL12A2 :
1798       value = fields->f_12s4a2;
1799       break;
1800     case MEP_OPERAND_PCREL17A2 :
1801       value = fields->f_17s16a2;
1802       break;
1803     case MEP_OPERAND_PCREL24A2 :
1804       value = fields->f_24s5a2n;
1805       break;
1806     case MEP_OPERAND_PCREL8A2 :
1807       value = fields->f_8s8a2;
1808       break;
1809     case MEP_OPERAND_PSW :
1810       value = 0;
1811       break;
1812     case MEP_OPERAND_R0 :
1813       value = 0;
1814       break;
1815     case MEP_OPERAND_R1 :
1816       value = 0;
1817       break;
1818     case MEP_OPERAND_RL :
1819       value = fields->f_rl;
1820       break;
1821     case MEP_OPERAND_RL5 :
1822       value = fields->f_rl5;
1823       break;
1824     case MEP_OPERAND_RM :
1825       value = fields->f_rm;
1826       break;
1827     case MEP_OPERAND_RMA :
1828       value = fields->f_rm;
1829       break;
1830     case MEP_OPERAND_RN :
1831       value = fields->f_rn;
1832       break;
1833     case MEP_OPERAND_RN3 :
1834       value = fields->f_rn3;
1835       break;
1836     case MEP_OPERAND_RN3C :
1837       value = fields->f_rn3;
1838       break;
1839     case MEP_OPERAND_RN3L :
1840       value = fields->f_rn3;
1841       break;
1842     case MEP_OPERAND_RN3S :
1843       value = fields->f_rn3;
1844       break;
1845     case MEP_OPERAND_RN3UC :
1846       value = fields->f_rn3;
1847       break;
1848     case MEP_OPERAND_RN3UL :
1849       value = fields->f_rn3;
1850       break;
1851     case MEP_OPERAND_RN3US :
1852       value = fields->f_rn3;
1853       break;
1854     case MEP_OPERAND_RNC :
1855       value = fields->f_rn;
1856       break;
1857     case MEP_OPERAND_RNL :
1858       value = fields->f_rn;
1859       break;
1860     case MEP_OPERAND_RNS :
1861       value = fields->f_rn;
1862       break;
1863     case MEP_OPERAND_RNUC :
1864       value = fields->f_rn;
1865       break;
1866     case MEP_OPERAND_RNUL :
1867       value = fields->f_rn;
1868       break;
1869     case MEP_OPERAND_RNUS :
1870       value = fields->f_rn;
1871       break;
1872     case MEP_OPERAND_SAR :
1873       value = 0;
1874       break;
1875     case MEP_OPERAND_SDISP16 :
1876       value = fields->f_16s16;
1877       break;
1878     case MEP_OPERAND_SIMM16 :
1879       value = fields->f_16s16;
1880       break;
1881     case MEP_OPERAND_SIMM6 :
1882       value = fields->f_6s8;
1883       break;
1884     case MEP_OPERAND_SIMM8 :
1885       value = fields->f_8s8;
1886       break;
1887     case MEP_OPERAND_SP :
1888       value = 0;
1889       break;
1890     case MEP_OPERAND_SPR :
1891       value = 0;
1892       break;
1893     case MEP_OPERAND_TP :
1894       value = 0;
1895       break;
1896     case MEP_OPERAND_TPR :
1897       value = 0;
1898       break;
1899     case MEP_OPERAND_UDISP2 :
1900       value = fields->f_2u6;
1901       break;
1902     case MEP_OPERAND_UDISP7 :
1903       value = fields->f_7u9;
1904       break;
1905     case MEP_OPERAND_UDISP7A2 :
1906       value = fields->f_7u9a2;
1907       break;
1908     case MEP_OPERAND_UDISP7A4 :
1909       value = fields->f_7u9a4;
1910       break;
1911     case MEP_OPERAND_UIMM16 :
1912       value = fields->f_16u16;
1913       break;
1914     case MEP_OPERAND_UIMM2 :
1915       value = fields->f_2u10;
1916       break;
1917     case MEP_OPERAND_UIMM24 :
1918       value = fields->f_24u8n;
1919       break;
1920     case MEP_OPERAND_UIMM3 :
1921       value = fields->f_3u5;
1922       break;
1923     case MEP_OPERAND_UIMM4 :
1924       value = fields->f_4u8;
1925       break;
1926     case MEP_OPERAND_UIMM5 :
1927       value = fields->f_5u8;
1928       break;
1929     case MEP_OPERAND_UIMM7A4 :
1930       value = fields->f_7u9a4;
1931       break;
1932     case MEP_OPERAND_ZERO :
1933       value = 0;
1934       break;
1935
1936     default :
1937       /* xgettext:c-format */
1938       fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
1939                        opindex);
1940       abort ();
1941   }
1942
1943   return value;
1944 }
1945
1946 void mep_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1947 void mep_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
1948
1949 /* Stuffing values in cgen_fields is handled by a collection of functions.
1950    They are distinguished by the type of the VALUE argument they accept.
1951    TODO: floating point, inlining support, remove cases where argument type
1952    not appropriate.  */
1953
1954 void
1955 mep_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1956                              int opindex,
1957                              CGEN_FIELDS * fields,
1958                              int value)
1959 {
1960   switch (opindex)
1961     {
1962     case MEP_OPERAND_ADDR24A4 :
1963       fields->f_24u8a4n = value;
1964       break;
1965     case MEP_OPERAND_C5RMUIMM20 :
1966       fields->f_c5_rmuimm20 = value;
1967       break;
1968     case MEP_OPERAND_C5RNMUIMM24 :
1969       fields->f_c5_rnmuimm24 = value;
1970       break;
1971     case MEP_OPERAND_CALLNUM :
1972       fields->f_callnum = value;
1973       break;
1974     case MEP_OPERAND_CCCC :
1975       fields->f_rm = value;
1976       break;
1977     case MEP_OPERAND_CCRN :
1978       fields->f_ccrn = value;
1979       break;
1980     case MEP_OPERAND_CDISP10 :
1981       fields->f_cdisp10 = value;
1982       break;
1983     case MEP_OPERAND_CDISP10A2 :
1984       fields->f_cdisp10 = value;
1985       break;
1986     case MEP_OPERAND_CDISP10A4 :
1987       fields->f_cdisp10 = value;
1988       break;
1989     case MEP_OPERAND_CDISP10A8 :
1990       fields->f_cdisp10 = value;
1991       break;
1992     case MEP_OPERAND_CDISP12 :
1993       fields->f_12s20 = value;
1994       break;
1995     case MEP_OPERAND_CIMM4 :
1996       fields->f_rn = value;
1997       break;
1998     case MEP_OPERAND_CIMM5 :
1999       fields->f_5u24 = value;
2000       break;
2001     case MEP_OPERAND_CODE16 :
2002       fields->f_16u16 = value;
2003       break;
2004     case MEP_OPERAND_CODE24 :
2005       fields->f_24u4n = value;
2006       break;
2007     case MEP_OPERAND_CP_FLAG :
2008       break;
2009     case MEP_OPERAND_CRN :
2010       fields->f_crn = value;
2011       break;
2012     case MEP_OPERAND_CRN64 :
2013       fields->f_crn = value;
2014       break;
2015     case MEP_OPERAND_CRNX :
2016       fields->f_crnx = value;
2017       break;
2018     case MEP_OPERAND_CRNX64 :
2019       fields->f_crnx = value;
2020       break;
2021     case MEP_OPERAND_CSRN :
2022       fields->f_csrn = value;
2023       break;
2024     case MEP_OPERAND_CSRN_IDX :
2025       fields->f_csrn = value;
2026       break;
2027     case MEP_OPERAND_DBG :
2028       break;
2029     case MEP_OPERAND_DEPC :
2030       break;
2031     case MEP_OPERAND_EPC :
2032       break;
2033     case MEP_OPERAND_EXC :
2034       break;
2035     case MEP_OPERAND_HI :
2036       break;
2037     case MEP_OPERAND_LO :
2038       break;
2039     case MEP_OPERAND_LP :
2040       break;
2041     case MEP_OPERAND_MB0 :
2042       break;
2043     case MEP_OPERAND_MB1 :
2044       break;
2045     case MEP_OPERAND_ME0 :
2046       break;
2047     case MEP_OPERAND_ME1 :
2048       break;
2049     case MEP_OPERAND_NPC :
2050       break;
2051     case MEP_OPERAND_OPT :
2052       break;
2053     case MEP_OPERAND_PCABS24A2 :
2054       fields->f_24u5a2n = value;
2055       break;
2056     case MEP_OPERAND_PCREL12A2 :
2057       fields->f_12s4a2 = value;
2058       break;
2059     case MEP_OPERAND_PCREL17A2 :
2060       fields->f_17s16a2 = value;
2061       break;
2062     case MEP_OPERAND_PCREL24A2 :
2063       fields->f_24s5a2n = value;
2064       break;
2065     case MEP_OPERAND_PCREL8A2 :
2066       fields->f_8s8a2 = value;
2067       break;
2068     case MEP_OPERAND_PSW :
2069       break;
2070     case MEP_OPERAND_R0 :
2071       break;
2072     case MEP_OPERAND_R1 :
2073       break;
2074     case MEP_OPERAND_RL :
2075       fields->f_rl = value;
2076       break;
2077     case MEP_OPERAND_RL5 :
2078       fields->f_rl5 = value;
2079       break;
2080     case MEP_OPERAND_RM :
2081       fields->f_rm = value;
2082       break;
2083     case MEP_OPERAND_RMA :
2084       fields->f_rm = value;
2085       break;
2086     case MEP_OPERAND_RN :
2087       fields->f_rn = value;
2088       break;
2089     case MEP_OPERAND_RN3 :
2090       fields->f_rn3 = value;
2091       break;
2092     case MEP_OPERAND_RN3C :
2093       fields->f_rn3 = value;
2094       break;
2095     case MEP_OPERAND_RN3L :
2096       fields->f_rn3 = value;
2097       break;
2098     case MEP_OPERAND_RN3S :
2099       fields->f_rn3 = value;
2100       break;
2101     case MEP_OPERAND_RN3UC :
2102       fields->f_rn3 = value;
2103       break;
2104     case MEP_OPERAND_RN3UL :
2105       fields->f_rn3 = value;
2106       break;
2107     case MEP_OPERAND_RN3US :
2108       fields->f_rn3 = value;
2109       break;
2110     case MEP_OPERAND_RNC :
2111       fields->f_rn = value;
2112       break;
2113     case MEP_OPERAND_RNL :
2114       fields->f_rn = value;
2115       break;
2116     case MEP_OPERAND_RNS :
2117       fields->f_rn = value;
2118       break;
2119     case MEP_OPERAND_RNUC :
2120       fields->f_rn = value;
2121       break;
2122     case MEP_OPERAND_RNUL :
2123       fields->f_rn = value;
2124       break;
2125     case MEP_OPERAND_RNUS :
2126       fields->f_rn = value;
2127       break;
2128     case MEP_OPERAND_SAR :
2129       break;
2130     case MEP_OPERAND_SDISP16 :
2131       fields->f_16s16 = value;
2132       break;
2133     case MEP_OPERAND_SIMM16 :
2134       fields->f_16s16 = value;
2135       break;
2136     case MEP_OPERAND_SIMM6 :
2137       fields->f_6s8 = value;
2138       break;
2139     case MEP_OPERAND_SIMM8 :
2140       fields->f_8s8 = value;
2141       break;
2142     case MEP_OPERAND_SP :
2143       break;
2144     case MEP_OPERAND_SPR :
2145       break;
2146     case MEP_OPERAND_TP :
2147       break;
2148     case MEP_OPERAND_TPR :
2149       break;
2150     case MEP_OPERAND_UDISP2 :
2151       fields->f_2u6 = value;
2152       break;
2153     case MEP_OPERAND_UDISP7 :
2154       fields->f_7u9 = value;
2155       break;
2156     case MEP_OPERAND_UDISP7A2 :
2157       fields->f_7u9a2 = value;
2158       break;
2159     case MEP_OPERAND_UDISP7A4 :
2160       fields->f_7u9a4 = value;
2161       break;
2162     case MEP_OPERAND_UIMM16 :
2163       fields->f_16u16 = value;
2164       break;
2165     case MEP_OPERAND_UIMM2 :
2166       fields->f_2u10 = value;
2167       break;
2168     case MEP_OPERAND_UIMM24 :
2169       fields->f_24u8n = value;
2170       break;
2171     case MEP_OPERAND_UIMM3 :
2172       fields->f_3u5 = value;
2173       break;
2174     case MEP_OPERAND_UIMM4 :
2175       fields->f_4u8 = value;
2176       break;
2177     case MEP_OPERAND_UIMM5 :
2178       fields->f_5u8 = value;
2179       break;
2180     case MEP_OPERAND_UIMM7A4 :
2181       fields->f_7u9a4 = value;
2182       break;
2183     case MEP_OPERAND_ZERO :
2184       break;
2185
2186     default :
2187       /* xgettext:c-format */
2188       fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
2189                        opindex);
2190       abort ();
2191   }
2192 }
2193
2194 void
2195 mep_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
2196                              int opindex,
2197                              CGEN_FIELDS * fields,
2198                              bfd_vma value)
2199 {
2200   switch (opindex)
2201     {
2202     case MEP_OPERAND_ADDR24A4 :
2203       fields->f_24u8a4n = value;
2204       break;
2205     case MEP_OPERAND_C5RMUIMM20 :
2206       fields->f_c5_rmuimm20 = value;
2207       break;
2208     case MEP_OPERAND_C5RNMUIMM24 :
2209       fields->f_c5_rnmuimm24 = value;
2210       break;
2211     case MEP_OPERAND_CALLNUM :
2212       fields->f_callnum = value;
2213       break;
2214     case MEP_OPERAND_CCCC :
2215       fields->f_rm = value;
2216       break;
2217     case MEP_OPERAND_CCRN :
2218       fields->f_ccrn = value;
2219       break;
2220     case MEP_OPERAND_CDISP10 :
2221       fields->f_cdisp10 = value;
2222       break;
2223     case MEP_OPERAND_CDISP10A2 :
2224       fields->f_cdisp10 = value;
2225       break;
2226     case MEP_OPERAND_CDISP10A4 :
2227       fields->f_cdisp10 = value;
2228       break;
2229     case MEP_OPERAND_CDISP10A8 :
2230       fields->f_cdisp10 = value;
2231       break;
2232     case MEP_OPERAND_CDISP12 :
2233       fields->f_12s20 = value;
2234       break;
2235     case MEP_OPERAND_CIMM4 :
2236       fields->f_rn = value;
2237       break;
2238     case MEP_OPERAND_CIMM5 :
2239       fields->f_5u24 = value;
2240       break;
2241     case MEP_OPERAND_CODE16 :
2242       fields->f_16u16 = value;
2243       break;
2244     case MEP_OPERAND_CODE24 :
2245       fields->f_24u4n = value;
2246       break;
2247     case MEP_OPERAND_CP_FLAG :
2248       break;
2249     case MEP_OPERAND_CRN :
2250       fields->f_crn = value;
2251       break;
2252     case MEP_OPERAND_CRN64 :
2253       fields->f_crn = value;
2254       break;
2255     case MEP_OPERAND_CRNX :
2256       fields->f_crnx = value;
2257       break;
2258     case MEP_OPERAND_CRNX64 :
2259       fields->f_crnx = value;
2260       break;
2261     case MEP_OPERAND_CSRN :
2262       fields->f_csrn = value;
2263       break;
2264     case MEP_OPERAND_CSRN_IDX :
2265       fields->f_csrn = value;
2266       break;
2267     case MEP_OPERAND_DBG :
2268       break;
2269     case MEP_OPERAND_DEPC :
2270       break;
2271     case MEP_OPERAND_EPC :
2272       break;
2273     case MEP_OPERAND_EXC :
2274       break;
2275     case MEP_OPERAND_HI :
2276       break;
2277     case MEP_OPERAND_LO :
2278       break;
2279     case MEP_OPERAND_LP :
2280       break;
2281     case MEP_OPERAND_MB0 :
2282       break;
2283     case MEP_OPERAND_MB1 :
2284       break;
2285     case MEP_OPERAND_ME0 :
2286       break;
2287     case MEP_OPERAND_ME1 :
2288       break;
2289     case MEP_OPERAND_NPC :
2290       break;
2291     case MEP_OPERAND_OPT :
2292       break;
2293     case MEP_OPERAND_PCABS24A2 :
2294       fields->f_24u5a2n = value;
2295       break;
2296     case MEP_OPERAND_PCREL12A2 :
2297       fields->f_12s4a2 = value;
2298       break;
2299     case MEP_OPERAND_PCREL17A2 :
2300       fields->f_17s16a2 = value;
2301       break;
2302     case MEP_OPERAND_PCREL24A2 :
2303       fields->f_24s5a2n = value;
2304       break;
2305     case MEP_OPERAND_PCREL8A2 :
2306       fields->f_8s8a2 = value;
2307       break;
2308     case MEP_OPERAND_PSW :
2309       break;
2310     case MEP_OPERAND_R0 :
2311       break;
2312     case MEP_OPERAND_R1 :
2313       break;
2314     case MEP_OPERAND_RL :
2315       fields->f_rl = value;
2316       break;
2317     case MEP_OPERAND_RL5 :
2318       fields->f_rl5 = value;
2319       break;
2320     case MEP_OPERAND_RM :
2321       fields->f_rm = value;
2322       break;
2323     case MEP_OPERAND_RMA :
2324       fields->f_rm = value;
2325       break;
2326     case MEP_OPERAND_RN :
2327       fields->f_rn = value;
2328       break;
2329     case MEP_OPERAND_RN3 :
2330       fields->f_rn3 = value;
2331       break;
2332     case MEP_OPERAND_RN3C :
2333       fields->f_rn3 = value;
2334       break;
2335     case MEP_OPERAND_RN3L :
2336       fields->f_rn3 = value;
2337       break;
2338     case MEP_OPERAND_RN3S :
2339       fields->f_rn3 = value;
2340       break;
2341     case MEP_OPERAND_RN3UC :
2342       fields->f_rn3 = value;
2343       break;
2344     case MEP_OPERAND_RN3UL :
2345       fields->f_rn3 = value;
2346       break;
2347     case MEP_OPERAND_RN3US :
2348       fields->f_rn3 = value;
2349       break;
2350     case MEP_OPERAND_RNC :
2351       fields->f_rn = value;
2352       break;
2353     case MEP_OPERAND_RNL :
2354       fields->f_rn = value;
2355       break;
2356     case MEP_OPERAND_RNS :
2357       fields->f_rn = value;
2358       break;
2359     case MEP_OPERAND_RNUC :
2360       fields->f_rn = value;
2361       break;
2362     case MEP_OPERAND_RNUL :
2363       fields->f_rn = value;
2364       break;
2365     case MEP_OPERAND_RNUS :
2366       fields->f_rn = value;
2367       break;
2368     case MEP_OPERAND_SAR :
2369       break;
2370     case MEP_OPERAND_SDISP16 :
2371       fields->f_16s16 = value;
2372       break;
2373     case MEP_OPERAND_SIMM16 :
2374       fields->f_16s16 = value;
2375       break;
2376     case MEP_OPERAND_SIMM6 :
2377       fields->f_6s8 = value;
2378       break;
2379     case MEP_OPERAND_SIMM8 :
2380       fields->f_8s8 = value;
2381       break;
2382     case MEP_OPERAND_SP :
2383       break;
2384     case MEP_OPERAND_SPR :
2385       break;
2386     case MEP_OPERAND_TP :
2387       break;
2388     case MEP_OPERAND_TPR :
2389       break;
2390     case MEP_OPERAND_UDISP2 :
2391       fields->f_2u6 = value;
2392       break;
2393     case MEP_OPERAND_UDISP7 :
2394       fields->f_7u9 = value;
2395       break;
2396     case MEP_OPERAND_UDISP7A2 :
2397       fields->f_7u9a2 = value;
2398       break;
2399     case MEP_OPERAND_UDISP7A4 :
2400       fields->f_7u9a4 = value;
2401       break;
2402     case MEP_OPERAND_UIMM16 :
2403       fields->f_16u16 = value;
2404       break;
2405     case MEP_OPERAND_UIMM2 :
2406       fields->f_2u10 = value;
2407       break;
2408     case MEP_OPERAND_UIMM24 :
2409       fields->f_24u8n = value;
2410       break;
2411     case MEP_OPERAND_UIMM3 :
2412       fields->f_3u5 = value;
2413       break;
2414     case MEP_OPERAND_UIMM4 :
2415       fields->f_4u8 = value;
2416       break;
2417     case MEP_OPERAND_UIMM5 :
2418       fields->f_5u8 = value;
2419       break;
2420     case MEP_OPERAND_UIMM7A4 :
2421       fields->f_7u9a4 = value;
2422       break;
2423     case MEP_OPERAND_ZERO :
2424       break;
2425
2426     default :
2427       /* xgettext:c-format */
2428       fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
2429                        opindex);
2430       abort ();
2431   }
2432 }
2433
2434 /* Function to call before using the instruction builder tables.  */
2435
2436 void
2437 mep_cgen_init_ibld_table (CGEN_CPU_DESC cd)
2438 {
2439   cd->insert_handlers = & mep_cgen_insert_handlers[0];
2440   cd->extract_handlers = & mep_cgen_extract_handlers[0];
2441
2442   cd->insert_operand = mep_cgen_insert_operand;
2443   cd->extract_operand = mep_cgen_extract_operand;
2444
2445   cd->get_int_operand = mep_cgen_get_int_operand;
2446   cd->set_int_operand = mep_cgen_set_int_operand;
2447   cd->get_vma_operand = mep_cgen_get_vma_operand;
2448   cd->set_vma_operand = mep_cgen_set_vma_operand;
2449 }