2251ee01bded6de7cb395ce1a3dbd90f1a662d64
[external/binutils.git] / opcodes / frv-ibld.c
1 /* DO NOT EDIT!  -*- buffer-read-only: t -*- vi:set ro:  */
2 /* Instruction building/extraction support for frv. -*- C -*-
3
4    THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
5    - the resultant file is machine generated, cgen-ibld.in isn't
6
7    Copyright (C) 1996-2018 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 "frv-desc.h"
35 #include "frv-opc.h"
36 #include "cgen/basic-modes.h"
37 #include "opintl.h"
38 #include "safe-ctype.h"
39
40 #undef  min
41 #define min(a,b) ((a) < (b) ? (a) : (b))
42 #undef  max
43 #define max(a,b) ((a) > (b) ? (a) : (b))
44
45 /* Used by the ifield rtx function.  */
46 #define FLD(f) (fields->f)
47
48 static const char * insert_normal
49   (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
50    unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
51 static const char * insert_insn_normal
52   (CGEN_CPU_DESC, const CGEN_INSN *,
53    CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
54 static int extract_normal
55   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
56    unsigned int, unsigned int, unsigned int, unsigned int,
57    unsigned int, unsigned int, bfd_vma, long *);
58 static int extract_insn_normal
59   (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
60    CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
61 #if CGEN_INT_INSN_P
62 static void put_insn_int_value
63   (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
64 #endif
65 #if ! CGEN_INT_INSN_P
66 static CGEN_INLINE void insert_1
67   (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
68 static CGEN_INLINE int fill_cache
69   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *,  int, int, bfd_vma);
70 static CGEN_INLINE long extract_1
71   (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
72 #endif
73 \f
74 /* Operand insertion.  */
75
76 #if ! CGEN_INT_INSN_P
77
78 /* Subroutine of insert_normal.  */
79
80 static CGEN_INLINE void
81 insert_1 (CGEN_CPU_DESC cd,
82           unsigned long value,
83           int start,
84           int length,
85           int word_length,
86           unsigned char *bufp)
87 {
88   unsigned long x,mask;
89   int shift;
90
91   x = cgen_get_insn_value (cd, bufp, word_length);
92
93   /* Written this way to avoid undefined behaviour.  */
94   mask = (((1L << (length - 1)) - 1) << 1) | 1;
95   if (CGEN_INSN_LSB0_P)
96     shift = (start + 1) - length;
97   else
98     shift = (word_length - (start + length));
99   x = (x & ~(mask << shift)) | ((value & mask) << shift);
100
101   cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
102 }
103
104 #endif /* ! CGEN_INT_INSN_P */
105
106 /* Default insertion routine.
107
108    ATTRS is a mask of the boolean attributes.
109    WORD_OFFSET is the offset in bits from the start of the insn of the value.
110    WORD_LENGTH is the length of the word in bits in which the value resides.
111    START is the starting bit number in the word, architecture origin.
112    LENGTH is the length of VALUE in bits.
113    TOTAL_LENGTH is the total length of the insn in bits.
114
115    The result is an error message or NULL if success.  */
116
117 /* ??? This duplicates functionality with bfd's howto table and
118    bfd_install_relocation.  */
119 /* ??? This doesn't handle bfd_vma's.  Create another function when
120    necessary.  */
121
122 static const char *
123 insert_normal (CGEN_CPU_DESC cd,
124                long value,
125                unsigned int attrs,
126                unsigned int word_offset,
127                unsigned int start,
128                unsigned int length,
129                unsigned int word_length,
130                unsigned int total_length,
131                CGEN_INSN_BYTES_PTR buffer)
132 {
133   static char errbuf[100];
134   /* Written this way to avoid undefined behaviour.  */
135   unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
136
137   /* If LENGTH is zero, this operand doesn't contribute to the value.  */
138   if (length == 0)
139     return NULL;
140
141   if (word_length > 8 * sizeof (CGEN_INSN_INT))
142     abort ();
143
144   /* For architectures with insns smaller than the base-insn-bitsize,
145      word_length may be too big.  */
146   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
147     {
148       if (word_offset == 0
149           && word_length > total_length)
150         word_length = total_length;
151     }
152
153   /* Ensure VALUE will fit.  */
154   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
155     {
156       long minval = - (1L << (length - 1));
157       unsigned long maxval = mask;
158
159       if ((value > 0 && (unsigned long) value > maxval)
160           || value < minval)
161         {
162           /* xgettext:c-format */
163           sprintf (errbuf,
164                    _("operand out of range (%ld not between %ld and %lu)"),
165                    value, minval, maxval);
166           return errbuf;
167         }
168     }
169   else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
170     {
171       unsigned long maxval = mask;
172       unsigned long val = (unsigned long) value;
173
174       /* For hosts with a word size > 32 check to see if value has been sign
175          extended beyond 32 bits.  If so then ignore these higher sign bits
176          as the user is attempting to store a 32-bit signed value into an
177          unsigned 32-bit field which is allowed.  */
178       if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
179         val &= 0xFFFFFFFF;
180
181       if (val > maxval)
182         {
183           /* xgettext:c-format */
184           sprintf (errbuf,
185                    _("operand out of range (0x%lx not between 0 and 0x%lx)"),
186                    val, maxval);
187           return errbuf;
188         }
189     }
190   else
191     {
192       if (! cgen_signed_overflow_ok_p (cd))
193         {
194           long minval = - (1L << (length - 1));
195           long maxval =   (1L << (length - 1)) - 1;
196
197           if (value < minval || value > maxval)
198             {
199               sprintf
200                 /* xgettext:c-format */
201                 (errbuf, _("operand out of range (%ld not between %ld and %ld)"),
202                  value, minval, maxval);
203               return errbuf;
204             }
205         }
206     }
207
208 #if CGEN_INT_INSN_P
209
210   {
211     int shift_within_word, shift_to_word, shift;
212
213     /* How to shift the value to BIT0 of the word.  */
214     shift_to_word = total_length - (word_offset + word_length);
215
216     /* How to shift the value to the field within the word.  */
217     if (CGEN_INSN_LSB0_P)
218       shift_within_word = start + 1 - length;
219     else
220       shift_within_word = word_length - start - length;
221
222     /* The total SHIFT, then mask in the value.  */
223     shift = shift_to_word + shift_within_word;
224     *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
225   }
226
227 #else /* ! CGEN_INT_INSN_P */
228
229   {
230     unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
231
232     insert_1 (cd, value, start, length, word_length, bufp);
233   }
234
235 #endif /* ! CGEN_INT_INSN_P */
236
237   return NULL;
238 }
239
240 /* Default insn builder (insert handler).
241    The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
242    that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
243    recorded in host byte order, otherwise BUFFER is an array of bytes
244    and the value is recorded in target byte order).
245    The result is an error message or NULL if success.  */
246
247 static const char *
248 insert_insn_normal (CGEN_CPU_DESC cd,
249                     const CGEN_INSN * insn,
250                     CGEN_FIELDS * fields,
251                     CGEN_INSN_BYTES_PTR buffer,
252                     bfd_vma pc)
253 {
254   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
255   unsigned long value;
256   const CGEN_SYNTAX_CHAR_TYPE * syn;
257
258   CGEN_INIT_INSERT (cd);
259   value = CGEN_INSN_BASE_VALUE (insn);
260
261   /* If we're recording insns as numbers (rather than a string of bytes),
262      target byte order handling is deferred until later.  */
263
264 #if CGEN_INT_INSN_P
265
266   put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
267                       CGEN_FIELDS_BITSIZE (fields), value);
268
269 #else
270
271   cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
272                                         (unsigned) CGEN_FIELDS_BITSIZE (fields)),
273                        value);
274
275 #endif /* ! CGEN_INT_INSN_P */
276
277   /* ??? It would be better to scan the format's fields.
278      Still need to be able to insert a value based on the operand though;
279      e.g. storing a branch displacement that got resolved later.
280      Needs more thought first.  */
281
282   for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
283     {
284       const char *errmsg;
285
286       if (CGEN_SYNTAX_CHAR_P (* syn))
287         continue;
288
289       errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
290                                        fields, buffer, pc);
291       if (errmsg)
292         return errmsg;
293     }
294
295   return NULL;
296 }
297
298 #if CGEN_INT_INSN_P
299 /* Cover function to store an insn value into an integral insn.  Must go here
300    because it needs <prefix>-desc.h for CGEN_INT_INSN_P.  */
301
302 static void
303 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
304                     CGEN_INSN_BYTES_PTR buf,
305                     int length,
306                     int insn_length,
307                     CGEN_INSN_INT value)
308 {
309   /* For architectures with insns smaller than the base-insn-bitsize,
310      length may be too big.  */
311   if (length > insn_length)
312     *buf = value;
313   else
314     {
315       int shift = insn_length - length;
316       /* Written this way to avoid undefined behaviour.  */
317       CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
318
319       *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
320     }
321 }
322 #endif
323 \f
324 /* Operand extraction.  */
325
326 #if ! CGEN_INT_INSN_P
327
328 /* Subroutine of extract_normal.
329    Ensure sufficient bytes are cached in EX_INFO.
330    OFFSET is the offset in bytes from the start of the insn of the value.
331    BYTES is the length of the needed value.
332    Returns 1 for success, 0 for failure.  */
333
334 static CGEN_INLINE int
335 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
336             CGEN_EXTRACT_INFO *ex_info,
337             int offset,
338             int bytes,
339             bfd_vma pc)
340 {
341   /* It's doubtful that the middle part has already been fetched so
342      we don't optimize that case.  kiss.  */
343   unsigned int mask;
344   disassemble_info *info = (disassemble_info *) ex_info->dis_info;
345
346   /* First do a quick check.  */
347   mask = (1 << bytes) - 1;
348   if (((ex_info->valid >> offset) & mask) == mask)
349     return 1;
350
351   /* Search for the first byte we need to read.  */
352   for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
353     if (! (mask & ex_info->valid))
354       break;
355
356   if (bytes)
357     {
358       int status;
359
360       pc += offset;
361       status = (*info->read_memory_func)
362         (pc, ex_info->insn_bytes + offset, bytes, info);
363
364       if (status != 0)
365         {
366           (*info->memory_error_func) (status, pc, info);
367           return 0;
368         }
369
370       ex_info->valid |= ((1 << bytes) - 1) << offset;
371     }
372
373   return 1;
374 }
375
376 /* Subroutine of extract_normal.  */
377
378 static CGEN_INLINE long
379 extract_1 (CGEN_CPU_DESC cd,
380            CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
381            int start,
382            int length,
383            int word_length,
384            unsigned char *bufp,
385            bfd_vma pc ATTRIBUTE_UNUSED)
386 {
387   unsigned long x;
388   int shift;
389
390   x = cgen_get_insn_value (cd, bufp, word_length);
391
392   if (CGEN_INSN_LSB0_P)
393     shift = (start + 1) - length;
394   else
395     shift = (word_length - (start + length));
396   return x >> shift;
397 }
398
399 #endif /* ! CGEN_INT_INSN_P */
400
401 /* Default extraction routine.
402
403    INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
404    or sometimes less for cases like the m32r where the base insn size is 32
405    but some insns are 16 bits.
406    ATTRS is a mask of the boolean attributes.  We only need `SIGNED',
407    but for generality we take a bitmask of all of them.
408    WORD_OFFSET is the offset in bits from the start of the insn of the value.
409    WORD_LENGTH is the length of the word in bits in which the value resides.
410    START is the starting bit number in the word, architecture origin.
411    LENGTH is the length of VALUE in bits.
412    TOTAL_LENGTH is the total length of the insn in bits.
413
414    Returns 1 for success, 0 for failure.  */
415
416 /* ??? The return code isn't properly used.  wip.  */
417
418 /* ??? This doesn't handle bfd_vma's.  Create another function when
419    necessary.  */
420
421 static int
422 extract_normal (CGEN_CPU_DESC cd,
423 #if ! CGEN_INT_INSN_P
424                 CGEN_EXTRACT_INFO *ex_info,
425 #else
426                 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
427 #endif
428                 CGEN_INSN_INT insn_value,
429                 unsigned int attrs,
430                 unsigned int word_offset,
431                 unsigned int start,
432                 unsigned int length,
433                 unsigned int word_length,
434                 unsigned int total_length,
435 #if ! CGEN_INT_INSN_P
436                 bfd_vma pc,
437 #else
438                 bfd_vma pc ATTRIBUTE_UNUSED,
439 #endif
440                 long *valuep)
441 {
442   long value, mask;
443
444   /* If LENGTH is zero, this operand doesn't contribute to the value
445      so give it a standard value of zero.  */
446   if (length == 0)
447     {
448       *valuep = 0;
449       return 1;
450     }
451
452   if (word_length > 8 * sizeof (CGEN_INSN_INT))
453     abort ();
454
455   /* For architectures with insns smaller than the insn-base-bitsize,
456      word_length may be too big.  */
457   if (cd->min_insn_bitsize < cd->base_insn_bitsize)
458     {
459       if (word_offset + word_length > total_length)
460         word_length = total_length - word_offset;
461     }
462
463   /* Does the value reside in INSN_VALUE, and at the right alignment?  */
464
465   if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
466     {
467       if (CGEN_INSN_LSB0_P)
468         value = insn_value >> ((word_offset + start + 1) - length);
469       else
470         value = insn_value >> (total_length - ( word_offset + start + length));
471     }
472
473 #if ! CGEN_INT_INSN_P
474
475   else
476     {
477       unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
478
479       if (word_length > 8 * sizeof (CGEN_INSN_INT))
480         abort ();
481
482       if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
483         return 0;
484
485       value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
486     }
487
488 #endif /* ! CGEN_INT_INSN_P */
489
490   /* Written this way to avoid undefined behaviour.  */
491   mask = (((1L << (length - 1)) - 1) << 1) | 1;
492
493   value &= mask;
494   /* sign extend? */
495   if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
496       && (value & (1L << (length - 1))))
497     value |= ~mask;
498
499   *valuep = value;
500
501   return 1;
502 }
503
504 /* Default insn extractor.
505
506    INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
507    The extracted fields are stored in FIELDS.
508    EX_INFO is used to handle reading variable length insns.
509    Return the length of the insn in bits, or 0 if no match,
510    or -1 if an error occurs fetching data (memory_error_func will have
511    been called).  */
512
513 static int
514 extract_insn_normal (CGEN_CPU_DESC cd,
515                      const CGEN_INSN *insn,
516                      CGEN_EXTRACT_INFO *ex_info,
517                      CGEN_INSN_INT insn_value,
518                      CGEN_FIELDS *fields,
519                      bfd_vma pc)
520 {
521   const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
522   const CGEN_SYNTAX_CHAR_TYPE *syn;
523
524   CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
525
526   CGEN_INIT_EXTRACT (cd);
527
528   for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
529     {
530       int length;
531
532       if (CGEN_SYNTAX_CHAR_P (*syn))
533         continue;
534
535       length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
536                                         ex_info, insn_value, fields, pc);
537       if (length <= 0)
538         return length;
539     }
540
541   /* We recognized and successfully extracted this insn.  */
542   return CGEN_INSN_BITSIZE (insn);
543 }
544 \f
545 /* Machine generated code added here.  */
546
547 const char * frv_cgen_insert_operand
548   (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
549
550 /* Main entry point for operand insertion.
551
552    This function is basically just a big switch statement.  Earlier versions
553    used tables to look up the function to use, but
554    - if the table contains both assembler and disassembler functions then
555      the disassembler contains much of the assembler and vice-versa,
556    - there's a lot of inlining possibilities as things grow,
557    - using a switch statement avoids the function call overhead.
558
559    This function could be moved into `parse_insn_normal', but keeping it
560    separate makes clear the interface between `parse_insn_normal' and each of
561    the handlers.  It's also needed by GAS to insert operands that couldn't be
562    resolved during parsing.  */
563
564 const char *
565 frv_cgen_insert_operand (CGEN_CPU_DESC cd,
566                              int opindex,
567                              CGEN_FIELDS * fields,
568                              CGEN_INSN_BYTES_PTR buffer,
569                              bfd_vma pc ATTRIBUTE_UNUSED)
570 {
571   const char * errmsg = NULL;
572   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
573
574   switch (opindex)
575     {
576     case FRV_OPERAND_A0 :
577       errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
578       break;
579     case FRV_OPERAND_A1 :
580       errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
581       break;
582     case FRV_OPERAND_ACC40SI :
583       errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer);
584       break;
585     case FRV_OPERAND_ACC40SK :
586       errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer);
587       break;
588     case FRV_OPERAND_ACC40UI :
589       errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer);
590       break;
591     case FRV_OPERAND_ACC40UK :
592       errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer);
593       break;
594     case FRV_OPERAND_ACCGI :
595       errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer);
596       break;
597     case FRV_OPERAND_ACCGK :
598       errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer);
599       break;
600     case FRV_OPERAND_CCI :
601       errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer);
602       break;
603     case FRV_OPERAND_CPRDOUBLEK :
604       errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
605       break;
606     case FRV_OPERAND_CPRI :
607       errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer);
608       break;
609     case FRV_OPERAND_CPRJ :
610       errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer);
611       break;
612     case FRV_OPERAND_CPRK :
613       errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
614       break;
615     case FRV_OPERAND_CRI :
616       errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer);
617       break;
618     case FRV_OPERAND_CRJ :
619       errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer);
620       break;
621     case FRV_OPERAND_CRJ_FLOAT :
622       errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer);
623       break;
624     case FRV_OPERAND_CRJ_INT :
625       {
626         long value = fields->f_CRj_int;
627         value = ((value) - (4));
628         errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer);
629       }
630       break;
631     case FRV_OPERAND_CRK :
632       errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer);
633       break;
634     case FRV_OPERAND_FCCI_1 :
635       errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer);
636       break;
637     case FRV_OPERAND_FCCI_2 :
638       errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer);
639       break;
640     case FRV_OPERAND_FCCI_3 :
641       errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer);
642       break;
643     case FRV_OPERAND_FCCK :
644       errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer);
645       break;
646     case FRV_OPERAND_FRDOUBLEI :
647       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
648       break;
649     case FRV_OPERAND_FRDOUBLEJ :
650       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
651       break;
652     case FRV_OPERAND_FRDOUBLEK :
653       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
654       break;
655     case FRV_OPERAND_FRI :
656       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
657       break;
658     case FRV_OPERAND_FRINTI :
659       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
660       break;
661     case FRV_OPERAND_FRINTIEVEN :
662       errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
663       break;
664     case FRV_OPERAND_FRINTJ :
665       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
666       break;
667     case FRV_OPERAND_FRINTJEVEN :
668       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
669       break;
670     case FRV_OPERAND_FRINTK :
671       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
672       break;
673     case FRV_OPERAND_FRINTKEVEN :
674       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
675       break;
676     case FRV_OPERAND_FRJ :
677       errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
678       break;
679     case FRV_OPERAND_FRK :
680       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
681       break;
682     case FRV_OPERAND_FRKHI :
683       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
684       break;
685     case FRV_OPERAND_FRKLO :
686       errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
687       break;
688     case FRV_OPERAND_GRDOUBLEK :
689       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
690       break;
691     case FRV_OPERAND_GRI :
692       errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer);
693       break;
694     case FRV_OPERAND_GRJ :
695       errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer);
696       break;
697     case FRV_OPERAND_GRK :
698       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
699       break;
700     case FRV_OPERAND_GRKHI :
701       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
702       break;
703     case FRV_OPERAND_GRKLO :
704       errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
705       break;
706     case FRV_OPERAND_ICCI_1 :
707       errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer);
708       break;
709     case FRV_OPERAND_ICCI_2 :
710       errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer);
711       break;
712     case FRV_OPERAND_ICCI_3 :
713       errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer);
714       break;
715     case FRV_OPERAND_LI :
716       errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer);
717       break;
718     case FRV_OPERAND_LRAD :
719       errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer);
720       break;
721     case FRV_OPERAND_LRAE :
722       errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer);
723       break;
724     case FRV_OPERAND_LRAS :
725       errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer);
726       break;
727     case FRV_OPERAND_TLBPRL :
728       errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer);
729       break;
730     case FRV_OPERAND_TLBPROPX :
731       errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer);
732       break;
733     case FRV_OPERAND_AE :
734       errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
735       break;
736     case FRV_OPERAND_CALLANN :
737       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
738       break;
739     case FRV_OPERAND_CCOND :
740       errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
741       break;
742     case FRV_OPERAND_COND :
743       errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer);
744       break;
745     case FRV_OPERAND_D12 :
746       errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
747       break;
748     case FRV_OPERAND_DEBUG :
749       errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer);
750       break;
751     case FRV_OPERAND_EIR :
752       errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer);
753       break;
754     case FRV_OPERAND_HINT :
755       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
756       break;
757     case FRV_OPERAND_HINT_NOT_TAKEN :
758       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
759       break;
760     case FRV_OPERAND_HINT_TAKEN :
761       errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
762       break;
763     case FRV_OPERAND_LABEL16 :
764       {
765         long value = fields->f_label16;
766         value = ((SI) (((value) - (pc))) >> (2));
767         errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer);
768       }
769       break;
770     case FRV_OPERAND_LABEL24 :
771       {
772 {
773   FLD (f_labelH6) = ((SI) (((FLD (f_label24)) - (pc))) >> (20));
774   FLD (f_labelL18) = ((((UINT) (((FLD (f_label24)) - (pc))) >> (2))) & (262143));
775 }
776         errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer);
777         if (errmsg)
778           break;
779         errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer);
780         if (errmsg)
781           break;
782       }
783       break;
784     case FRV_OPERAND_LDANN :
785       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
786       break;
787     case FRV_OPERAND_LDDANN :
788       errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
789       break;
790     case FRV_OPERAND_LOCK :
791       errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
792       break;
793     case FRV_OPERAND_PACK :
794       errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer);
795       break;
796     case FRV_OPERAND_S10 :
797       errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer);
798       break;
799     case FRV_OPERAND_S12 :
800       errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
801       break;
802     case FRV_OPERAND_S16 :
803       errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
804       break;
805     case FRV_OPERAND_S5 :
806       errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer);
807       break;
808     case FRV_OPERAND_S6 :
809       errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer);
810       break;
811     case FRV_OPERAND_S6_1 :
812       errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer);
813       break;
814     case FRV_OPERAND_SLO16 :
815       errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
816       break;
817     case FRV_OPERAND_SPR :
818       {
819 {
820   FLD (f_spr_h) = ((UINT) (FLD (f_spr)) >> (6));
821   FLD (f_spr_l) = ((FLD (f_spr)) & (63));
822 }
823         errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer);
824         if (errmsg)
825           break;
826         errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer);
827         if (errmsg)
828           break;
829       }
830       break;
831     case FRV_OPERAND_U12 :
832       {
833 {
834   FLD (f_u12_h) = ((SI) (FLD (f_u12)) >> (6));
835   FLD (f_u12_l) = ((FLD (f_u12)) & (63));
836 }
837         errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer);
838         if (errmsg)
839           break;
840         errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer);
841         if (errmsg)
842           break;
843       }
844       break;
845     case FRV_OPERAND_U16 :
846       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
847       break;
848     case FRV_OPERAND_U6 :
849       errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer);
850       break;
851     case FRV_OPERAND_UHI16 :
852       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
853       break;
854     case FRV_OPERAND_ULO16 :
855       errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
856       break;
857
858     default :
859       /* xgettext:c-format */
860       fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
861                opindex);
862       abort ();
863   }
864
865   return errmsg;
866 }
867
868 int frv_cgen_extract_operand
869   (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
870
871 /* Main entry point for operand extraction.
872    The result is <= 0 for error, >0 for success.
873    ??? Actual values aren't well defined right now.
874
875    This function is basically just a big switch statement.  Earlier versions
876    used tables to look up the function to use, but
877    - if the table contains both assembler and disassembler functions then
878      the disassembler contains much of the assembler and vice-versa,
879    - there's a lot of inlining possibilities as things grow,
880    - using a switch statement avoids the function call overhead.
881
882    This function could be moved into `print_insn_normal', but keeping it
883    separate makes clear the interface between `print_insn_normal' and each of
884    the handlers.  */
885
886 int
887 frv_cgen_extract_operand (CGEN_CPU_DESC cd,
888                              int opindex,
889                              CGEN_EXTRACT_INFO *ex_info,
890                              CGEN_INSN_INT insn_value,
891                              CGEN_FIELDS * fields,
892                              bfd_vma pc)
893 {
894   /* Assume success (for those operands that are nops).  */
895   int length = 1;
896   unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
897
898   switch (opindex)
899     {
900     case FRV_OPERAND_A0 :
901       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
902       break;
903     case FRV_OPERAND_A1 :
904       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
905       break;
906     case FRV_OPERAND_ACC40SI :
907       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si);
908       break;
909     case FRV_OPERAND_ACC40SK :
910       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk);
911       break;
912     case FRV_OPERAND_ACC40UI :
913       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui);
914       break;
915     case FRV_OPERAND_ACC40UK :
916       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk);
917       break;
918     case FRV_OPERAND_ACCGI :
919       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi);
920       break;
921     case FRV_OPERAND_ACCGK :
922       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk);
923       break;
924     case FRV_OPERAND_CCI :
925       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi);
926       break;
927     case FRV_OPERAND_CPRDOUBLEK :
928       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
929       break;
930     case FRV_OPERAND_CPRI :
931       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi);
932       break;
933     case FRV_OPERAND_CPRJ :
934       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj);
935       break;
936     case FRV_OPERAND_CPRK :
937       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
938       break;
939     case FRV_OPERAND_CRI :
940       length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi);
941       break;
942     case FRV_OPERAND_CRJ :
943       length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj);
944       break;
945     case FRV_OPERAND_CRJ_FLOAT :
946       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float);
947       break;
948     case FRV_OPERAND_CRJ_INT :
949       {
950         long value;
951         length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value);
952         value = ((value) + (4));
953         fields->f_CRj_int = value;
954       }
955       break;
956     case FRV_OPERAND_CRK :
957       length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk);
958       break;
959     case FRV_OPERAND_FCCI_1 :
960       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1);
961       break;
962     case FRV_OPERAND_FCCI_2 :
963       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2);
964       break;
965     case FRV_OPERAND_FCCI_3 :
966       length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3);
967       break;
968     case FRV_OPERAND_FCCK :
969       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk);
970       break;
971     case FRV_OPERAND_FRDOUBLEI :
972       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
973       break;
974     case FRV_OPERAND_FRDOUBLEJ :
975       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
976       break;
977     case FRV_OPERAND_FRDOUBLEK :
978       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
979       break;
980     case FRV_OPERAND_FRI :
981       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
982       break;
983     case FRV_OPERAND_FRINTI :
984       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
985       break;
986     case FRV_OPERAND_FRINTIEVEN :
987       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
988       break;
989     case FRV_OPERAND_FRINTJ :
990       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
991       break;
992     case FRV_OPERAND_FRINTJEVEN :
993       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
994       break;
995     case FRV_OPERAND_FRINTK :
996       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
997       break;
998     case FRV_OPERAND_FRINTKEVEN :
999       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1000       break;
1001     case FRV_OPERAND_FRJ :
1002       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
1003       break;
1004     case FRV_OPERAND_FRK :
1005       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1006       break;
1007     case FRV_OPERAND_FRKHI :
1008       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1009       break;
1010     case FRV_OPERAND_FRKLO :
1011       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1012       break;
1013     case FRV_OPERAND_GRDOUBLEK :
1014       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1015       break;
1016     case FRV_OPERAND_GRI :
1017       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi);
1018       break;
1019     case FRV_OPERAND_GRJ :
1020       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj);
1021       break;
1022     case FRV_OPERAND_GRK :
1023       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1024       break;
1025     case FRV_OPERAND_GRKHI :
1026       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1027       break;
1028     case FRV_OPERAND_GRKLO :
1029       length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1030       break;
1031     case FRV_OPERAND_ICCI_1 :
1032       length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1);
1033       break;
1034     case FRV_OPERAND_ICCI_2 :
1035       length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2);
1036       break;
1037     case FRV_OPERAND_ICCI_3 :
1038       length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3);
1039       break;
1040     case FRV_OPERAND_LI :
1041       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI);
1042       break;
1043     case FRV_OPERAND_LRAD :
1044       length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD);
1045       break;
1046     case FRV_OPERAND_LRAE :
1047       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE);
1048       break;
1049     case FRV_OPERAND_LRAS :
1050       length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS);
1051       break;
1052     case FRV_OPERAND_TLBPRL :
1053       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL);
1054       break;
1055     case FRV_OPERAND_TLBPROPX :
1056       length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx);
1057       break;
1058     case FRV_OPERAND_AE :
1059       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
1060       break;
1061     case FRV_OPERAND_CALLANN :
1062       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1063       break;
1064     case FRV_OPERAND_CCOND :
1065       length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
1066       break;
1067     case FRV_OPERAND_COND :
1068       length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond);
1069       break;
1070     case FRV_OPERAND_D12 :
1071       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
1072       break;
1073     case FRV_OPERAND_DEBUG :
1074       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug);
1075       break;
1076     case FRV_OPERAND_EIR :
1077       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir);
1078       break;
1079     case FRV_OPERAND_HINT :
1080       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1081       break;
1082     case FRV_OPERAND_HINT_NOT_TAKEN :
1083       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1084       break;
1085     case FRV_OPERAND_HINT_TAKEN :
1086       length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1087       break;
1088     case FRV_OPERAND_LABEL16 :
1089       {
1090         long value;
1091         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, pc, & value);
1092         value = ((((value) << (2))) + (pc));
1093         fields->f_label16 = value;
1094       }
1095       break;
1096     case FRV_OPERAND_LABEL24 :
1097       {
1098         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6);
1099         if (length <= 0) break;
1100         length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
1101         if (length <= 0) break;
1102 {
1103   FLD (f_label24) = ((((((((FLD (f_labelH6)) << (18))) | (FLD (f_labelL18)))) << (2))) + (pc));
1104 }
1105       }
1106       break;
1107     case FRV_OPERAND_LDANN :
1108       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1109       break;
1110     case FRV_OPERAND_LDDANN :
1111       length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1112       break;
1113     case FRV_OPERAND_LOCK :
1114       length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
1115       break;
1116     case FRV_OPERAND_PACK :
1117       length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack);
1118       break;
1119     case FRV_OPERAND_S10 :
1120       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10);
1121       break;
1122     case FRV_OPERAND_S12 :
1123       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
1124       break;
1125     case FRV_OPERAND_S16 :
1126       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
1127       break;
1128     case FRV_OPERAND_S5 :
1129       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5);
1130       break;
1131     case FRV_OPERAND_S6 :
1132       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6);
1133       break;
1134     case FRV_OPERAND_S6_1 :
1135       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1);
1136       break;
1137     case FRV_OPERAND_SLO16 :
1138       length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
1139       break;
1140     case FRV_OPERAND_SPR :
1141       {
1142         length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h);
1143         if (length <= 0) break;
1144         length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l);
1145         if (length <= 0) break;
1146 {
1147   FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l)));
1148 }
1149       }
1150       break;
1151     case FRV_OPERAND_U12 :
1152       {
1153         length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h);
1154         if (length <= 0) break;
1155         length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
1156         if (length <= 0) break;
1157 {
1158   FLD (f_u12) = ((((FLD (f_u12_h)) << (6))) | (FLD (f_u12_l)));
1159 }
1160       }
1161       break;
1162     case FRV_OPERAND_U16 :
1163       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1164       break;
1165     case FRV_OPERAND_U6 :
1166       length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6);
1167       break;
1168     case FRV_OPERAND_UHI16 :
1169       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1170       break;
1171     case FRV_OPERAND_ULO16 :
1172       length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1173       break;
1174
1175     default :
1176       /* xgettext:c-format */
1177       fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
1178                opindex);
1179       abort ();
1180     }
1181
1182   return length;
1183 }
1184
1185 cgen_insert_fn * const frv_cgen_insert_handlers[] =
1186 {
1187   insert_insn_normal,
1188 };
1189
1190 cgen_extract_fn * const frv_cgen_extract_handlers[] =
1191 {
1192   extract_insn_normal,
1193 };
1194
1195 int frv_cgen_get_int_operand     (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1196 bfd_vma frv_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1197
1198 /* Getting values from cgen_fields is handled by a collection of functions.
1199    They are distinguished by the type of the VALUE argument they return.
1200    TODO: floating point, inlining support, remove cases where result type
1201    not appropriate.  */
1202
1203 int
1204 frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1205                              int opindex,
1206                              const CGEN_FIELDS * fields)
1207 {
1208   int value;
1209
1210   switch (opindex)
1211     {
1212     case FRV_OPERAND_A0 :
1213       value = fields->f_A;
1214       break;
1215     case FRV_OPERAND_A1 :
1216       value = fields->f_A;
1217       break;
1218     case FRV_OPERAND_ACC40SI :
1219       value = fields->f_ACC40Si;
1220       break;
1221     case FRV_OPERAND_ACC40SK :
1222       value = fields->f_ACC40Sk;
1223       break;
1224     case FRV_OPERAND_ACC40UI :
1225       value = fields->f_ACC40Ui;
1226       break;
1227     case FRV_OPERAND_ACC40UK :
1228       value = fields->f_ACC40Uk;
1229       break;
1230     case FRV_OPERAND_ACCGI :
1231       value = fields->f_ACCGi;
1232       break;
1233     case FRV_OPERAND_ACCGK :
1234       value = fields->f_ACCGk;
1235       break;
1236     case FRV_OPERAND_CCI :
1237       value = fields->f_CCi;
1238       break;
1239     case FRV_OPERAND_CPRDOUBLEK :
1240       value = fields->f_CPRk;
1241       break;
1242     case FRV_OPERAND_CPRI :
1243       value = fields->f_CPRi;
1244       break;
1245     case FRV_OPERAND_CPRJ :
1246       value = fields->f_CPRj;
1247       break;
1248     case FRV_OPERAND_CPRK :
1249       value = fields->f_CPRk;
1250       break;
1251     case FRV_OPERAND_CRI :
1252       value = fields->f_CRi;
1253       break;
1254     case FRV_OPERAND_CRJ :
1255       value = fields->f_CRj;
1256       break;
1257     case FRV_OPERAND_CRJ_FLOAT :
1258       value = fields->f_CRj_float;
1259       break;
1260     case FRV_OPERAND_CRJ_INT :
1261       value = fields->f_CRj_int;
1262       break;
1263     case FRV_OPERAND_CRK :
1264       value = fields->f_CRk;
1265       break;
1266     case FRV_OPERAND_FCCI_1 :
1267       value = fields->f_FCCi_1;
1268       break;
1269     case FRV_OPERAND_FCCI_2 :
1270       value = fields->f_FCCi_2;
1271       break;
1272     case FRV_OPERAND_FCCI_3 :
1273       value = fields->f_FCCi_3;
1274       break;
1275     case FRV_OPERAND_FCCK :
1276       value = fields->f_FCCk;
1277       break;
1278     case FRV_OPERAND_FRDOUBLEI :
1279       value = fields->f_FRi;
1280       break;
1281     case FRV_OPERAND_FRDOUBLEJ :
1282       value = fields->f_FRj;
1283       break;
1284     case FRV_OPERAND_FRDOUBLEK :
1285       value = fields->f_FRk;
1286       break;
1287     case FRV_OPERAND_FRI :
1288       value = fields->f_FRi;
1289       break;
1290     case FRV_OPERAND_FRINTI :
1291       value = fields->f_FRi;
1292       break;
1293     case FRV_OPERAND_FRINTIEVEN :
1294       value = fields->f_FRi;
1295       break;
1296     case FRV_OPERAND_FRINTJ :
1297       value = fields->f_FRj;
1298       break;
1299     case FRV_OPERAND_FRINTJEVEN :
1300       value = fields->f_FRj;
1301       break;
1302     case FRV_OPERAND_FRINTK :
1303       value = fields->f_FRk;
1304       break;
1305     case FRV_OPERAND_FRINTKEVEN :
1306       value = fields->f_FRk;
1307       break;
1308     case FRV_OPERAND_FRJ :
1309       value = fields->f_FRj;
1310       break;
1311     case FRV_OPERAND_FRK :
1312       value = fields->f_FRk;
1313       break;
1314     case FRV_OPERAND_FRKHI :
1315       value = fields->f_FRk;
1316       break;
1317     case FRV_OPERAND_FRKLO :
1318       value = fields->f_FRk;
1319       break;
1320     case FRV_OPERAND_GRDOUBLEK :
1321       value = fields->f_GRk;
1322       break;
1323     case FRV_OPERAND_GRI :
1324       value = fields->f_GRi;
1325       break;
1326     case FRV_OPERAND_GRJ :
1327       value = fields->f_GRj;
1328       break;
1329     case FRV_OPERAND_GRK :
1330       value = fields->f_GRk;
1331       break;
1332     case FRV_OPERAND_GRKHI :
1333       value = fields->f_GRk;
1334       break;
1335     case FRV_OPERAND_GRKLO :
1336       value = fields->f_GRk;
1337       break;
1338     case FRV_OPERAND_ICCI_1 :
1339       value = fields->f_ICCi_1;
1340       break;
1341     case FRV_OPERAND_ICCI_2 :
1342       value = fields->f_ICCi_2;
1343       break;
1344     case FRV_OPERAND_ICCI_3 :
1345       value = fields->f_ICCi_3;
1346       break;
1347     case FRV_OPERAND_LI :
1348       value = fields->f_LI;
1349       break;
1350     case FRV_OPERAND_LRAD :
1351       value = fields->f_LRAD;
1352       break;
1353     case FRV_OPERAND_LRAE :
1354       value = fields->f_LRAE;
1355       break;
1356     case FRV_OPERAND_LRAS :
1357       value = fields->f_LRAS;
1358       break;
1359     case FRV_OPERAND_TLBPRL :
1360       value = fields->f_TLBPRL;
1361       break;
1362     case FRV_OPERAND_TLBPROPX :
1363       value = fields->f_TLBPRopx;
1364       break;
1365     case FRV_OPERAND_AE :
1366       value = fields->f_ae;
1367       break;
1368     case FRV_OPERAND_CALLANN :
1369       value = fields->f_reloc_ann;
1370       break;
1371     case FRV_OPERAND_CCOND :
1372       value = fields->f_ccond;
1373       break;
1374     case FRV_OPERAND_COND :
1375       value = fields->f_cond;
1376       break;
1377     case FRV_OPERAND_D12 :
1378       value = fields->f_d12;
1379       break;
1380     case FRV_OPERAND_DEBUG :
1381       value = fields->f_debug;
1382       break;
1383     case FRV_OPERAND_EIR :
1384       value = fields->f_eir;
1385       break;
1386     case FRV_OPERAND_HINT :
1387       value = fields->f_hint;
1388       break;
1389     case FRV_OPERAND_HINT_NOT_TAKEN :
1390       value = fields->f_hint;
1391       break;
1392     case FRV_OPERAND_HINT_TAKEN :
1393       value = fields->f_hint;
1394       break;
1395     case FRV_OPERAND_LABEL16 :
1396       value = fields->f_label16;
1397       break;
1398     case FRV_OPERAND_LABEL24 :
1399       value = fields->f_label24;
1400       break;
1401     case FRV_OPERAND_LDANN :
1402       value = fields->f_reloc_ann;
1403       break;
1404     case FRV_OPERAND_LDDANN :
1405       value = fields->f_reloc_ann;
1406       break;
1407     case FRV_OPERAND_LOCK :
1408       value = fields->f_lock;
1409       break;
1410     case FRV_OPERAND_PACK :
1411       value = fields->f_pack;
1412       break;
1413     case FRV_OPERAND_S10 :
1414       value = fields->f_s10;
1415       break;
1416     case FRV_OPERAND_S12 :
1417       value = fields->f_d12;
1418       break;
1419     case FRV_OPERAND_S16 :
1420       value = fields->f_s16;
1421       break;
1422     case FRV_OPERAND_S5 :
1423       value = fields->f_s5;
1424       break;
1425     case FRV_OPERAND_S6 :
1426       value = fields->f_s6;
1427       break;
1428     case FRV_OPERAND_S6_1 :
1429       value = fields->f_s6_1;
1430       break;
1431     case FRV_OPERAND_SLO16 :
1432       value = fields->f_s16;
1433       break;
1434     case FRV_OPERAND_SPR :
1435       value = fields->f_spr;
1436       break;
1437     case FRV_OPERAND_U12 :
1438       value = fields->f_u12;
1439       break;
1440     case FRV_OPERAND_U16 :
1441       value = fields->f_u16;
1442       break;
1443     case FRV_OPERAND_U6 :
1444       value = fields->f_u6;
1445       break;
1446     case FRV_OPERAND_UHI16 :
1447       value = fields->f_u16;
1448       break;
1449     case FRV_OPERAND_ULO16 :
1450       value = fields->f_u16;
1451       break;
1452
1453     default :
1454       /* xgettext:c-format */
1455       fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1456                        opindex);
1457       abort ();
1458   }
1459
1460   return value;
1461 }
1462
1463 bfd_vma
1464 frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1465                              int opindex,
1466                              const CGEN_FIELDS * fields)
1467 {
1468   bfd_vma value;
1469
1470   switch (opindex)
1471     {
1472     case FRV_OPERAND_A0 :
1473       value = fields->f_A;
1474       break;
1475     case FRV_OPERAND_A1 :
1476       value = fields->f_A;
1477       break;
1478     case FRV_OPERAND_ACC40SI :
1479       value = fields->f_ACC40Si;
1480       break;
1481     case FRV_OPERAND_ACC40SK :
1482       value = fields->f_ACC40Sk;
1483       break;
1484     case FRV_OPERAND_ACC40UI :
1485       value = fields->f_ACC40Ui;
1486       break;
1487     case FRV_OPERAND_ACC40UK :
1488       value = fields->f_ACC40Uk;
1489       break;
1490     case FRV_OPERAND_ACCGI :
1491       value = fields->f_ACCGi;
1492       break;
1493     case FRV_OPERAND_ACCGK :
1494       value = fields->f_ACCGk;
1495       break;
1496     case FRV_OPERAND_CCI :
1497       value = fields->f_CCi;
1498       break;
1499     case FRV_OPERAND_CPRDOUBLEK :
1500       value = fields->f_CPRk;
1501       break;
1502     case FRV_OPERAND_CPRI :
1503       value = fields->f_CPRi;
1504       break;
1505     case FRV_OPERAND_CPRJ :
1506       value = fields->f_CPRj;
1507       break;
1508     case FRV_OPERAND_CPRK :
1509       value = fields->f_CPRk;
1510       break;
1511     case FRV_OPERAND_CRI :
1512       value = fields->f_CRi;
1513       break;
1514     case FRV_OPERAND_CRJ :
1515       value = fields->f_CRj;
1516       break;
1517     case FRV_OPERAND_CRJ_FLOAT :
1518       value = fields->f_CRj_float;
1519       break;
1520     case FRV_OPERAND_CRJ_INT :
1521       value = fields->f_CRj_int;
1522       break;
1523     case FRV_OPERAND_CRK :
1524       value = fields->f_CRk;
1525       break;
1526     case FRV_OPERAND_FCCI_1 :
1527       value = fields->f_FCCi_1;
1528       break;
1529     case FRV_OPERAND_FCCI_2 :
1530       value = fields->f_FCCi_2;
1531       break;
1532     case FRV_OPERAND_FCCI_3 :
1533       value = fields->f_FCCi_3;
1534       break;
1535     case FRV_OPERAND_FCCK :
1536       value = fields->f_FCCk;
1537       break;
1538     case FRV_OPERAND_FRDOUBLEI :
1539       value = fields->f_FRi;
1540       break;
1541     case FRV_OPERAND_FRDOUBLEJ :
1542       value = fields->f_FRj;
1543       break;
1544     case FRV_OPERAND_FRDOUBLEK :
1545       value = fields->f_FRk;
1546       break;
1547     case FRV_OPERAND_FRI :
1548       value = fields->f_FRi;
1549       break;
1550     case FRV_OPERAND_FRINTI :
1551       value = fields->f_FRi;
1552       break;
1553     case FRV_OPERAND_FRINTIEVEN :
1554       value = fields->f_FRi;
1555       break;
1556     case FRV_OPERAND_FRINTJ :
1557       value = fields->f_FRj;
1558       break;
1559     case FRV_OPERAND_FRINTJEVEN :
1560       value = fields->f_FRj;
1561       break;
1562     case FRV_OPERAND_FRINTK :
1563       value = fields->f_FRk;
1564       break;
1565     case FRV_OPERAND_FRINTKEVEN :
1566       value = fields->f_FRk;
1567       break;
1568     case FRV_OPERAND_FRJ :
1569       value = fields->f_FRj;
1570       break;
1571     case FRV_OPERAND_FRK :
1572       value = fields->f_FRk;
1573       break;
1574     case FRV_OPERAND_FRKHI :
1575       value = fields->f_FRk;
1576       break;
1577     case FRV_OPERAND_FRKLO :
1578       value = fields->f_FRk;
1579       break;
1580     case FRV_OPERAND_GRDOUBLEK :
1581       value = fields->f_GRk;
1582       break;
1583     case FRV_OPERAND_GRI :
1584       value = fields->f_GRi;
1585       break;
1586     case FRV_OPERAND_GRJ :
1587       value = fields->f_GRj;
1588       break;
1589     case FRV_OPERAND_GRK :
1590       value = fields->f_GRk;
1591       break;
1592     case FRV_OPERAND_GRKHI :
1593       value = fields->f_GRk;
1594       break;
1595     case FRV_OPERAND_GRKLO :
1596       value = fields->f_GRk;
1597       break;
1598     case FRV_OPERAND_ICCI_1 :
1599       value = fields->f_ICCi_1;
1600       break;
1601     case FRV_OPERAND_ICCI_2 :
1602       value = fields->f_ICCi_2;
1603       break;
1604     case FRV_OPERAND_ICCI_3 :
1605       value = fields->f_ICCi_3;
1606       break;
1607     case FRV_OPERAND_LI :
1608       value = fields->f_LI;
1609       break;
1610     case FRV_OPERAND_LRAD :
1611       value = fields->f_LRAD;
1612       break;
1613     case FRV_OPERAND_LRAE :
1614       value = fields->f_LRAE;
1615       break;
1616     case FRV_OPERAND_LRAS :
1617       value = fields->f_LRAS;
1618       break;
1619     case FRV_OPERAND_TLBPRL :
1620       value = fields->f_TLBPRL;
1621       break;
1622     case FRV_OPERAND_TLBPROPX :
1623       value = fields->f_TLBPRopx;
1624       break;
1625     case FRV_OPERAND_AE :
1626       value = fields->f_ae;
1627       break;
1628     case FRV_OPERAND_CALLANN :
1629       value = fields->f_reloc_ann;
1630       break;
1631     case FRV_OPERAND_CCOND :
1632       value = fields->f_ccond;
1633       break;
1634     case FRV_OPERAND_COND :
1635       value = fields->f_cond;
1636       break;
1637     case FRV_OPERAND_D12 :
1638       value = fields->f_d12;
1639       break;
1640     case FRV_OPERAND_DEBUG :
1641       value = fields->f_debug;
1642       break;
1643     case FRV_OPERAND_EIR :
1644       value = fields->f_eir;
1645       break;
1646     case FRV_OPERAND_HINT :
1647       value = fields->f_hint;
1648       break;
1649     case FRV_OPERAND_HINT_NOT_TAKEN :
1650       value = fields->f_hint;
1651       break;
1652     case FRV_OPERAND_HINT_TAKEN :
1653       value = fields->f_hint;
1654       break;
1655     case FRV_OPERAND_LABEL16 :
1656       value = fields->f_label16;
1657       break;
1658     case FRV_OPERAND_LABEL24 :
1659       value = fields->f_label24;
1660       break;
1661     case FRV_OPERAND_LDANN :
1662       value = fields->f_reloc_ann;
1663       break;
1664     case FRV_OPERAND_LDDANN :
1665       value = fields->f_reloc_ann;
1666       break;
1667     case FRV_OPERAND_LOCK :
1668       value = fields->f_lock;
1669       break;
1670     case FRV_OPERAND_PACK :
1671       value = fields->f_pack;
1672       break;
1673     case FRV_OPERAND_S10 :
1674       value = fields->f_s10;
1675       break;
1676     case FRV_OPERAND_S12 :
1677       value = fields->f_d12;
1678       break;
1679     case FRV_OPERAND_S16 :
1680       value = fields->f_s16;
1681       break;
1682     case FRV_OPERAND_S5 :
1683       value = fields->f_s5;
1684       break;
1685     case FRV_OPERAND_S6 :
1686       value = fields->f_s6;
1687       break;
1688     case FRV_OPERAND_S6_1 :
1689       value = fields->f_s6_1;
1690       break;
1691     case FRV_OPERAND_SLO16 :
1692       value = fields->f_s16;
1693       break;
1694     case FRV_OPERAND_SPR :
1695       value = fields->f_spr;
1696       break;
1697     case FRV_OPERAND_U12 :
1698       value = fields->f_u12;
1699       break;
1700     case FRV_OPERAND_U16 :
1701       value = fields->f_u16;
1702       break;
1703     case FRV_OPERAND_U6 :
1704       value = fields->f_u6;
1705       break;
1706     case FRV_OPERAND_UHI16 :
1707       value = fields->f_u16;
1708       break;
1709     case FRV_OPERAND_ULO16 :
1710       value = fields->f_u16;
1711       break;
1712
1713     default :
1714       /* xgettext:c-format */
1715       fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
1716                        opindex);
1717       abort ();
1718   }
1719
1720   return value;
1721 }
1722
1723 void frv_cgen_set_int_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1724 void frv_cgen_set_vma_operand  (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
1725
1726 /* Stuffing values in cgen_fields is handled by a collection of functions.
1727    They are distinguished by the type of the VALUE argument they accept.
1728    TODO: floating point, inlining support, remove cases where argument type
1729    not appropriate.  */
1730
1731 void
1732 frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1733                              int opindex,
1734                              CGEN_FIELDS * fields,
1735                              int value)
1736 {
1737   switch (opindex)
1738     {
1739     case FRV_OPERAND_A0 :
1740       fields->f_A = value;
1741       break;
1742     case FRV_OPERAND_A1 :
1743       fields->f_A = value;
1744       break;
1745     case FRV_OPERAND_ACC40SI :
1746       fields->f_ACC40Si = value;
1747       break;
1748     case FRV_OPERAND_ACC40SK :
1749       fields->f_ACC40Sk = value;
1750       break;
1751     case FRV_OPERAND_ACC40UI :
1752       fields->f_ACC40Ui = value;
1753       break;
1754     case FRV_OPERAND_ACC40UK :
1755       fields->f_ACC40Uk = value;
1756       break;
1757     case FRV_OPERAND_ACCGI :
1758       fields->f_ACCGi = value;
1759       break;
1760     case FRV_OPERAND_ACCGK :
1761       fields->f_ACCGk = value;
1762       break;
1763     case FRV_OPERAND_CCI :
1764       fields->f_CCi = value;
1765       break;
1766     case FRV_OPERAND_CPRDOUBLEK :
1767       fields->f_CPRk = value;
1768       break;
1769     case FRV_OPERAND_CPRI :
1770       fields->f_CPRi = value;
1771       break;
1772     case FRV_OPERAND_CPRJ :
1773       fields->f_CPRj = value;
1774       break;
1775     case FRV_OPERAND_CPRK :
1776       fields->f_CPRk = value;
1777       break;
1778     case FRV_OPERAND_CRI :
1779       fields->f_CRi = value;
1780       break;
1781     case FRV_OPERAND_CRJ :
1782       fields->f_CRj = value;
1783       break;
1784     case FRV_OPERAND_CRJ_FLOAT :
1785       fields->f_CRj_float = value;
1786       break;
1787     case FRV_OPERAND_CRJ_INT :
1788       fields->f_CRj_int = value;
1789       break;
1790     case FRV_OPERAND_CRK :
1791       fields->f_CRk = value;
1792       break;
1793     case FRV_OPERAND_FCCI_1 :
1794       fields->f_FCCi_1 = value;
1795       break;
1796     case FRV_OPERAND_FCCI_2 :
1797       fields->f_FCCi_2 = value;
1798       break;
1799     case FRV_OPERAND_FCCI_3 :
1800       fields->f_FCCi_3 = value;
1801       break;
1802     case FRV_OPERAND_FCCK :
1803       fields->f_FCCk = value;
1804       break;
1805     case FRV_OPERAND_FRDOUBLEI :
1806       fields->f_FRi = value;
1807       break;
1808     case FRV_OPERAND_FRDOUBLEJ :
1809       fields->f_FRj = value;
1810       break;
1811     case FRV_OPERAND_FRDOUBLEK :
1812       fields->f_FRk = value;
1813       break;
1814     case FRV_OPERAND_FRI :
1815       fields->f_FRi = value;
1816       break;
1817     case FRV_OPERAND_FRINTI :
1818       fields->f_FRi = value;
1819       break;
1820     case FRV_OPERAND_FRINTIEVEN :
1821       fields->f_FRi = value;
1822       break;
1823     case FRV_OPERAND_FRINTJ :
1824       fields->f_FRj = value;
1825       break;
1826     case FRV_OPERAND_FRINTJEVEN :
1827       fields->f_FRj = value;
1828       break;
1829     case FRV_OPERAND_FRINTK :
1830       fields->f_FRk = value;
1831       break;
1832     case FRV_OPERAND_FRINTKEVEN :
1833       fields->f_FRk = value;
1834       break;
1835     case FRV_OPERAND_FRJ :
1836       fields->f_FRj = value;
1837       break;
1838     case FRV_OPERAND_FRK :
1839       fields->f_FRk = value;
1840       break;
1841     case FRV_OPERAND_FRKHI :
1842       fields->f_FRk = value;
1843       break;
1844     case FRV_OPERAND_FRKLO :
1845       fields->f_FRk = value;
1846       break;
1847     case FRV_OPERAND_GRDOUBLEK :
1848       fields->f_GRk = value;
1849       break;
1850     case FRV_OPERAND_GRI :
1851       fields->f_GRi = value;
1852       break;
1853     case FRV_OPERAND_GRJ :
1854       fields->f_GRj = value;
1855       break;
1856     case FRV_OPERAND_GRK :
1857       fields->f_GRk = value;
1858       break;
1859     case FRV_OPERAND_GRKHI :
1860       fields->f_GRk = value;
1861       break;
1862     case FRV_OPERAND_GRKLO :
1863       fields->f_GRk = value;
1864       break;
1865     case FRV_OPERAND_ICCI_1 :
1866       fields->f_ICCi_1 = value;
1867       break;
1868     case FRV_OPERAND_ICCI_2 :
1869       fields->f_ICCi_2 = value;
1870       break;
1871     case FRV_OPERAND_ICCI_3 :
1872       fields->f_ICCi_3 = value;
1873       break;
1874     case FRV_OPERAND_LI :
1875       fields->f_LI = value;
1876       break;
1877     case FRV_OPERAND_LRAD :
1878       fields->f_LRAD = value;
1879       break;
1880     case FRV_OPERAND_LRAE :
1881       fields->f_LRAE = value;
1882       break;
1883     case FRV_OPERAND_LRAS :
1884       fields->f_LRAS = value;
1885       break;
1886     case FRV_OPERAND_TLBPRL :
1887       fields->f_TLBPRL = value;
1888       break;
1889     case FRV_OPERAND_TLBPROPX :
1890       fields->f_TLBPRopx = value;
1891       break;
1892     case FRV_OPERAND_AE :
1893       fields->f_ae = value;
1894       break;
1895     case FRV_OPERAND_CALLANN :
1896       fields->f_reloc_ann = value;
1897       break;
1898     case FRV_OPERAND_CCOND :
1899       fields->f_ccond = value;
1900       break;
1901     case FRV_OPERAND_COND :
1902       fields->f_cond = value;
1903       break;
1904     case FRV_OPERAND_D12 :
1905       fields->f_d12 = value;
1906       break;
1907     case FRV_OPERAND_DEBUG :
1908       fields->f_debug = value;
1909       break;
1910     case FRV_OPERAND_EIR :
1911       fields->f_eir = value;
1912       break;
1913     case FRV_OPERAND_HINT :
1914       fields->f_hint = value;
1915       break;
1916     case FRV_OPERAND_HINT_NOT_TAKEN :
1917       fields->f_hint = value;
1918       break;
1919     case FRV_OPERAND_HINT_TAKEN :
1920       fields->f_hint = value;
1921       break;
1922     case FRV_OPERAND_LABEL16 :
1923       fields->f_label16 = value;
1924       break;
1925     case FRV_OPERAND_LABEL24 :
1926       fields->f_label24 = value;
1927       break;
1928     case FRV_OPERAND_LDANN :
1929       fields->f_reloc_ann = value;
1930       break;
1931     case FRV_OPERAND_LDDANN :
1932       fields->f_reloc_ann = value;
1933       break;
1934     case FRV_OPERAND_LOCK :
1935       fields->f_lock = value;
1936       break;
1937     case FRV_OPERAND_PACK :
1938       fields->f_pack = value;
1939       break;
1940     case FRV_OPERAND_S10 :
1941       fields->f_s10 = value;
1942       break;
1943     case FRV_OPERAND_S12 :
1944       fields->f_d12 = value;
1945       break;
1946     case FRV_OPERAND_S16 :
1947       fields->f_s16 = value;
1948       break;
1949     case FRV_OPERAND_S5 :
1950       fields->f_s5 = value;
1951       break;
1952     case FRV_OPERAND_S6 :
1953       fields->f_s6 = value;
1954       break;
1955     case FRV_OPERAND_S6_1 :
1956       fields->f_s6_1 = value;
1957       break;
1958     case FRV_OPERAND_SLO16 :
1959       fields->f_s16 = value;
1960       break;
1961     case FRV_OPERAND_SPR :
1962       fields->f_spr = value;
1963       break;
1964     case FRV_OPERAND_U12 :
1965       fields->f_u12 = value;
1966       break;
1967     case FRV_OPERAND_U16 :
1968       fields->f_u16 = value;
1969       break;
1970     case FRV_OPERAND_U6 :
1971       fields->f_u6 = value;
1972       break;
1973     case FRV_OPERAND_UHI16 :
1974       fields->f_u16 = value;
1975       break;
1976     case FRV_OPERAND_ULO16 :
1977       fields->f_u16 = value;
1978       break;
1979
1980     default :
1981       /* xgettext:c-format */
1982       fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
1983                        opindex);
1984       abort ();
1985   }
1986 }
1987
1988 void
1989 frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1990                              int opindex,
1991                              CGEN_FIELDS * fields,
1992                              bfd_vma value)
1993 {
1994   switch (opindex)
1995     {
1996     case FRV_OPERAND_A0 :
1997       fields->f_A = value;
1998       break;
1999     case FRV_OPERAND_A1 :
2000       fields->f_A = value;
2001       break;
2002     case FRV_OPERAND_ACC40SI :
2003       fields->f_ACC40Si = value;
2004       break;
2005     case FRV_OPERAND_ACC40SK :
2006       fields->f_ACC40Sk = value;
2007       break;
2008     case FRV_OPERAND_ACC40UI :
2009       fields->f_ACC40Ui = value;
2010       break;
2011     case FRV_OPERAND_ACC40UK :
2012       fields->f_ACC40Uk = value;
2013       break;
2014     case FRV_OPERAND_ACCGI :
2015       fields->f_ACCGi = value;
2016       break;
2017     case FRV_OPERAND_ACCGK :
2018       fields->f_ACCGk = value;
2019       break;
2020     case FRV_OPERAND_CCI :
2021       fields->f_CCi = value;
2022       break;
2023     case FRV_OPERAND_CPRDOUBLEK :
2024       fields->f_CPRk = value;
2025       break;
2026     case FRV_OPERAND_CPRI :
2027       fields->f_CPRi = value;
2028       break;
2029     case FRV_OPERAND_CPRJ :
2030       fields->f_CPRj = value;
2031       break;
2032     case FRV_OPERAND_CPRK :
2033       fields->f_CPRk = value;
2034       break;
2035     case FRV_OPERAND_CRI :
2036       fields->f_CRi = value;
2037       break;
2038     case FRV_OPERAND_CRJ :
2039       fields->f_CRj = value;
2040       break;
2041     case FRV_OPERAND_CRJ_FLOAT :
2042       fields->f_CRj_float = value;
2043       break;
2044     case FRV_OPERAND_CRJ_INT :
2045       fields->f_CRj_int = value;
2046       break;
2047     case FRV_OPERAND_CRK :
2048       fields->f_CRk = value;
2049       break;
2050     case FRV_OPERAND_FCCI_1 :
2051       fields->f_FCCi_1 = value;
2052       break;
2053     case FRV_OPERAND_FCCI_2 :
2054       fields->f_FCCi_2 = value;
2055       break;
2056     case FRV_OPERAND_FCCI_3 :
2057       fields->f_FCCi_3 = value;
2058       break;
2059     case FRV_OPERAND_FCCK :
2060       fields->f_FCCk = value;
2061       break;
2062     case FRV_OPERAND_FRDOUBLEI :
2063       fields->f_FRi = value;
2064       break;
2065     case FRV_OPERAND_FRDOUBLEJ :
2066       fields->f_FRj = value;
2067       break;
2068     case FRV_OPERAND_FRDOUBLEK :
2069       fields->f_FRk = value;
2070       break;
2071     case FRV_OPERAND_FRI :
2072       fields->f_FRi = value;
2073       break;
2074     case FRV_OPERAND_FRINTI :
2075       fields->f_FRi = value;
2076       break;
2077     case FRV_OPERAND_FRINTIEVEN :
2078       fields->f_FRi = value;
2079       break;
2080     case FRV_OPERAND_FRINTJ :
2081       fields->f_FRj = value;
2082       break;
2083     case FRV_OPERAND_FRINTJEVEN :
2084       fields->f_FRj = value;
2085       break;
2086     case FRV_OPERAND_FRINTK :
2087       fields->f_FRk = value;
2088       break;
2089     case FRV_OPERAND_FRINTKEVEN :
2090       fields->f_FRk = value;
2091       break;
2092     case FRV_OPERAND_FRJ :
2093       fields->f_FRj = value;
2094       break;
2095     case FRV_OPERAND_FRK :
2096       fields->f_FRk = value;
2097       break;
2098     case FRV_OPERAND_FRKHI :
2099       fields->f_FRk = value;
2100       break;
2101     case FRV_OPERAND_FRKLO :
2102       fields->f_FRk = value;
2103       break;
2104     case FRV_OPERAND_GRDOUBLEK :
2105       fields->f_GRk = value;
2106       break;
2107     case FRV_OPERAND_GRI :
2108       fields->f_GRi = value;
2109       break;
2110     case FRV_OPERAND_GRJ :
2111       fields->f_GRj = value;
2112       break;
2113     case FRV_OPERAND_GRK :
2114       fields->f_GRk = value;
2115       break;
2116     case FRV_OPERAND_GRKHI :
2117       fields->f_GRk = value;
2118       break;
2119     case FRV_OPERAND_GRKLO :
2120       fields->f_GRk = value;
2121       break;
2122     case FRV_OPERAND_ICCI_1 :
2123       fields->f_ICCi_1 = value;
2124       break;
2125     case FRV_OPERAND_ICCI_2 :
2126       fields->f_ICCi_2 = value;
2127       break;
2128     case FRV_OPERAND_ICCI_3 :
2129       fields->f_ICCi_3 = value;
2130       break;
2131     case FRV_OPERAND_LI :
2132       fields->f_LI = value;
2133       break;
2134     case FRV_OPERAND_LRAD :
2135       fields->f_LRAD = value;
2136       break;
2137     case FRV_OPERAND_LRAE :
2138       fields->f_LRAE = value;
2139       break;
2140     case FRV_OPERAND_LRAS :
2141       fields->f_LRAS = value;
2142       break;
2143     case FRV_OPERAND_TLBPRL :
2144       fields->f_TLBPRL = value;
2145       break;
2146     case FRV_OPERAND_TLBPROPX :
2147       fields->f_TLBPRopx = value;
2148       break;
2149     case FRV_OPERAND_AE :
2150       fields->f_ae = value;
2151       break;
2152     case FRV_OPERAND_CALLANN :
2153       fields->f_reloc_ann = value;
2154       break;
2155     case FRV_OPERAND_CCOND :
2156       fields->f_ccond = value;
2157       break;
2158     case FRV_OPERAND_COND :
2159       fields->f_cond = value;
2160       break;
2161     case FRV_OPERAND_D12 :
2162       fields->f_d12 = value;
2163       break;
2164     case FRV_OPERAND_DEBUG :
2165       fields->f_debug = value;
2166       break;
2167     case FRV_OPERAND_EIR :
2168       fields->f_eir = value;
2169       break;
2170     case FRV_OPERAND_HINT :
2171       fields->f_hint = value;
2172       break;
2173     case FRV_OPERAND_HINT_NOT_TAKEN :
2174       fields->f_hint = value;
2175       break;
2176     case FRV_OPERAND_HINT_TAKEN :
2177       fields->f_hint = value;
2178       break;
2179     case FRV_OPERAND_LABEL16 :
2180       fields->f_label16 = value;
2181       break;
2182     case FRV_OPERAND_LABEL24 :
2183       fields->f_label24 = value;
2184       break;
2185     case FRV_OPERAND_LDANN :
2186       fields->f_reloc_ann = value;
2187       break;
2188     case FRV_OPERAND_LDDANN :
2189       fields->f_reloc_ann = value;
2190       break;
2191     case FRV_OPERAND_LOCK :
2192       fields->f_lock = value;
2193       break;
2194     case FRV_OPERAND_PACK :
2195       fields->f_pack = value;
2196       break;
2197     case FRV_OPERAND_S10 :
2198       fields->f_s10 = value;
2199       break;
2200     case FRV_OPERAND_S12 :
2201       fields->f_d12 = value;
2202       break;
2203     case FRV_OPERAND_S16 :
2204       fields->f_s16 = value;
2205       break;
2206     case FRV_OPERAND_S5 :
2207       fields->f_s5 = value;
2208       break;
2209     case FRV_OPERAND_S6 :
2210       fields->f_s6 = value;
2211       break;
2212     case FRV_OPERAND_S6_1 :
2213       fields->f_s6_1 = value;
2214       break;
2215     case FRV_OPERAND_SLO16 :
2216       fields->f_s16 = value;
2217       break;
2218     case FRV_OPERAND_SPR :
2219       fields->f_spr = value;
2220       break;
2221     case FRV_OPERAND_U12 :
2222       fields->f_u12 = value;
2223       break;
2224     case FRV_OPERAND_U16 :
2225       fields->f_u16 = value;
2226       break;
2227     case FRV_OPERAND_U6 :
2228       fields->f_u6 = value;
2229       break;
2230     case FRV_OPERAND_UHI16 :
2231       fields->f_u16 = value;
2232       break;
2233     case FRV_OPERAND_ULO16 :
2234       fields->f_u16 = value;
2235       break;
2236
2237     default :
2238       /* xgettext:c-format */
2239       fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
2240                        opindex);
2241       abort ();
2242   }
2243 }
2244
2245 /* Function to call before using the instruction builder tables.  */
2246
2247 void
2248 frv_cgen_init_ibld_table (CGEN_CPU_DESC cd)
2249 {
2250   cd->insert_handlers = & frv_cgen_insert_handlers[0];
2251   cd->extract_handlers = & frv_cgen_extract_handlers[0];
2252
2253   cd->insert_operand = frv_cgen_insert_operand;
2254   cd->extract_operand = frv_cgen_extract_operand;
2255
2256   cd->get_int_operand = frv_cgen_get_int_operand;
2257   cd->set_int_operand = frv_cgen_set_int_operand;
2258   cd->get_vma_operand = frv_cgen_get_vma_operand;
2259   cd->set_vma_operand = frv_cgen_set_vma_operand;
2260 }