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