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