1 /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
2 /* Instruction building/extraction support for frv. -*- C -*-
4 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
5 - the resultant file is machine generated, cgen-ibld.in isn't
7 Copyright (C) 1996-2022 Free Software Foundation, Inc.
9 This file is part of libopcodes.
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)
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.
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. */
25 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
36 #include "cgen/basic-modes.h"
38 #include "safe-ctype.h"
41 #define min(a,b) ((a) < (b) ? (a) : (b))
43 #define max(a,b) ((a) > (b) ? (a) : (b))
45 /* Used by the ifield rtx function. */
46 #define FLD(f) (fields->f)
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
);
62 static void put_insn_int_value
63 (CGEN_CPU_DESC
, CGEN_INSN_BYTES_PTR
, int, int, CGEN_INSN_INT
);
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
);
74 /* Operand insertion. */
78 /* Subroutine of insert_normal. */
80 static CGEN_INLINE
void
81 insert_1 (CGEN_CPU_DESC cd
,
88 unsigned long x
, mask
;
91 x
= cgen_get_insn_value (cd
, bufp
, word_length
, cd
->endian
);
93 /* Written this way to avoid undefined behaviour. */
94 mask
= (1UL << (length
- 1) << 1) - 1;
96 shift
= (start
+ 1) - length
;
98 shift
= (word_length
- (start
+ length
));
99 x
= (x
& ~(mask
<< shift
)) | ((value
& mask
) << shift
);
101 cgen_put_insn_value (cd
, bufp
, word_length
, (bfd_vma
) x
, cd
->endian
);
104 #endif /* ! CGEN_INT_INSN_P */
106 /* Default insertion routine.
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.
115 The result is an error message or NULL if success. */
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
123 insert_normal (CGEN_CPU_DESC cd
,
126 unsigned int word_offset
,
129 unsigned int word_length
,
130 unsigned int total_length
,
131 CGEN_INSN_BYTES_PTR buffer
)
133 static char errbuf
[100];
136 /* If LENGTH is zero, this operand doesn't contribute to the value. */
140 /* Written this way to avoid undefined behaviour. */
141 mask
= (1UL << (length
- 1) << 1) - 1;
143 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
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
)
151 && word_length
> total_length
)
152 word_length
= total_length
;
155 /* Ensure VALUE will fit. */
156 if (CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGN_OPT
))
158 long minval
= - (1UL << (length
- 1));
159 unsigned long maxval
= mask
;
161 if ((value
> 0 && (unsigned long) value
> maxval
)
164 /* xgettext:c-format */
166 _("operand out of range (%ld not between %ld and %lu)"),
167 value
, minval
, maxval
);
171 else if (! CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGNED
))
173 unsigned long maxval
= mask
;
174 unsigned long val
= (unsigned long) value
;
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))
185 /* xgettext:c-format */
187 _("operand out of range (0x%lx not between 0 and 0x%lx)"),
194 if (! cgen_signed_overflow_ok_p (cd
))
196 long minval
= - (1UL << (length
- 1));
197 long maxval
= (1UL << (length
- 1)) - 1;
199 if (value
< minval
|| value
> maxval
)
202 /* xgettext:c-format */
203 (errbuf
, _("operand out of range (%ld not between %ld and %ld)"),
204 value
, minval
, maxval
);
213 int shift_within_word
, shift_to_word
, shift
;
215 /* How to shift the value to BIT0 of the word. */
216 shift_to_word
= total_length
- (word_offset
+ word_length
);
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
;
222 shift_within_word
= word_length
- start
- length
;
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
);
229 #else /* ! CGEN_INT_INSN_P */
232 unsigned char *bufp
= (unsigned char *) buffer
+ word_offset
/ 8;
234 insert_1 (cd
, value
, start
, length
, word_length
, bufp
);
237 #endif /* ! CGEN_INT_INSN_P */
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. */
250 insert_insn_normal (CGEN_CPU_DESC cd
,
251 const CGEN_INSN
* insn
,
252 CGEN_FIELDS
* fields
,
253 CGEN_INSN_BYTES_PTR buffer
,
256 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
258 const CGEN_SYNTAX_CHAR_TYPE
* syn
;
260 CGEN_INIT_INSERT (cd
);
261 value
= CGEN_INSN_BASE_VALUE (insn
);
263 /* If we're recording insns as numbers (rather than a string of bytes),
264 target byte order handling is deferred until later. */
268 put_insn_int_value (cd
, buffer
, cd
->base_insn_bitsize
,
269 CGEN_FIELDS_BITSIZE (fields
), value
);
273 cgen_put_insn_value (cd
, buffer
, min ((unsigned) cd
->base_insn_bitsize
,
274 (unsigned) CGEN_FIELDS_BITSIZE (fields
)),
275 value
, cd
->insn_endian
);
277 #endif /* ! CGEN_INT_INSN_P */
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. */
284 for (syn
= CGEN_SYNTAX_STRING (syntax
); * syn
; ++ syn
)
288 if (CGEN_SYNTAX_CHAR_P (* syn
))
291 errmsg
= (* cd
->insert_operand
) (cd
, CGEN_SYNTAX_FIELD (*syn
),
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. */
305 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
306 CGEN_INSN_BYTES_PTR buf
,
311 /* For architectures with insns smaller than the base-insn-bitsize,
312 length may be too big. */
313 if (length
> insn_length
)
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;
321 *buf
= (*buf
& ~(mask
<< shift
)) | ((value
& mask
) << shift
);
326 /* Operand extraction. */
328 #if ! CGEN_INT_INSN_P
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. */
336 static CGEN_INLINE
int
337 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
338 CGEN_EXTRACT_INFO
*ex_info
,
343 /* It's doubtful that the middle part has already been fetched so
344 we don't optimize that case. kiss. */
346 disassemble_info
*info
= (disassemble_info
*) ex_info
->dis_info
;
348 /* First do a quick check. */
349 mask
= (1 << bytes
) - 1;
350 if (((ex_info
->valid
>> offset
) & mask
) == mask
)
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
))
363 status
= (*info
->read_memory_func
)
364 (pc
, ex_info
->insn_bytes
+ offset
, bytes
, info
);
368 (*info
->memory_error_func
) (status
, pc
, info
);
372 ex_info
->valid
|= ((1 << bytes
) - 1) << offset
;
378 /* Subroutine of extract_normal. */
380 static CGEN_INLINE
long
381 extract_1 (CGEN_CPU_DESC cd
,
382 CGEN_EXTRACT_INFO
*ex_info ATTRIBUTE_UNUSED
,
387 bfd_vma pc ATTRIBUTE_UNUSED
)
392 x
= cgen_get_insn_value (cd
, bufp
, word_length
, cd
->endian
);
394 if (CGEN_INSN_LSB0_P
)
395 shift
= (start
+ 1) - length
;
397 shift
= (word_length
- (start
+ length
));
401 #endif /* ! CGEN_INT_INSN_P */
403 /* Default extraction routine.
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.
416 Returns 1 for success, 0 for failure. */
418 /* ??? The return code isn't properly used. wip. */
420 /* ??? This doesn't handle bfd_vma's. Create another function when
424 extract_normal (CGEN_CPU_DESC cd
,
425 #if ! CGEN_INT_INSN_P
426 CGEN_EXTRACT_INFO
*ex_info
,
428 CGEN_EXTRACT_INFO
*ex_info ATTRIBUTE_UNUSED
,
430 CGEN_INSN_INT insn_value
,
432 unsigned int word_offset
,
435 unsigned int word_length
,
436 unsigned int total_length
,
437 #if ! CGEN_INT_INSN_P
440 bfd_vma pc ATTRIBUTE_UNUSED
,
446 /* If LENGTH is zero, this operand doesn't contribute to the value
447 so give it a standard value of zero. */
454 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
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
)
461 if (word_offset
+ word_length
> total_length
)
462 word_length
= total_length
- word_offset
;
465 /* Does the value reside in INSN_VALUE, and at the right alignment? */
467 if (CGEN_INT_INSN_P
|| (word_offset
== 0 && word_length
== total_length
))
469 if (CGEN_INSN_LSB0_P
)
470 value
= insn_value
>> ((word_offset
+ start
+ 1) - length
);
472 value
= insn_value
>> (total_length
- ( word_offset
+ start
+ length
));
475 #if ! CGEN_INT_INSN_P
479 unsigned char *bufp
= ex_info
->insn_bytes
+ word_offset
/ 8;
481 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
484 if (fill_cache (cd
, ex_info
, word_offset
/ 8, word_length
/ 8, pc
) == 0)
490 value
= extract_1 (cd
, ex_info
, start
, length
, word_length
, bufp
, pc
);
493 #endif /* ! CGEN_INT_INSN_P */
495 /* Written this way to avoid undefined behaviour. */
496 mask
= (1UL << (length
- 1) << 1) - 1;
500 if (CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGNED
)
501 && (value
& (1UL << (length
- 1))))
509 /* Default insn extractor.
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
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
,
526 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
527 const CGEN_SYNTAX_CHAR_TYPE
*syn
;
529 CGEN_FIELDS_BITSIZE (fields
) = CGEN_INSN_BITSIZE (insn
);
531 CGEN_INIT_EXTRACT (cd
);
533 for (syn
= CGEN_SYNTAX_STRING (syntax
); *syn
; ++syn
)
537 if (CGEN_SYNTAX_CHAR_P (*syn
))
540 length
= (* cd
->extract_operand
) (cd
, CGEN_SYNTAX_FIELD (*syn
),
541 ex_info
, insn_value
, fields
, pc
);
546 /* We recognized and successfully extracted this insn. */
547 return CGEN_INSN_BITSIZE (insn
);
550 /* Machine generated code added here. */
552 const char * frv_cgen_insert_operand
553 (CGEN_CPU_DESC
, int, CGEN_FIELDS
*, CGEN_INSN_BYTES_PTR
, bfd_vma
);
555 /* Main entry point for operand insertion.
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.
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. */
570 frv_cgen_insert_operand (CGEN_CPU_DESC cd
,
572 CGEN_FIELDS
* fields
,
573 CGEN_INSN_BYTES_PTR buffer
,
574 bfd_vma pc ATTRIBUTE_UNUSED
)
576 const char * errmsg
= NULL
;
577 unsigned int total_length
= CGEN_FIELDS_BITSIZE (fields
);
581 case FRV_OPERAND_A0
:
582 errmsg
= insert_normal (cd
, fields
->f_A
, 0, 0, 17, 1, 32, total_length
, buffer
);
584 case FRV_OPERAND_A1
:
585 errmsg
= insert_normal (cd
, fields
->f_A
, 0, 0, 17, 1, 32, total_length
, buffer
);
587 case FRV_OPERAND_ACC40SI
:
588 errmsg
= insert_normal (cd
, fields
->f_ACC40Si
, 0, 0, 17, 6, 32, total_length
, buffer
);
590 case FRV_OPERAND_ACC40SK
:
591 errmsg
= insert_normal (cd
, fields
->f_ACC40Sk
, 0, 0, 30, 6, 32, total_length
, buffer
);
593 case FRV_OPERAND_ACC40UI
:
594 errmsg
= insert_normal (cd
, fields
->f_ACC40Ui
, 0, 0, 17, 6, 32, total_length
, buffer
);
596 case FRV_OPERAND_ACC40UK
:
597 errmsg
= insert_normal (cd
, fields
->f_ACC40Uk
, 0, 0, 30, 6, 32, total_length
, buffer
);
599 case FRV_OPERAND_ACCGI
:
600 errmsg
= insert_normal (cd
, fields
->f_ACCGi
, 0, 0, 17, 6, 32, total_length
, buffer
);
602 case FRV_OPERAND_ACCGK
:
603 errmsg
= insert_normal (cd
, fields
->f_ACCGk
, 0, 0, 30, 6, 32, total_length
, buffer
);
605 case FRV_OPERAND_CCI
:
606 errmsg
= insert_normal (cd
, fields
->f_CCi
, 0, 0, 11, 3, 32, total_length
, buffer
);
608 case FRV_OPERAND_CPRDOUBLEK
:
609 errmsg
= insert_normal (cd
, fields
->f_CPRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
611 case FRV_OPERAND_CPRI
:
612 errmsg
= insert_normal (cd
, fields
->f_CPRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
614 case FRV_OPERAND_CPRJ
:
615 errmsg
= insert_normal (cd
, fields
->f_CPRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
617 case FRV_OPERAND_CPRK
:
618 errmsg
= insert_normal (cd
, fields
->f_CPRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
620 case FRV_OPERAND_CRI
:
621 errmsg
= insert_normal (cd
, fields
->f_CRi
, 0, 0, 14, 3, 32, total_length
, buffer
);
623 case FRV_OPERAND_CRJ
:
624 errmsg
= insert_normal (cd
, fields
->f_CRj
, 0, 0, 2, 3, 32, total_length
, buffer
);
626 case FRV_OPERAND_CRJ_FLOAT
:
627 errmsg
= insert_normal (cd
, fields
->f_CRj_float
, 0, 0, 26, 2, 32, total_length
, buffer
);
629 case FRV_OPERAND_CRJ_INT
:
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
);
636 case FRV_OPERAND_CRK
:
637 errmsg
= insert_normal (cd
, fields
->f_CRk
, 0, 0, 27, 3, 32, total_length
, buffer
);
639 case FRV_OPERAND_FCCI_1
:
640 errmsg
= insert_normal (cd
, fields
->f_FCCi_1
, 0, 0, 11, 2, 32, total_length
, buffer
);
642 case FRV_OPERAND_FCCI_2
:
643 errmsg
= insert_normal (cd
, fields
->f_FCCi_2
, 0, 0, 26, 2, 32, total_length
, buffer
);
645 case FRV_OPERAND_FCCI_3
:
646 errmsg
= insert_normal (cd
, fields
->f_FCCi_3
, 0, 0, 1, 2, 32, total_length
, buffer
);
648 case FRV_OPERAND_FCCK
:
649 errmsg
= insert_normal (cd
, fields
->f_FCCk
, 0, 0, 26, 2, 32, total_length
, buffer
);
651 case FRV_OPERAND_FRDOUBLEI
:
652 errmsg
= insert_normal (cd
, fields
->f_FRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
654 case FRV_OPERAND_FRDOUBLEJ
:
655 errmsg
= insert_normal (cd
, fields
->f_FRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
657 case FRV_OPERAND_FRDOUBLEK
:
658 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
660 case FRV_OPERAND_FRI
:
661 errmsg
= insert_normal (cd
, fields
->f_FRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
663 case FRV_OPERAND_FRINTI
:
664 errmsg
= insert_normal (cd
, fields
->f_FRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
666 case FRV_OPERAND_FRINTIEVEN
:
667 errmsg
= insert_normal (cd
, fields
->f_FRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
669 case FRV_OPERAND_FRINTJ
:
670 errmsg
= insert_normal (cd
, fields
->f_FRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
672 case FRV_OPERAND_FRINTJEVEN
:
673 errmsg
= insert_normal (cd
, fields
->f_FRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
675 case FRV_OPERAND_FRINTK
:
676 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
678 case FRV_OPERAND_FRINTKEVEN
:
679 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
681 case FRV_OPERAND_FRJ
:
682 errmsg
= insert_normal (cd
, fields
->f_FRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
684 case FRV_OPERAND_FRK
:
685 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
687 case FRV_OPERAND_FRKHI
:
688 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
690 case FRV_OPERAND_FRKLO
:
691 errmsg
= insert_normal (cd
, fields
->f_FRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
693 case FRV_OPERAND_GRDOUBLEK
:
694 errmsg
= insert_normal (cd
, fields
->f_GRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
696 case FRV_OPERAND_GRI
:
697 errmsg
= insert_normal (cd
, fields
->f_GRi
, 0, 0, 17, 6, 32, total_length
, buffer
);
699 case FRV_OPERAND_GRJ
:
700 errmsg
= insert_normal (cd
, fields
->f_GRj
, 0, 0, 5, 6, 32, total_length
, buffer
);
702 case FRV_OPERAND_GRK
:
703 errmsg
= insert_normal (cd
, fields
->f_GRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
705 case FRV_OPERAND_GRKHI
:
706 errmsg
= insert_normal (cd
, fields
->f_GRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
708 case FRV_OPERAND_GRKLO
:
709 errmsg
= insert_normal (cd
, fields
->f_GRk
, 0, 0, 30, 6, 32, total_length
, buffer
);
711 case FRV_OPERAND_ICCI_1
:
712 errmsg
= insert_normal (cd
, fields
->f_ICCi_1
, 0, 0, 11, 2, 32, total_length
, buffer
);
714 case FRV_OPERAND_ICCI_2
:
715 errmsg
= insert_normal (cd
, fields
->f_ICCi_2
, 0, 0, 26, 2, 32, total_length
, buffer
);
717 case FRV_OPERAND_ICCI_3
:
718 errmsg
= insert_normal (cd
, fields
->f_ICCi_3
, 0, 0, 1, 2, 32, total_length
, buffer
);
720 case FRV_OPERAND_LI
:
721 errmsg
= insert_normal (cd
, fields
->f_LI
, 0, 0, 25, 1, 32, total_length
, buffer
);
723 case FRV_OPERAND_LRAD
:
724 errmsg
= insert_normal (cd
, fields
->f_LRAD
, 0, 0, 4, 1, 32, total_length
, buffer
);
726 case FRV_OPERAND_LRAE
:
727 errmsg
= insert_normal (cd
, fields
->f_LRAE
, 0, 0, 5, 1, 32, total_length
, buffer
);
729 case FRV_OPERAND_LRAS
:
730 errmsg
= insert_normal (cd
, fields
->f_LRAS
, 0, 0, 3, 1, 32, total_length
, buffer
);
732 case FRV_OPERAND_TLBPRL
:
733 errmsg
= insert_normal (cd
, fields
->f_TLBPRL
, 0, 0, 25, 1, 32, total_length
, buffer
);
735 case FRV_OPERAND_TLBPROPX
:
736 errmsg
= insert_normal (cd
, fields
->f_TLBPRopx
, 0, 0, 28, 3, 32, total_length
, buffer
);
738 case FRV_OPERAND_AE
:
739 errmsg
= insert_normal (cd
, fields
->f_ae
, 0, 0, 25, 1, 32, total_length
, buffer
);
741 case FRV_OPERAND_CALLANN
:
742 errmsg
= insert_normal (cd
, fields
->f_reloc_ann
, 0, 0, 0, 0, 32, total_length
, buffer
);
744 case FRV_OPERAND_CCOND
:
745 errmsg
= insert_normal (cd
, fields
->f_ccond
, 0, 0, 12, 1, 32, total_length
, buffer
);
747 case FRV_OPERAND_COND
:
748 errmsg
= insert_normal (cd
, fields
->f_cond
, 0, 0, 8, 1, 32, total_length
, buffer
);
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
);
753 case FRV_OPERAND_DEBUG
:
754 errmsg
= insert_normal (cd
, fields
->f_debug
, 0, 0, 25, 1, 32, total_length
, buffer
);
756 case FRV_OPERAND_EIR
:
757 errmsg
= insert_normal (cd
, fields
->f_eir
, 0, 0, 17, 6, 32, total_length
, buffer
);
759 case FRV_OPERAND_HINT
:
760 errmsg
= insert_normal (cd
, fields
->f_hint
, 0, 0, 17, 2, 32, total_length
, buffer
);
762 case FRV_OPERAND_HINT_NOT_TAKEN
:
763 errmsg
= insert_normal (cd
, fields
->f_hint
, 0, 0, 17, 2, 32, total_length
, buffer
);
765 case FRV_OPERAND_HINT_TAKEN
:
766 errmsg
= insert_normal (cd
, fields
->f_hint
, 0, 0, 17, 2, 32, total_length
, buffer
);
768 case FRV_OPERAND_LABEL16
:
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
);
775 case FRV_OPERAND_LABEL24
:
778 FLD (f_labelH6
) = ((SI
) (((FLD (f_label24
)) - (pc
))) >> (20));
779 FLD (f_labelL18
) = ((((UINT
) (((FLD (f_label24
)) - (pc
))) >> (2))) & (262143));
781 errmsg
= insert_normal (cd
, fields
->f_labelH6
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 30, 6, 32, total_length
, buffer
);
784 errmsg
= insert_normal (cd
, fields
->f_labelL18
, 0, 0, 17, 18, 32, total_length
, buffer
);
789 case FRV_OPERAND_LDANN
:
790 errmsg
= insert_normal (cd
, fields
->f_reloc_ann
, 0, 0, 0, 0, 32, total_length
, buffer
);
792 case FRV_OPERAND_LDDANN
:
793 errmsg
= insert_normal (cd
, fields
->f_reloc_ann
, 0, 0, 0, 0, 32, total_length
, buffer
);
795 case FRV_OPERAND_LOCK
:
796 errmsg
= insert_normal (cd
, fields
->f_lock
, 0, 0, 25, 1, 32, total_length
, buffer
);
798 case FRV_OPERAND_PACK
:
799 errmsg
= insert_normal (cd
, fields
->f_pack
, 0, 0, 31, 1, 32, total_length
, buffer
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
822 case FRV_OPERAND_SPR
:
825 FLD (f_spr_h
) = ((UINT
) (FLD (f_spr
)) >> (6));
826 FLD (f_spr_l
) = ((FLD (f_spr
)) & (63));
828 errmsg
= insert_normal (cd
, fields
->f_spr_h
, 0, 0, 30, 6, 32, total_length
, buffer
);
831 errmsg
= insert_normal (cd
, fields
->f_spr_l
, 0, 0, 17, 6, 32, total_length
, buffer
);
836 case FRV_OPERAND_U12
:
839 FLD (f_u12_h
) = ((SI
) (FLD (f_u12
)) >> (6));
840 FLD (f_u12_l
) = ((FLD (f_u12
)) & (63));
842 errmsg
= insert_normal (cd
, fields
->f_u12_h
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 17, 6, 32, total_length
, buffer
);
845 errmsg
= insert_normal (cd
, fields
->f_u12_l
, 0, 0, 5, 6, 32, total_length
, buffer
);
850 case FRV_OPERAND_U16
:
851 errmsg
= insert_normal (cd
, fields
->f_u16
, 0, 0, 15, 16, 32, total_length
, buffer
);
853 case FRV_OPERAND_U6
:
854 errmsg
= insert_normal (cd
, fields
->f_u6
, 0, 0, 5, 6, 32, total_length
, buffer
);
856 case FRV_OPERAND_UHI16
:
857 errmsg
= insert_normal (cd
, fields
->f_u16
, 0, 0, 15, 16, 32, total_length
, buffer
);
859 case FRV_OPERAND_ULO16
:
860 errmsg
= insert_normal (cd
, fields
->f_u16
, 0, 0, 15, 16, 32, total_length
, buffer
);
864 /* xgettext:c-format */
865 opcodes_error_handler
866 (_("internal error: unrecognized field %d while building insn"),
874 int frv_cgen_extract_operand
875 (CGEN_CPU_DESC
, int, CGEN_EXTRACT_INFO
*, CGEN_INSN_INT
, CGEN_FIELDS
*, bfd_vma
);
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.
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.
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
893 frv_cgen_extract_operand (CGEN_CPU_DESC cd
,
895 CGEN_EXTRACT_INFO
*ex_info
,
896 CGEN_INSN_INT insn_value
,
897 CGEN_FIELDS
* fields
,
900 /* Assume success (for those operands that are nops). */
902 unsigned int total_length
= CGEN_FIELDS_BITSIZE (fields
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
954 case FRV_OPERAND_CRJ_INT
:
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
;
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1094 case FRV_OPERAND_LABEL16
:
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
;
1102 case FRV_OPERAND_LABEL24
:
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;
1109 FLD (f_label24
) = ((((((((FLD (f_labelH6
)) * (((1) << (18))))) | (FLD (f_labelL18
)))) * (4))) + (pc
));
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
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
);
1146 case FRV_OPERAND_SPR
:
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;
1153 FLD (f_spr
) = ((((FLD (f_spr_h
)) << (6))) | (FLD (f_spr_l
)));
1157 case FRV_OPERAND_U12
:
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;
1164 FLD (f_u12
) = ((((FLD (f_u12_h
)) * (64))) | (FLD (f_u12_l
)));
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
);
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
);
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
);
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
);
1182 /* xgettext:c-format */
1183 opcodes_error_handler
1184 (_("internal error: unrecognized field %d while decoding insn"),
1192 cgen_insert_fn
* const frv_cgen_insert_handlers
[] =
1197 cgen_extract_fn
* const frv_cgen_extract_handlers
[] =
1199 extract_insn_normal
,
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
*);
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
1211 frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1213 const CGEN_FIELDS
* fields
)
1219 case FRV_OPERAND_A0
:
1220 value
= fields
->f_A
;
1222 case FRV_OPERAND_A1
:
1223 value
= fields
->f_A
;
1225 case FRV_OPERAND_ACC40SI
:
1226 value
= fields
->f_ACC40Si
;
1228 case FRV_OPERAND_ACC40SK
:
1229 value
= fields
->f_ACC40Sk
;
1231 case FRV_OPERAND_ACC40UI
:
1232 value
= fields
->f_ACC40Ui
;
1234 case FRV_OPERAND_ACC40UK
:
1235 value
= fields
->f_ACC40Uk
;
1237 case FRV_OPERAND_ACCGI
:
1238 value
= fields
->f_ACCGi
;
1240 case FRV_OPERAND_ACCGK
:
1241 value
= fields
->f_ACCGk
;
1243 case FRV_OPERAND_CCI
:
1244 value
= fields
->f_CCi
;
1246 case FRV_OPERAND_CPRDOUBLEK
:
1247 value
= fields
->f_CPRk
;
1249 case FRV_OPERAND_CPRI
:
1250 value
= fields
->f_CPRi
;
1252 case FRV_OPERAND_CPRJ
:
1253 value
= fields
->f_CPRj
;
1255 case FRV_OPERAND_CPRK
:
1256 value
= fields
->f_CPRk
;
1258 case FRV_OPERAND_CRI
:
1259 value
= fields
->f_CRi
;
1261 case FRV_OPERAND_CRJ
:
1262 value
= fields
->f_CRj
;
1264 case FRV_OPERAND_CRJ_FLOAT
:
1265 value
= fields
->f_CRj_float
;
1267 case FRV_OPERAND_CRJ_INT
:
1268 value
= fields
->f_CRj_int
;
1270 case FRV_OPERAND_CRK
:
1271 value
= fields
->f_CRk
;
1273 case FRV_OPERAND_FCCI_1
:
1274 value
= fields
->f_FCCi_1
;
1276 case FRV_OPERAND_FCCI_2
:
1277 value
= fields
->f_FCCi_2
;
1279 case FRV_OPERAND_FCCI_3
:
1280 value
= fields
->f_FCCi_3
;
1282 case FRV_OPERAND_FCCK
:
1283 value
= fields
->f_FCCk
;
1285 case FRV_OPERAND_FRDOUBLEI
:
1286 value
= fields
->f_FRi
;
1288 case FRV_OPERAND_FRDOUBLEJ
:
1289 value
= fields
->f_FRj
;
1291 case FRV_OPERAND_FRDOUBLEK
:
1292 value
= fields
->f_FRk
;
1294 case FRV_OPERAND_FRI
:
1295 value
= fields
->f_FRi
;
1297 case FRV_OPERAND_FRINTI
:
1298 value
= fields
->f_FRi
;
1300 case FRV_OPERAND_FRINTIEVEN
:
1301 value
= fields
->f_FRi
;
1303 case FRV_OPERAND_FRINTJ
:
1304 value
= fields
->f_FRj
;
1306 case FRV_OPERAND_FRINTJEVEN
:
1307 value
= fields
->f_FRj
;
1309 case FRV_OPERAND_FRINTK
:
1310 value
= fields
->f_FRk
;
1312 case FRV_OPERAND_FRINTKEVEN
:
1313 value
= fields
->f_FRk
;
1315 case FRV_OPERAND_FRJ
:
1316 value
= fields
->f_FRj
;
1318 case FRV_OPERAND_FRK
:
1319 value
= fields
->f_FRk
;
1321 case FRV_OPERAND_FRKHI
:
1322 value
= fields
->f_FRk
;
1324 case FRV_OPERAND_FRKLO
:
1325 value
= fields
->f_FRk
;
1327 case FRV_OPERAND_GRDOUBLEK
:
1328 value
= fields
->f_GRk
;
1330 case FRV_OPERAND_GRI
:
1331 value
= fields
->f_GRi
;
1333 case FRV_OPERAND_GRJ
:
1334 value
= fields
->f_GRj
;
1336 case FRV_OPERAND_GRK
:
1337 value
= fields
->f_GRk
;
1339 case FRV_OPERAND_GRKHI
:
1340 value
= fields
->f_GRk
;
1342 case FRV_OPERAND_GRKLO
:
1343 value
= fields
->f_GRk
;
1345 case FRV_OPERAND_ICCI_1
:
1346 value
= fields
->f_ICCi_1
;
1348 case FRV_OPERAND_ICCI_2
:
1349 value
= fields
->f_ICCi_2
;
1351 case FRV_OPERAND_ICCI_3
:
1352 value
= fields
->f_ICCi_3
;
1354 case FRV_OPERAND_LI
:
1355 value
= fields
->f_LI
;
1357 case FRV_OPERAND_LRAD
:
1358 value
= fields
->f_LRAD
;
1360 case FRV_OPERAND_LRAE
:
1361 value
= fields
->f_LRAE
;
1363 case FRV_OPERAND_LRAS
:
1364 value
= fields
->f_LRAS
;
1366 case FRV_OPERAND_TLBPRL
:
1367 value
= fields
->f_TLBPRL
;
1369 case FRV_OPERAND_TLBPROPX
:
1370 value
= fields
->f_TLBPRopx
;
1372 case FRV_OPERAND_AE
:
1373 value
= fields
->f_ae
;
1375 case FRV_OPERAND_CALLANN
:
1376 value
= fields
->f_reloc_ann
;
1378 case FRV_OPERAND_CCOND
:
1379 value
= fields
->f_ccond
;
1381 case FRV_OPERAND_COND
:
1382 value
= fields
->f_cond
;
1384 case FRV_OPERAND_D12
:
1385 value
= fields
->f_d12
;
1387 case FRV_OPERAND_DEBUG
:
1388 value
= fields
->f_debug
;
1390 case FRV_OPERAND_EIR
:
1391 value
= fields
->f_eir
;
1393 case FRV_OPERAND_HINT
:
1394 value
= fields
->f_hint
;
1396 case FRV_OPERAND_HINT_NOT_TAKEN
:
1397 value
= fields
->f_hint
;
1399 case FRV_OPERAND_HINT_TAKEN
:
1400 value
= fields
->f_hint
;
1402 case FRV_OPERAND_LABEL16
:
1403 value
= fields
->f_label16
;
1405 case FRV_OPERAND_LABEL24
:
1406 value
= fields
->f_label24
;
1408 case FRV_OPERAND_LDANN
:
1409 value
= fields
->f_reloc_ann
;
1411 case FRV_OPERAND_LDDANN
:
1412 value
= fields
->f_reloc_ann
;
1414 case FRV_OPERAND_LOCK
:
1415 value
= fields
->f_lock
;
1417 case FRV_OPERAND_PACK
:
1418 value
= fields
->f_pack
;
1420 case FRV_OPERAND_S10
:
1421 value
= fields
->f_s10
;
1423 case FRV_OPERAND_S12
:
1424 value
= fields
->f_d12
;
1426 case FRV_OPERAND_S16
:
1427 value
= fields
->f_s16
;
1429 case FRV_OPERAND_S5
:
1430 value
= fields
->f_s5
;
1432 case FRV_OPERAND_S6
:
1433 value
= fields
->f_s6
;
1435 case FRV_OPERAND_S6_1
:
1436 value
= fields
->f_s6_1
;
1438 case FRV_OPERAND_SLO16
:
1439 value
= fields
->f_s16
;
1441 case FRV_OPERAND_SPR
:
1442 value
= fields
->f_spr
;
1444 case FRV_OPERAND_U12
:
1445 value
= fields
->f_u12
;
1447 case FRV_OPERAND_U16
:
1448 value
= fields
->f_u16
;
1450 case FRV_OPERAND_U6
:
1451 value
= fields
->f_u6
;
1453 case FRV_OPERAND_UHI16
:
1454 value
= fields
->f_u16
;
1456 case FRV_OPERAND_ULO16
:
1457 value
= fields
->f_u16
;
1461 /* xgettext:c-format */
1462 opcodes_error_handler
1463 (_("internal error: unrecognized field %d while getting int operand"),
1472 frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1474 const CGEN_FIELDS
* fields
)
1480 case FRV_OPERAND_A0
:
1481 value
= fields
->f_A
;
1483 case FRV_OPERAND_A1
:
1484 value
= fields
->f_A
;
1486 case FRV_OPERAND_ACC40SI
:
1487 value
= fields
->f_ACC40Si
;
1489 case FRV_OPERAND_ACC40SK
:
1490 value
= fields
->f_ACC40Sk
;
1492 case FRV_OPERAND_ACC40UI
:
1493 value
= fields
->f_ACC40Ui
;
1495 case FRV_OPERAND_ACC40UK
:
1496 value
= fields
->f_ACC40Uk
;
1498 case FRV_OPERAND_ACCGI
:
1499 value
= fields
->f_ACCGi
;
1501 case FRV_OPERAND_ACCGK
:
1502 value
= fields
->f_ACCGk
;
1504 case FRV_OPERAND_CCI
:
1505 value
= fields
->f_CCi
;
1507 case FRV_OPERAND_CPRDOUBLEK
:
1508 value
= fields
->f_CPRk
;
1510 case FRV_OPERAND_CPRI
:
1511 value
= fields
->f_CPRi
;
1513 case FRV_OPERAND_CPRJ
:
1514 value
= fields
->f_CPRj
;
1516 case FRV_OPERAND_CPRK
:
1517 value
= fields
->f_CPRk
;
1519 case FRV_OPERAND_CRI
:
1520 value
= fields
->f_CRi
;
1522 case FRV_OPERAND_CRJ
:
1523 value
= fields
->f_CRj
;
1525 case FRV_OPERAND_CRJ_FLOAT
:
1526 value
= fields
->f_CRj_float
;
1528 case FRV_OPERAND_CRJ_INT
:
1529 value
= fields
->f_CRj_int
;
1531 case FRV_OPERAND_CRK
:
1532 value
= fields
->f_CRk
;
1534 case FRV_OPERAND_FCCI_1
:
1535 value
= fields
->f_FCCi_1
;
1537 case FRV_OPERAND_FCCI_2
:
1538 value
= fields
->f_FCCi_2
;
1540 case FRV_OPERAND_FCCI_3
:
1541 value
= fields
->f_FCCi_3
;
1543 case FRV_OPERAND_FCCK
:
1544 value
= fields
->f_FCCk
;
1546 case FRV_OPERAND_FRDOUBLEI
:
1547 value
= fields
->f_FRi
;
1549 case FRV_OPERAND_FRDOUBLEJ
:
1550 value
= fields
->f_FRj
;
1552 case FRV_OPERAND_FRDOUBLEK
:
1553 value
= fields
->f_FRk
;
1555 case FRV_OPERAND_FRI
:
1556 value
= fields
->f_FRi
;
1558 case FRV_OPERAND_FRINTI
:
1559 value
= fields
->f_FRi
;
1561 case FRV_OPERAND_FRINTIEVEN
:
1562 value
= fields
->f_FRi
;
1564 case FRV_OPERAND_FRINTJ
:
1565 value
= fields
->f_FRj
;
1567 case FRV_OPERAND_FRINTJEVEN
:
1568 value
= fields
->f_FRj
;
1570 case FRV_OPERAND_FRINTK
:
1571 value
= fields
->f_FRk
;
1573 case FRV_OPERAND_FRINTKEVEN
:
1574 value
= fields
->f_FRk
;
1576 case FRV_OPERAND_FRJ
:
1577 value
= fields
->f_FRj
;
1579 case FRV_OPERAND_FRK
:
1580 value
= fields
->f_FRk
;
1582 case FRV_OPERAND_FRKHI
:
1583 value
= fields
->f_FRk
;
1585 case FRV_OPERAND_FRKLO
:
1586 value
= fields
->f_FRk
;
1588 case FRV_OPERAND_GRDOUBLEK
:
1589 value
= fields
->f_GRk
;
1591 case FRV_OPERAND_GRI
:
1592 value
= fields
->f_GRi
;
1594 case FRV_OPERAND_GRJ
:
1595 value
= fields
->f_GRj
;
1597 case FRV_OPERAND_GRK
:
1598 value
= fields
->f_GRk
;
1600 case FRV_OPERAND_GRKHI
:
1601 value
= fields
->f_GRk
;
1603 case FRV_OPERAND_GRKLO
:
1604 value
= fields
->f_GRk
;
1606 case FRV_OPERAND_ICCI_1
:
1607 value
= fields
->f_ICCi_1
;
1609 case FRV_OPERAND_ICCI_2
:
1610 value
= fields
->f_ICCi_2
;
1612 case FRV_OPERAND_ICCI_3
:
1613 value
= fields
->f_ICCi_3
;
1615 case FRV_OPERAND_LI
:
1616 value
= fields
->f_LI
;
1618 case FRV_OPERAND_LRAD
:
1619 value
= fields
->f_LRAD
;
1621 case FRV_OPERAND_LRAE
:
1622 value
= fields
->f_LRAE
;
1624 case FRV_OPERAND_LRAS
:
1625 value
= fields
->f_LRAS
;
1627 case FRV_OPERAND_TLBPRL
:
1628 value
= fields
->f_TLBPRL
;
1630 case FRV_OPERAND_TLBPROPX
:
1631 value
= fields
->f_TLBPRopx
;
1633 case FRV_OPERAND_AE
:
1634 value
= fields
->f_ae
;
1636 case FRV_OPERAND_CALLANN
:
1637 value
= fields
->f_reloc_ann
;
1639 case FRV_OPERAND_CCOND
:
1640 value
= fields
->f_ccond
;
1642 case FRV_OPERAND_COND
:
1643 value
= fields
->f_cond
;
1645 case FRV_OPERAND_D12
:
1646 value
= fields
->f_d12
;
1648 case FRV_OPERAND_DEBUG
:
1649 value
= fields
->f_debug
;
1651 case FRV_OPERAND_EIR
:
1652 value
= fields
->f_eir
;
1654 case FRV_OPERAND_HINT
:
1655 value
= fields
->f_hint
;
1657 case FRV_OPERAND_HINT_NOT_TAKEN
:
1658 value
= fields
->f_hint
;
1660 case FRV_OPERAND_HINT_TAKEN
:
1661 value
= fields
->f_hint
;
1663 case FRV_OPERAND_LABEL16
:
1664 value
= fields
->f_label16
;
1666 case FRV_OPERAND_LABEL24
:
1667 value
= fields
->f_label24
;
1669 case FRV_OPERAND_LDANN
:
1670 value
= fields
->f_reloc_ann
;
1672 case FRV_OPERAND_LDDANN
:
1673 value
= fields
->f_reloc_ann
;
1675 case FRV_OPERAND_LOCK
:
1676 value
= fields
->f_lock
;
1678 case FRV_OPERAND_PACK
:
1679 value
= fields
->f_pack
;
1681 case FRV_OPERAND_S10
:
1682 value
= fields
->f_s10
;
1684 case FRV_OPERAND_S12
:
1685 value
= fields
->f_d12
;
1687 case FRV_OPERAND_S16
:
1688 value
= fields
->f_s16
;
1690 case FRV_OPERAND_S5
:
1691 value
= fields
->f_s5
;
1693 case FRV_OPERAND_S6
:
1694 value
= fields
->f_s6
;
1696 case FRV_OPERAND_S6_1
:
1697 value
= fields
->f_s6_1
;
1699 case FRV_OPERAND_SLO16
:
1700 value
= fields
->f_s16
;
1702 case FRV_OPERAND_SPR
:
1703 value
= fields
->f_spr
;
1705 case FRV_OPERAND_U12
:
1706 value
= fields
->f_u12
;
1708 case FRV_OPERAND_U16
:
1709 value
= fields
->f_u16
;
1711 case FRV_OPERAND_U6
:
1712 value
= fields
->f_u6
;
1714 case FRV_OPERAND_UHI16
:
1715 value
= fields
->f_u16
;
1717 case FRV_OPERAND_ULO16
:
1718 value
= fields
->f_u16
;
1722 /* xgettext:c-format */
1723 opcodes_error_handler
1724 (_("internal error: unrecognized field %d while getting vma operand"),
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
);
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
1741 frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1743 CGEN_FIELDS
* fields
,
1748 case FRV_OPERAND_A0
:
1749 fields
->f_A
= value
;
1751 case FRV_OPERAND_A1
:
1752 fields
->f_A
= value
;
1754 case FRV_OPERAND_ACC40SI
:
1755 fields
->f_ACC40Si
= value
;
1757 case FRV_OPERAND_ACC40SK
:
1758 fields
->f_ACC40Sk
= value
;
1760 case FRV_OPERAND_ACC40UI
:
1761 fields
->f_ACC40Ui
= value
;
1763 case FRV_OPERAND_ACC40UK
:
1764 fields
->f_ACC40Uk
= value
;
1766 case FRV_OPERAND_ACCGI
:
1767 fields
->f_ACCGi
= value
;
1769 case FRV_OPERAND_ACCGK
:
1770 fields
->f_ACCGk
= value
;
1772 case FRV_OPERAND_CCI
:
1773 fields
->f_CCi
= value
;
1775 case FRV_OPERAND_CPRDOUBLEK
:
1776 fields
->f_CPRk
= value
;
1778 case FRV_OPERAND_CPRI
:
1779 fields
->f_CPRi
= value
;
1781 case FRV_OPERAND_CPRJ
:
1782 fields
->f_CPRj
= value
;
1784 case FRV_OPERAND_CPRK
:
1785 fields
->f_CPRk
= value
;
1787 case FRV_OPERAND_CRI
:
1788 fields
->f_CRi
= value
;
1790 case FRV_OPERAND_CRJ
:
1791 fields
->f_CRj
= value
;
1793 case FRV_OPERAND_CRJ_FLOAT
:
1794 fields
->f_CRj_float
= value
;
1796 case FRV_OPERAND_CRJ_INT
:
1797 fields
->f_CRj_int
= value
;
1799 case FRV_OPERAND_CRK
:
1800 fields
->f_CRk
= value
;
1802 case FRV_OPERAND_FCCI_1
:
1803 fields
->f_FCCi_1
= value
;
1805 case FRV_OPERAND_FCCI_2
:
1806 fields
->f_FCCi_2
= value
;
1808 case FRV_OPERAND_FCCI_3
:
1809 fields
->f_FCCi_3
= value
;
1811 case FRV_OPERAND_FCCK
:
1812 fields
->f_FCCk
= value
;
1814 case FRV_OPERAND_FRDOUBLEI
:
1815 fields
->f_FRi
= value
;
1817 case FRV_OPERAND_FRDOUBLEJ
:
1818 fields
->f_FRj
= value
;
1820 case FRV_OPERAND_FRDOUBLEK
:
1821 fields
->f_FRk
= value
;
1823 case FRV_OPERAND_FRI
:
1824 fields
->f_FRi
= value
;
1826 case FRV_OPERAND_FRINTI
:
1827 fields
->f_FRi
= value
;
1829 case FRV_OPERAND_FRINTIEVEN
:
1830 fields
->f_FRi
= value
;
1832 case FRV_OPERAND_FRINTJ
:
1833 fields
->f_FRj
= value
;
1835 case FRV_OPERAND_FRINTJEVEN
:
1836 fields
->f_FRj
= value
;
1838 case FRV_OPERAND_FRINTK
:
1839 fields
->f_FRk
= value
;
1841 case FRV_OPERAND_FRINTKEVEN
:
1842 fields
->f_FRk
= value
;
1844 case FRV_OPERAND_FRJ
:
1845 fields
->f_FRj
= value
;
1847 case FRV_OPERAND_FRK
:
1848 fields
->f_FRk
= value
;
1850 case FRV_OPERAND_FRKHI
:
1851 fields
->f_FRk
= value
;
1853 case FRV_OPERAND_FRKLO
:
1854 fields
->f_FRk
= value
;
1856 case FRV_OPERAND_GRDOUBLEK
:
1857 fields
->f_GRk
= value
;
1859 case FRV_OPERAND_GRI
:
1860 fields
->f_GRi
= value
;
1862 case FRV_OPERAND_GRJ
:
1863 fields
->f_GRj
= value
;
1865 case FRV_OPERAND_GRK
:
1866 fields
->f_GRk
= value
;
1868 case FRV_OPERAND_GRKHI
:
1869 fields
->f_GRk
= value
;
1871 case FRV_OPERAND_GRKLO
:
1872 fields
->f_GRk
= value
;
1874 case FRV_OPERAND_ICCI_1
:
1875 fields
->f_ICCi_1
= value
;
1877 case FRV_OPERAND_ICCI_2
:
1878 fields
->f_ICCi_2
= value
;
1880 case FRV_OPERAND_ICCI_3
:
1881 fields
->f_ICCi_3
= value
;
1883 case FRV_OPERAND_LI
:
1884 fields
->f_LI
= value
;
1886 case FRV_OPERAND_LRAD
:
1887 fields
->f_LRAD
= value
;
1889 case FRV_OPERAND_LRAE
:
1890 fields
->f_LRAE
= value
;
1892 case FRV_OPERAND_LRAS
:
1893 fields
->f_LRAS
= value
;
1895 case FRV_OPERAND_TLBPRL
:
1896 fields
->f_TLBPRL
= value
;
1898 case FRV_OPERAND_TLBPROPX
:
1899 fields
->f_TLBPRopx
= value
;
1901 case FRV_OPERAND_AE
:
1902 fields
->f_ae
= value
;
1904 case FRV_OPERAND_CALLANN
:
1905 fields
->f_reloc_ann
= value
;
1907 case FRV_OPERAND_CCOND
:
1908 fields
->f_ccond
= value
;
1910 case FRV_OPERAND_COND
:
1911 fields
->f_cond
= value
;
1913 case FRV_OPERAND_D12
:
1914 fields
->f_d12
= value
;
1916 case FRV_OPERAND_DEBUG
:
1917 fields
->f_debug
= value
;
1919 case FRV_OPERAND_EIR
:
1920 fields
->f_eir
= value
;
1922 case FRV_OPERAND_HINT
:
1923 fields
->f_hint
= value
;
1925 case FRV_OPERAND_HINT_NOT_TAKEN
:
1926 fields
->f_hint
= value
;
1928 case FRV_OPERAND_HINT_TAKEN
:
1929 fields
->f_hint
= value
;
1931 case FRV_OPERAND_LABEL16
:
1932 fields
->f_label16
= value
;
1934 case FRV_OPERAND_LABEL24
:
1935 fields
->f_label24
= value
;
1937 case FRV_OPERAND_LDANN
:
1938 fields
->f_reloc_ann
= value
;
1940 case FRV_OPERAND_LDDANN
:
1941 fields
->f_reloc_ann
= value
;
1943 case FRV_OPERAND_LOCK
:
1944 fields
->f_lock
= value
;
1946 case FRV_OPERAND_PACK
:
1947 fields
->f_pack
= value
;
1949 case FRV_OPERAND_S10
:
1950 fields
->f_s10
= value
;
1952 case FRV_OPERAND_S12
:
1953 fields
->f_d12
= value
;
1955 case FRV_OPERAND_S16
:
1956 fields
->f_s16
= value
;
1958 case FRV_OPERAND_S5
:
1959 fields
->f_s5
= value
;
1961 case FRV_OPERAND_S6
:
1962 fields
->f_s6
= value
;
1964 case FRV_OPERAND_S6_1
:
1965 fields
->f_s6_1
= value
;
1967 case FRV_OPERAND_SLO16
:
1968 fields
->f_s16
= value
;
1970 case FRV_OPERAND_SPR
:
1971 fields
->f_spr
= value
;
1973 case FRV_OPERAND_U12
:
1974 fields
->f_u12
= value
;
1976 case FRV_OPERAND_U16
:
1977 fields
->f_u16
= value
;
1979 case FRV_OPERAND_U6
:
1980 fields
->f_u6
= value
;
1982 case FRV_OPERAND_UHI16
:
1983 fields
->f_u16
= value
;
1985 case FRV_OPERAND_ULO16
:
1986 fields
->f_u16
= value
;
1990 /* xgettext:c-format */
1991 opcodes_error_handler
1992 (_("internal error: unrecognized field %d while setting int operand"),
1999 frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
2001 CGEN_FIELDS
* fields
,
2006 case FRV_OPERAND_A0
:
2007 fields
->f_A
= value
;
2009 case FRV_OPERAND_A1
:
2010 fields
->f_A
= value
;
2012 case FRV_OPERAND_ACC40SI
:
2013 fields
->f_ACC40Si
= value
;
2015 case FRV_OPERAND_ACC40SK
:
2016 fields
->f_ACC40Sk
= value
;
2018 case FRV_OPERAND_ACC40UI
:
2019 fields
->f_ACC40Ui
= value
;
2021 case FRV_OPERAND_ACC40UK
:
2022 fields
->f_ACC40Uk
= value
;
2024 case FRV_OPERAND_ACCGI
:
2025 fields
->f_ACCGi
= value
;
2027 case FRV_OPERAND_ACCGK
:
2028 fields
->f_ACCGk
= value
;
2030 case FRV_OPERAND_CCI
:
2031 fields
->f_CCi
= value
;
2033 case FRV_OPERAND_CPRDOUBLEK
:
2034 fields
->f_CPRk
= value
;
2036 case FRV_OPERAND_CPRI
:
2037 fields
->f_CPRi
= value
;
2039 case FRV_OPERAND_CPRJ
:
2040 fields
->f_CPRj
= value
;
2042 case FRV_OPERAND_CPRK
:
2043 fields
->f_CPRk
= value
;
2045 case FRV_OPERAND_CRI
:
2046 fields
->f_CRi
= value
;
2048 case FRV_OPERAND_CRJ
:
2049 fields
->f_CRj
= value
;
2051 case FRV_OPERAND_CRJ_FLOAT
:
2052 fields
->f_CRj_float
= value
;
2054 case FRV_OPERAND_CRJ_INT
:
2055 fields
->f_CRj_int
= value
;
2057 case FRV_OPERAND_CRK
:
2058 fields
->f_CRk
= value
;
2060 case FRV_OPERAND_FCCI_1
:
2061 fields
->f_FCCi_1
= value
;
2063 case FRV_OPERAND_FCCI_2
:
2064 fields
->f_FCCi_2
= value
;
2066 case FRV_OPERAND_FCCI_3
:
2067 fields
->f_FCCi_3
= value
;
2069 case FRV_OPERAND_FCCK
:
2070 fields
->f_FCCk
= value
;
2072 case FRV_OPERAND_FRDOUBLEI
:
2073 fields
->f_FRi
= value
;
2075 case FRV_OPERAND_FRDOUBLEJ
:
2076 fields
->f_FRj
= value
;
2078 case FRV_OPERAND_FRDOUBLEK
:
2079 fields
->f_FRk
= value
;
2081 case FRV_OPERAND_FRI
:
2082 fields
->f_FRi
= value
;
2084 case FRV_OPERAND_FRINTI
:
2085 fields
->f_FRi
= value
;
2087 case FRV_OPERAND_FRINTIEVEN
:
2088 fields
->f_FRi
= value
;
2090 case FRV_OPERAND_FRINTJ
:
2091 fields
->f_FRj
= value
;
2093 case FRV_OPERAND_FRINTJEVEN
:
2094 fields
->f_FRj
= value
;
2096 case FRV_OPERAND_FRINTK
:
2097 fields
->f_FRk
= value
;
2099 case FRV_OPERAND_FRINTKEVEN
:
2100 fields
->f_FRk
= value
;
2102 case FRV_OPERAND_FRJ
:
2103 fields
->f_FRj
= value
;
2105 case FRV_OPERAND_FRK
:
2106 fields
->f_FRk
= value
;
2108 case FRV_OPERAND_FRKHI
:
2109 fields
->f_FRk
= value
;
2111 case FRV_OPERAND_FRKLO
:
2112 fields
->f_FRk
= value
;
2114 case FRV_OPERAND_GRDOUBLEK
:
2115 fields
->f_GRk
= value
;
2117 case FRV_OPERAND_GRI
:
2118 fields
->f_GRi
= value
;
2120 case FRV_OPERAND_GRJ
:
2121 fields
->f_GRj
= value
;
2123 case FRV_OPERAND_GRK
:
2124 fields
->f_GRk
= value
;
2126 case FRV_OPERAND_GRKHI
:
2127 fields
->f_GRk
= value
;
2129 case FRV_OPERAND_GRKLO
:
2130 fields
->f_GRk
= value
;
2132 case FRV_OPERAND_ICCI_1
:
2133 fields
->f_ICCi_1
= value
;
2135 case FRV_OPERAND_ICCI_2
:
2136 fields
->f_ICCi_2
= value
;
2138 case FRV_OPERAND_ICCI_3
:
2139 fields
->f_ICCi_3
= value
;
2141 case FRV_OPERAND_LI
:
2142 fields
->f_LI
= value
;
2144 case FRV_OPERAND_LRAD
:
2145 fields
->f_LRAD
= value
;
2147 case FRV_OPERAND_LRAE
:
2148 fields
->f_LRAE
= value
;
2150 case FRV_OPERAND_LRAS
:
2151 fields
->f_LRAS
= value
;
2153 case FRV_OPERAND_TLBPRL
:
2154 fields
->f_TLBPRL
= value
;
2156 case FRV_OPERAND_TLBPROPX
:
2157 fields
->f_TLBPRopx
= value
;
2159 case FRV_OPERAND_AE
:
2160 fields
->f_ae
= value
;
2162 case FRV_OPERAND_CALLANN
:
2163 fields
->f_reloc_ann
= value
;
2165 case FRV_OPERAND_CCOND
:
2166 fields
->f_ccond
= value
;
2168 case FRV_OPERAND_COND
:
2169 fields
->f_cond
= value
;
2171 case FRV_OPERAND_D12
:
2172 fields
->f_d12
= value
;
2174 case FRV_OPERAND_DEBUG
:
2175 fields
->f_debug
= value
;
2177 case FRV_OPERAND_EIR
:
2178 fields
->f_eir
= value
;
2180 case FRV_OPERAND_HINT
:
2181 fields
->f_hint
= value
;
2183 case FRV_OPERAND_HINT_NOT_TAKEN
:
2184 fields
->f_hint
= value
;
2186 case FRV_OPERAND_HINT_TAKEN
:
2187 fields
->f_hint
= value
;
2189 case FRV_OPERAND_LABEL16
:
2190 fields
->f_label16
= value
;
2192 case FRV_OPERAND_LABEL24
:
2193 fields
->f_label24
= value
;
2195 case FRV_OPERAND_LDANN
:
2196 fields
->f_reloc_ann
= value
;
2198 case FRV_OPERAND_LDDANN
:
2199 fields
->f_reloc_ann
= value
;
2201 case FRV_OPERAND_LOCK
:
2202 fields
->f_lock
= value
;
2204 case FRV_OPERAND_PACK
:
2205 fields
->f_pack
= value
;
2207 case FRV_OPERAND_S10
:
2208 fields
->f_s10
= value
;
2210 case FRV_OPERAND_S12
:
2211 fields
->f_d12
= value
;
2213 case FRV_OPERAND_S16
:
2214 fields
->f_s16
= value
;
2216 case FRV_OPERAND_S5
:
2217 fields
->f_s5
= value
;
2219 case FRV_OPERAND_S6
:
2220 fields
->f_s6
= value
;
2222 case FRV_OPERAND_S6_1
:
2223 fields
->f_s6_1
= value
;
2225 case FRV_OPERAND_SLO16
:
2226 fields
->f_s16
= value
;
2228 case FRV_OPERAND_SPR
:
2229 fields
->f_spr
= value
;
2231 case FRV_OPERAND_U12
:
2232 fields
->f_u12
= value
;
2234 case FRV_OPERAND_U16
:
2235 fields
->f_u16
= value
;
2237 case FRV_OPERAND_U6
:
2238 fields
->f_u6
= value
;
2240 case FRV_OPERAND_UHI16
:
2241 fields
->f_u16
= value
;
2243 case FRV_OPERAND_ULO16
:
2244 fields
->f_u16
= value
;
2248 /* xgettext:c-format */
2249 opcodes_error_handler
2250 (_("internal error: unrecognized field %d while setting vma operand"),
2256 /* Function to call before using the instruction builder tables. */
2259 frv_cgen_init_ibld_table (CGEN_CPU_DESC cd
)
2261 cd
->insert_handlers
= & frv_cgen_insert_handlers
[0];
2262 cd
->extract_handlers
= & frv_cgen_extract_handlers
[0];
2264 cd
->insert_operand
= frv_cgen_insert_operand
;
2265 cd
->extract_operand
= frv_cgen_extract_operand
;
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
;