1 /* Instruction building/extraction support for mt. -*- C -*-
3 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
4 - the resultant file is machine generated, cgen-ibld.in isn't
6 Copyright (C) 1996-2016 Free Software Foundation, Inc.
8 This file is part of libopcodes.
10 This library is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3, or (at your option)
15 It is distributed in the hope that it will be useful, but WITHOUT
16 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
17 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
18 License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software Foundation, Inc.,
22 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA. */
24 /* ??? Eventually more and more of this stuff can go to cpu-independent files.
35 #include "cgen/basic-modes.h"
37 #include "safe-ctype.h"
40 #define min(a,b) ((a) < (b) ? (a) : (b))
42 #define max(a,b) ((a) > (b) ? (a) : (b))
44 /* Used by the ifield rtx function. */
45 #define FLD(f) (fields->f)
47 static const char * insert_normal
48 (CGEN_CPU_DESC
, long, unsigned int, unsigned int, unsigned int,
49 unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR
);
50 static const char * insert_insn_normal
51 (CGEN_CPU_DESC
, const CGEN_INSN
*,
52 CGEN_FIELDS
*, CGEN_INSN_BYTES_PTR
, bfd_vma
);
53 static int extract_normal
54 (CGEN_CPU_DESC
, CGEN_EXTRACT_INFO
*, CGEN_INSN_INT
,
55 unsigned int, unsigned int, unsigned int, unsigned int,
56 unsigned int, unsigned int, bfd_vma
, long *);
57 static int extract_insn_normal
58 (CGEN_CPU_DESC
, const CGEN_INSN
*, CGEN_EXTRACT_INFO
*,
59 CGEN_INSN_INT
, CGEN_FIELDS
*, bfd_vma
);
61 static void put_insn_int_value
62 (CGEN_CPU_DESC
, CGEN_INSN_BYTES_PTR
, int, int, CGEN_INSN_INT
);
65 static CGEN_INLINE
void insert_1
66 (CGEN_CPU_DESC
, unsigned long, int, int, int, unsigned char *);
67 static CGEN_INLINE
int fill_cache
68 (CGEN_CPU_DESC
, CGEN_EXTRACT_INFO
*, int, int, bfd_vma
);
69 static CGEN_INLINE
long extract_1
70 (CGEN_CPU_DESC
, CGEN_EXTRACT_INFO
*, int, int, int, unsigned char *, bfd_vma
);
73 /* Operand insertion. */
77 /* Subroutine of insert_normal. */
79 static CGEN_INLINE
void
80 insert_1 (CGEN_CPU_DESC cd
,
90 x
= cgen_get_insn_value (cd
, bufp
, word_length
);
92 /* Written this way to avoid undefined behaviour. */
93 mask
= (((1L << (length
- 1)) - 1) << 1) | 1;
95 shift
= (start
+ 1) - length
;
97 shift
= (word_length
- (start
+ length
));
98 x
= (x
& ~(mask
<< shift
)) | ((value
& mask
) << shift
);
100 cgen_put_insn_value (cd
, bufp
, word_length
, (bfd_vma
) x
);
103 #endif /* ! CGEN_INT_INSN_P */
105 /* Default insertion routine.
107 ATTRS is a mask of the boolean attributes.
108 WORD_OFFSET is the offset in bits from the start of the insn of the value.
109 WORD_LENGTH is the length of the word in bits in which the value resides.
110 START is the starting bit number in the word, architecture origin.
111 LENGTH is the length of VALUE in bits.
112 TOTAL_LENGTH is the total length of the insn in bits.
114 The result is an error message or NULL if success. */
116 /* ??? This duplicates functionality with bfd's howto table and
117 bfd_install_relocation. */
118 /* ??? This doesn't handle bfd_vma's. Create another function when
122 insert_normal (CGEN_CPU_DESC cd
,
125 unsigned int word_offset
,
128 unsigned int word_length
,
129 unsigned int total_length
,
130 CGEN_INSN_BYTES_PTR buffer
)
132 static char errbuf
[100];
133 /* Written this way to avoid undefined behaviour. */
134 unsigned long mask
= (((1L << (length
- 1)) - 1) << 1) | 1;
136 /* If LENGTH is zero, this operand doesn't contribute to the value. */
140 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
143 /* For architectures with insns smaller than the base-insn-bitsize,
144 word_length may be too big. */
145 if (cd
->min_insn_bitsize
< cd
->base_insn_bitsize
)
148 && word_length
> total_length
)
149 word_length
= total_length
;
152 /* Ensure VALUE will fit. */
153 if (CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGN_OPT
))
155 long minval
= - (1L << (length
- 1));
156 unsigned long maxval
= mask
;
158 if ((value
> 0 && (unsigned long) value
> maxval
)
161 /* xgettext:c-format */
163 _("operand out of range (%ld not between %ld and %lu)"),
164 value
, minval
, maxval
);
168 else if (! CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGNED
))
170 unsigned long maxval
= mask
;
171 unsigned long val
= (unsigned long) value
;
173 /* For hosts with a word size > 32 check to see if value has been sign
174 extended beyond 32 bits. If so then ignore these higher sign bits
175 as the user is attempting to store a 32-bit signed value into an
176 unsigned 32-bit field which is allowed. */
177 if (sizeof (unsigned long) > 4 && ((value
>> 32) == -1))
182 /* xgettext:c-format */
184 _("operand out of range (0x%lx not between 0 and 0x%lx)"),
191 if (! cgen_signed_overflow_ok_p (cd
))
193 long minval
= - (1L << (length
- 1));
194 long maxval
= (1L << (length
- 1)) - 1;
196 if (value
< minval
|| value
> maxval
)
199 /* xgettext:c-format */
200 (errbuf
, _("operand out of range (%ld not between %ld and %ld)"),
201 value
, minval
, maxval
);
210 int shift_within_word
, shift_to_word
, shift
;
212 /* How to shift the value to BIT0 of the word. */
213 shift_to_word
= total_length
- (word_offset
+ word_length
);
215 /* How to shift the value to the field within the word. */
216 if (CGEN_INSN_LSB0_P
)
217 shift_within_word
= start
+ 1 - length
;
219 shift_within_word
= word_length
- start
- length
;
221 /* The total SHIFT, then mask in the value. */
222 shift
= shift_to_word
+ shift_within_word
;
223 *buffer
= (*buffer
& ~(mask
<< shift
)) | ((value
& mask
) << shift
);
226 #else /* ! CGEN_INT_INSN_P */
229 unsigned char *bufp
= (unsigned char *) buffer
+ word_offset
/ 8;
231 insert_1 (cd
, value
, start
, length
, word_length
, bufp
);
234 #endif /* ! CGEN_INT_INSN_P */
239 /* Default insn builder (insert handler).
240 The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
241 that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
242 recorded in host byte order, otherwise BUFFER is an array of bytes
243 and the value is recorded in target byte order).
244 The result is an error message or NULL if success. */
247 insert_insn_normal (CGEN_CPU_DESC cd
,
248 const CGEN_INSN
* insn
,
249 CGEN_FIELDS
* fields
,
250 CGEN_INSN_BYTES_PTR buffer
,
253 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
255 const CGEN_SYNTAX_CHAR_TYPE
* syn
;
257 CGEN_INIT_INSERT (cd
);
258 value
= CGEN_INSN_BASE_VALUE (insn
);
260 /* If we're recording insns as numbers (rather than a string of bytes),
261 target byte order handling is deferred until later. */
265 put_insn_int_value (cd
, buffer
, cd
->base_insn_bitsize
,
266 CGEN_FIELDS_BITSIZE (fields
), value
);
270 cgen_put_insn_value (cd
, buffer
, min ((unsigned) cd
->base_insn_bitsize
,
271 (unsigned) CGEN_FIELDS_BITSIZE (fields
)),
274 #endif /* ! CGEN_INT_INSN_P */
276 /* ??? It would be better to scan the format's fields.
277 Still need to be able to insert a value based on the operand though;
278 e.g. storing a branch displacement that got resolved later.
279 Needs more thought first. */
281 for (syn
= CGEN_SYNTAX_STRING (syntax
); * syn
; ++ syn
)
285 if (CGEN_SYNTAX_CHAR_P (* syn
))
288 errmsg
= (* cd
->insert_operand
) (cd
, CGEN_SYNTAX_FIELD (*syn
),
298 /* Cover function to store an insn value into an integral insn. Must go here
299 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
302 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
303 CGEN_INSN_BYTES_PTR buf
,
308 /* For architectures with insns smaller than the base-insn-bitsize,
309 length may be too big. */
310 if (length
> insn_length
)
314 int shift
= insn_length
- length
;
315 /* Written this way to avoid undefined behaviour. */
316 CGEN_INSN_INT mask
= (((1L << (length
- 1)) - 1) << 1) | 1;
318 *buf
= (*buf
& ~(mask
<< shift
)) | ((value
& mask
) << shift
);
323 /* Operand extraction. */
325 #if ! CGEN_INT_INSN_P
327 /* Subroutine of extract_normal.
328 Ensure sufficient bytes are cached in EX_INFO.
329 OFFSET is the offset in bytes from the start of the insn of the value.
330 BYTES is the length of the needed value.
331 Returns 1 for success, 0 for failure. */
333 static CGEN_INLINE
int
334 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
335 CGEN_EXTRACT_INFO
*ex_info
,
340 /* It's doubtful that the middle part has already been fetched so
341 we don't optimize that case. kiss. */
343 disassemble_info
*info
= (disassemble_info
*) ex_info
->dis_info
;
345 /* First do a quick check. */
346 mask
= (1 << bytes
) - 1;
347 if (((ex_info
->valid
>> offset
) & mask
) == mask
)
350 /* Search for the first byte we need to read. */
351 for (mask
= 1 << offset
; bytes
> 0; --bytes
, ++offset
, mask
<<= 1)
352 if (! (mask
& ex_info
->valid
))
360 status
= (*info
->read_memory_func
)
361 (pc
, ex_info
->insn_bytes
+ offset
, bytes
, info
);
365 (*info
->memory_error_func
) (status
, pc
, info
);
369 ex_info
->valid
|= ((1 << bytes
) - 1) << offset
;
375 /* Subroutine of extract_normal. */
377 static CGEN_INLINE
long
378 extract_1 (CGEN_CPU_DESC cd
,
379 CGEN_EXTRACT_INFO
*ex_info ATTRIBUTE_UNUSED
,
384 bfd_vma pc ATTRIBUTE_UNUSED
)
389 x
= cgen_get_insn_value (cd
, bufp
, word_length
);
391 if (CGEN_INSN_LSB0_P
)
392 shift
= (start
+ 1) - length
;
394 shift
= (word_length
- (start
+ length
));
398 #endif /* ! CGEN_INT_INSN_P */
400 /* Default extraction routine.
402 INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
403 or sometimes less for cases like the m32r where the base insn size is 32
404 but some insns are 16 bits.
405 ATTRS is a mask of the boolean attributes. We only need `SIGNED',
406 but for generality we take a bitmask of all of them.
407 WORD_OFFSET is the offset in bits from the start of the insn of the value.
408 WORD_LENGTH is the length of the word in bits in which the value resides.
409 START is the starting bit number in the word, architecture origin.
410 LENGTH is the length of VALUE in bits.
411 TOTAL_LENGTH is the total length of the insn in bits.
413 Returns 1 for success, 0 for failure. */
415 /* ??? The return code isn't properly used. wip. */
417 /* ??? This doesn't handle bfd_vma's. Create another function when
421 extract_normal (CGEN_CPU_DESC cd
,
422 #if ! CGEN_INT_INSN_P
423 CGEN_EXTRACT_INFO
*ex_info
,
425 CGEN_EXTRACT_INFO
*ex_info ATTRIBUTE_UNUSED
,
427 CGEN_INSN_INT insn_value
,
429 unsigned int word_offset
,
432 unsigned int word_length
,
433 unsigned int total_length
,
434 #if ! CGEN_INT_INSN_P
437 bfd_vma pc ATTRIBUTE_UNUSED
,
443 /* If LENGTH is zero, this operand doesn't contribute to the value
444 so give it a standard value of zero. */
451 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
454 /* For architectures with insns smaller than the insn-base-bitsize,
455 word_length may be too big. */
456 if (cd
->min_insn_bitsize
< cd
->base_insn_bitsize
)
458 if (word_offset
+ word_length
> total_length
)
459 word_length
= total_length
- word_offset
;
462 /* Does the value reside in INSN_VALUE, and at the right alignment? */
464 if (CGEN_INT_INSN_P
|| (word_offset
== 0 && word_length
== total_length
))
466 if (CGEN_INSN_LSB0_P
)
467 value
= insn_value
>> ((word_offset
+ start
+ 1) - length
);
469 value
= insn_value
>> (total_length
- ( word_offset
+ start
+ length
));
472 #if ! CGEN_INT_INSN_P
476 unsigned char *bufp
= ex_info
->insn_bytes
+ word_offset
/ 8;
478 if (word_length
> 8 * sizeof (CGEN_INSN_INT
))
481 if (fill_cache (cd
, ex_info
, word_offset
/ 8, word_length
/ 8, pc
) == 0)
484 value
= extract_1 (cd
, ex_info
, start
, length
, word_length
, bufp
, pc
);
487 #endif /* ! CGEN_INT_INSN_P */
489 /* Written this way to avoid undefined behaviour. */
490 mask
= (((1L << (length
- 1)) - 1) << 1) | 1;
494 if (CGEN_BOOL_ATTR (attrs
, CGEN_IFLD_SIGNED
)
495 && (value
& (1L << (length
- 1))))
503 /* Default insn extractor.
505 INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
506 The extracted fields are stored in FIELDS.
507 EX_INFO is used to handle reading variable length insns.
508 Return the length of the insn in bits, or 0 if no match,
509 or -1 if an error occurs fetching data (memory_error_func will have
513 extract_insn_normal (CGEN_CPU_DESC cd
,
514 const CGEN_INSN
*insn
,
515 CGEN_EXTRACT_INFO
*ex_info
,
516 CGEN_INSN_INT insn_value
,
520 const CGEN_SYNTAX
*syntax
= CGEN_INSN_SYNTAX (insn
);
521 const CGEN_SYNTAX_CHAR_TYPE
*syn
;
523 CGEN_FIELDS_BITSIZE (fields
) = CGEN_INSN_BITSIZE (insn
);
525 CGEN_INIT_EXTRACT (cd
);
527 for (syn
= CGEN_SYNTAX_STRING (syntax
); *syn
; ++syn
)
531 if (CGEN_SYNTAX_CHAR_P (*syn
))
534 length
= (* cd
->extract_operand
) (cd
, CGEN_SYNTAX_FIELD (*syn
),
535 ex_info
, insn_value
, fields
, pc
);
540 /* We recognized and successfully extracted this insn. */
541 return CGEN_INSN_BITSIZE (insn
);
544 /* Machine generated code added here. */
546 const char * mt_cgen_insert_operand
547 (CGEN_CPU_DESC
, int, CGEN_FIELDS
*, CGEN_INSN_BYTES_PTR
, bfd_vma
);
549 /* Main entry point for operand insertion.
551 This function is basically just a big switch statement. Earlier versions
552 used tables to look up the function to use, but
553 - if the table contains both assembler and disassembler functions then
554 the disassembler contains much of the assembler and vice-versa,
555 - there's a lot of inlining possibilities as things grow,
556 - using a switch statement avoids the function call overhead.
558 This function could be moved into `parse_insn_normal', but keeping it
559 separate makes clear the interface between `parse_insn_normal' and each of
560 the handlers. It's also needed by GAS to insert operands that couldn't be
561 resolved during parsing. */
564 mt_cgen_insert_operand (CGEN_CPU_DESC cd
,
566 CGEN_FIELDS
* fields
,
567 CGEN_INSN_BYTES_PTR buffer
,
568 bfd_vma pc ATTRIBUTE_UNUSED
)
570 const char * errmsg
= NULL
;
571 unsigned int total_length
= CGEN_FIELDS_BITSIZE (fields
);
575 case MT_OPERAND_A23
:
576 errmsg
= insert_normal (cd
, fields
->f_a23
, 0, 0, 23, 1, 32, total_length
, buffer
);
578 case MT_OPERAND_BALL
:
579 errmsg
= insert_normal (cd
, fields
->f_ball
, 0, 0, 19, 1, 32, total_length
, buffer
);
581 case MT_OPERAND_BALL2
:
582 errmsg
= insert_normal (cd
, fields
->f_ball2
, 0, 0, 15, 1, 32, total_length
, buffer
);
584 case MT_OPERAND_BANKADDR
:
585 errmsg
= insert_normal (cd
, fields
->f_bankaddr
, 0, 0, 25, 13, 32, total_length
, buffer
);
587 case MT_OPERAND_BRC
:
588 errmsg
= insert_normal (cd
, fields
->f_brc
, 0, 0, 18, 3, 32, total_length
, buffer
);
590 case MT_OPERAND_BRC2
:
591 errmsg
= insert_normal (cd
, fields
->f_brc2
, 0, 0, 14, 3, 32, total_length
, buffer
);
593 case MT_OPERAND_CB1INCR
:
594 errmsg
= insert_normal (cd
, fields
->f_cb1incr
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 19, 6, 32, total_length
, buffer
);
596 case MT_OPERAND_CB1SEL
:
597 errmsg
= insert_normal (cd
, fields
->f_cb1sel
, 0, 0, 25, 3, 32, total_length
, buffer
);
599 case MT_OPERAND_CB2INCR
:
600 errmsg
= insert_normal (cd
, fields
->f_cb2incr
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 13, 6, 32, total_length
, buffer
);
602 case MT_OPERAND_CB2SEL
:
603 errmsg
= insert_normal (cd
, fields
->f_cb2sel
, 0, 0, 22, 3, 32, total_length
, buffer
);
605 case MT_OPERAND_CBRB
:
606 errmsg
= insert_normal (cd
, fields
->f_cbrb
, 0, 0, 10, 1, 32, total_length
, buffer
);
608 case MT_OPERAND_CBS
:
609 errmsg
= insert_normal (cd
, fields
->f_cbs
, 0, 0, 19, 2, 32, total_length
, buffer
);
611 case MT_OPERAND_CBX
:
612 errmsg
= insert_normal (cd
, fields
->f_cbx
, 0, 0, 14, 3, 32, total_length
, buffer
);
614 case MT_OPERAND_CCB
:
615 errmsg
= insert_normal (cd
, fields
->f_ccb
, 0, 0, 11, 1, 32, total_length
, buffer
);
617 case MT_OPERAND_CDB
:
618 errmsg
= insert_normal (cd
, fields
->f_cdb
, 0, 0, 10, 1, 32, total_length
, buffer
);
620 case MT_OPERAND_CELL
:
621 errmsg
= insert_normal (cd
, fields
->f_cell
, 0, 0, 9, 3, 32, total_length
, buffer
);
623 case MT_OPERAND_COLNUM
:
624 errmsg
= insert_normal (cd
, fields
->f_colnum
, 0, 0, 18, 3, 32, total_length
, buffer
);
626 case MT_OPERAND_CONTNUM
:
627 errmsg
= insert_normal (cd
, fields
->f_contnum
, 0, 0, 8, 9, 32, total_length
, buffer
);
630 errmsg
= insert_normal (cd
, fields
->f_cr
, 0, 0, 22, 3, 32, total_length
, buffer
);
632 case MT_OPERAND_CTXDISP
:
633 errmsg
= insert_normal (cd
, fields
->f_ctxdisp
, 0, 0, 5, 6, 32, total_length
, buffer
);
635 case MT_OPERAND_DUP
:
636 errmsg
= insert_normal (cd
, fields
->f_dup
, 0, 0, 6, 1, 32, total_length
, buffer
);
638 case MT_OPERAND_FBDISP
:
639 errmsg
= insert_normal (cd
, fields
->f_fbdisp
, 0, 0, 15, 6, 32, total_length
, buffer
);
641 case MT_OPERAND_FBINCR
:
642 errmsg
= insert_normal (cd
, fields
->f_fbincr
, 0, 0, 23, 4, 32, total_length
, buffer
);
644 case MT_OPERAND_FRDR
:
645 errmsg
= insert_normal (cd
, fields
->f_dr
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 19, 4, 32, total_length
, buffer
);
647 case MT_OPERAND_FRDRRR
:
648 errmsg
= insert_normal (cd
, fields
->f_drrr
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 15, 4, 32, total_length
, buffer
);
650 case MT_OPERAND_FRSR1
:
651 errmsg
= insert_normal (cd
, fields
->f_sr1
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 23, 4, 32, total_length
, buffer
);
653 case MT_OPERAND_FRSR2
:
654 errmsg
= insert_normal (cd
, fields
->f_sr2
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 19, 4, 32, total_length
, buffer
);
657 errmsg
= insert_normal (cd
, fields
->f_id
, 0, 0, 14, 1, 32, total_length
, buffer
);
659 case MT_OPERAND_IMM16
:
661 long value
= fields
->f_imm16s
;
662 value
= ((value
) + (0));
663 errmsg
= insert_normal (cd
, value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 15, 16, 32, total_length
, buffer
);
666 case MT_OPERAND_IMM16L
:
667 errmsg
= insert_normal (cd
, fields
->f_imm16l
, 0, 0, 23, 16, 32, total_length
, buffer
);
669 case MT_OPERAND_IMM16O
:
671 long value
= fields
->f_imm16s
;
672 value
= ((value
) + (0));
673 errmsg
= insert_normal (cd
, value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 15, 16, 32, total_length
, buffer
);
676 case MT_OPERAND_IMM16Z
:
677 errmsg
= insert_normal (cd
, fields
->f_imm16u
, 0, 0, 15, 16, 32, total_length
, buffer
);
679 case MT_OPERAND_INCAMT
:
680 errmsg
= insert_normal (cd
, fields
->f_incamt
, 0, 0, 19, 8, 32, total_length
, buffer
);
682 case MT_OPERAND_INCR
:
683 errmsg
= insert_normal (cd
, fields
->f_incr
, 0, 0, 17, 6, 32, total_length
, buffer
);
685 case MT_OPERAND_LENGTH
:
686 errmsg
= insert_normal (cd
, fields
->f_length
, 0, 0, 15, 3, 32, total_length
, buffer
);
688 case MT_OPERAND_LOOPSIZE
:
690 long value
= fields
->f_loopo
;
691 value
= ((USI
) (value
) >> (2));
692 errmsg
= insert_normal (cd
, value
, 0, 0, 7, 8, 32, total_length
, buffer
);
695 case MT_OPERAND_MASK
:
696 errmsg
= insert_normal (cd
, fields
->f_mask
, 0, 0, 25, 16, 32, total_length
, buffer
);
698 case MT_OPERAND_MASK1
:
699 errmsg
= insert_normal (cd
, fields
->f_mask1
, 0, 0, 22, 3, 32, total_length
, buffer
);
701 case MT_OPERAND_MODE
:
702 errmsg
= insert_normal (cd
, fields
->f_mode
, 0, 0, 25, 2, 32, total_length
, buffer
);
704 case MT_OPERAND_PERM
:
705 errmsg
= insert_normal (cd
, fields
->f_perm
, 0, 0, 25, 2, 32, total_length
, buffer
);
707 case MT_OPERAND_RBBC
:
708 errmsg
= insert_normal (cd
, fields
->f_rbbc
, 0, 0, 25, 2, 32, total_length
, buffer
);
711 errmsg
= insert_normal (cd
, fields
->f_rc
, 0, 0, 15, 1, 32, total_length
, buffer
);
713 case MT_OPERAND_RC1
:
714 errmsg
= insert_normal (cd
, fields
->f_rc1
, 0, 0, 11, 1, 32, total_length
, buffer
);
716 case MT_OPERAND_RC2
:
717 errmsg
= insert_normal (cd
, fields
->f_rc2
, 0, 0, 6, 1, 32, total_length
, buffer
);
719 case MT_OPERAND_RC3
:
720 errmsg
= insert_normal (cd
, fields
->f_rc3
, 0, 0, 7, 1, 32, total_length
, buffer
);
722 case MT_OPERAND_RCNUM
:
723 errmsg
= insert_normal (cd
, fields
->f_rcnum
, 0, 0, 14, 3, 32, total_length
, buffer
);
725 case MT_OPERAND_RDA
:
726 errmsg
= insert_normal (cd
, fields
->f_rda
, 0, 0, 25, 1, 32, total_length
, buffer
);
728 case MT_OPERAND_ROWNUM
:
729 errmsg
= insert_normal (cd
, fields
->f_rownum
, 0, 0, 14, 3, 32, total_length
, buffer
);
731 case MT_OPERAND_ROWNUM1
:
732 errmsg
= insert_normal (cd
, fields
->f_rownum1
, 0, 0, 12, 3, 32, total_length
, buffer
);
734 case MT_OPERAND_ROWNUM2
:
735 errmsg
= insert_normal (cd
, fields
->f_rownum2
, 0, 0, 9, 3, 32, total_length
, buffer
);
737 case MT_OPERAND_SIZE
:
738 errmsg
= insert_normal (cd
, fields
->f_size
, 0, 0, 13, 14, 32, total_length
, buffer
);
740 case MT_OPERAND_TYPE
:
741 errmsg
= insert_normal (cd
, fields
->f_type
, 0, 0, 21, 2, 32, total_length
, buffer
);
744 errmsg
= insert_normal (cd
, fields
->f_wr
, 0, 0, 24, 1, 32, total_length
, buffer
);
746 case MT_OPERAND_XMODE
:
747 errmsg
= insert_normal (cd
, fields
->f_xmode
, 0, 0, 23, 1, 32, total_length
, buffer
);
751 /* xgettext:c-format */
752 fprintf (stderr
, _("Unrecognized field %d while building insn.\n"),
760 int mt_cgen_extract_operand
761 (CGEN_CPU_DESC
, int, CGEN_EXTRACT_INFO
*, CGEN_INSN_INT
, CGEN_FIELDS
*, bfd_vma
);
763 /* Main entry point for operand extraction.
764 The result is <= 0 for error, >0 for success.
765 ??? Actual values aren't well defined right now.
767 This function is basically just a big switch statement. Earlier versions
768 used tables to look up the function to use, but
769 - if the table contains both assembler and disassembler functions then
770 the disassembler contains much of the assembler and vice-versa,
771 - there's a lot of inlining possibilities as things grow,
772 - using a switch statement avoids the function call overhead.
774 This function could be moved into `print_insn_normal', but keeping it
775 separate makes clear the interface between `print_insn_normal' and each of
779 mt_cgen_extract_operand (CGEN_CPU_DESC cd
,
781 CGEN_EXTRACT_INFO
*ex_info
,
782 CGEN_INSN_INT insn_value
,
783 CGEN_FIELDS
* fields
,
786 /* Assume success (for those operands that are nops). */
788 unsigned int total_length
= CGEN_FIELDS_BITSIZE (fields
);
792 case MT_OPERAND_A23
:
793 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 23, 1, 32, total_length
, pc
, & fields
->f_a23
);
795 case MT_OPERAND_BALL
:
796 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 19, 1, 32, total_length
, pc
, & fields
->f_ball
);
798 case MT_OPERAND_BALL2
:
799 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 15, 1, 32, total_length
, pc
, & fields
->f_ball2
);
801 case MT_OPERAND_BANKADDR
:
802 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 13, 32, total_length
, pc
, & fields
->f_bankaddr
);
804 case MT_OPERAND_BRC
:
805 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 18, 3, 32, total_length
, pc
, & fields
->f_brc
);
807 case MT_OPERAND_BRC2
:
808 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 14, 3, 32, total_length
, pc
, & fields
->f_brc2
);
810 case MT_OPERAND_CB1INCR
:
811 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 19, 6, 32, total_length
, pc
, & fields
->f_cb1incr
);
813 case MT_OPERAND_CB1SEL
:
814 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 3, 32, total_length
, pc
, & fields
->f_cb1sel
);
816 case MT_OPERAND_CB2INCR
:
817 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 13, 6, 32, total_length
, pc
, & fields
->f_cb2incr
);
819 case MT_OPERAND_CB2SEL
:
820 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 22, 3, 32, total_length
, pc
, & fields
->f_cb2sel
);
822 case MT_OPERAND_CBRB
:
823 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 10, 1, 32, total_length
, pc
, & fields
->f_cbrb
);
825 case MT_OPERAND_CBS
:
826 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 19, 2, 32, total_length
, pc
, & fields
->f_cbs
);
828 case MT_OPERAND_CBX
:
829 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 14, 3, 32, total_length
, pc
, & fields
->f_cbx
);
831 case MT_OPERAND_CCB
:
832 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 11, 1, 32, total_length
, pc
, & fields
->f_ccb
);
834 case MT_OPERAND_CDB
:
835 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 10, 1, 32, total_length
, pc
, & fields
->f_cdb
);
837 case MT_OPERAND_CELL
:
838 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 9, 3, 32, total_length
, pc
, & fields
->f_cell
);
840 case MT_OPERAND_COLNUM
:
841 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 18, 3, 32, total_length
, pc
, & fields
->f_colnum
);
843 case MT_OPERAND_CONTNUM
:
844 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 8, 9, 32, total_length
, pc
, & fields
->f_contnum
);
847 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 22, 3, 32, total_length
, pc
, & fields
->f_cr
);
849 case MT_OPERAND_CTXDISP
:
850 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 5, 6, 32, total_length
, pc
, & fields
->f_ctxdisp
);
852 case MT_OPERAND_DUP
:
853 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 6, 1, 32, total_length
, pc
, & fields
->f_dup
);
855 case MT_OPERAND_FBDISP
:
856 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 15, 6, 32, total_length
, pc
, & fields
->f_fbdisp
);
858 case MT_OPERAND_FBINCR
:
859 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 23, 4, 32, total_length
, pc
, & fields
->f_fbincr
);
861 case MT_OPERAND_FRDR
:
862 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 19, 4, 32, total_length
, pc
, & fields
->f_dr
);
864 case MT_OPERAND_FRDRRR
:
865 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 15, 4, 32, total_length
, pc
, & fields
->f_drrr
);
867 case MT_OPERAND_FRSR1
:
868 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 23, 4, 32, total_length
, pc
, & fields
->f_sr1
);
870 case MT_OPERAND_FRSR2
:
871 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_ABS_ADDR
), 0, 19, 4, 32, total_length
, pc
, & fields
->f_sr2
);
874 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 14, 1, 32, total_length
, pc
, & fields
->f_id
);
876 case MT_OPERAND_IMM16
:
879 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 15, 16, 32, total_length
, pc
, & value
);
880 value
= ((value
) + (0));
881 fields
->f_imm16s
= value
;
884 case MT_OPERAND_IMM16L
:
885 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 23, 16, 32, total_length
, pc
, & fields
->f_imm16l
);
887 case MT_OPERAND_IMM16O
:
890 length
= extract_normal (cd
, ex_info
, insn_value
, 0|(1<<CGEN_IFLD_SIGNED
), 0, 15, 16, 32, total_length
, pc
, & value
);
891 value
= ((value
) + (0));
892 fields
->f_imm16s
= value
;
895 case MT_OPERAND_IMM16Z
:
896 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 15, 16, 32, total_length
, pc
, & fields
->f_imm16u
);
898 case MT_OPERAND_INCAMT
:
899 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 19, 8, 32, total_length
, pc
, & fields
->f_incamt
);
901 case MT_OPERAND_INCR
:
902 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 17, 6, 32, total_length
, pc
, & fields
->f_incr
);
904 case MT_OPERAND_LENGTH
:
905 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 15, 3, 32, total_length
, pc
, & fields
->f_length
);
907 case MT_OPERAND_LOOPSIZE
:
910 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 7, 8, 32, total_length
, pc
, & value
);
911 value
= ((((value
) << (2))) + (8));
912 fields
->f_loopo
= value
;
915 case MT_OPERAND_MASK
:
916 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 16, 32, total_length
, pc
, & fields
->f_mask
);
918 case MT_OPERAND_MASK1
:
919 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 22, 3, 32, total_length
, pc
, & fields
->f_mask1
);
921 case MT_OPERAND_MODE
:
922 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 2, 32, total_length
, pc
, & fields
->f_mode
);
924 case MT_OPERAND_PERM
:
925 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 2, 32, total_length
, pc
, & fields
->f_perm
);
927 case MT_OPERAND_RBBC
:
928 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 2, 32, total_length
, pc
, & fields
->f_rbbc
);
931 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 15, 1, 32, total_length
, pc
, & fields
->f_rc
);
933 case MT_OPERAND_RC1
:
934 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 11, 1, 32, total_length
, pc
, & fields
->f_rc1
);
936 case MT_OPERAND_RC2
:
937 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 6, 1, 32, total_length
, pc
, & fields
->f_rc2
);
939 case MT_OPERAND_RC3
:
940 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 7, 1, 32, total_length
, pc
, & fields
->f_rc3
);
942 case MT_OPERAND_RCNUM
:
943 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 14, 3, 32, total_length
, pc
, & fields
->f_rcnum
);
945 case MT_OPERAND_RDA
:
946 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 25, 1, 32, total_length
, pc
, & fields
->f_rda
);
948 case MT_OPERAND_ROWNUM
:
949 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 14, 3, 32, total_length
, pc
, & fields
->f_rownum
);
951 case MT_OPERAND_ROWNUM1
:
952 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 12, 3, 32, total_length
, pc
, & fields
->f_rownum1
);
954 case MT_OPERAND_ROWNUM2
:
955 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 9, 3, 32, total_length
, pc
, & fields
->f_rownum2
);
957 case MT_OPERAND_SIZE
:
958 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 13, 14, 32, total_length
, pc
, & fields
->f_size
);
960 case MT_OPERAND_TYPE
:
961 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 21, 2, 32, total_length
, pc
, & fields
->f_type
);
964 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 24, 1, 32, total_length
, pc
, & fields
->f_wr
);
966 case MT_OPERAND_XMODE
:
967 length
= extract_normal (cd
, ex_info
, insn_value
, 0, 0, 23, 1, 32, total_length
, pc
, & fields
->f_xmode
);
971 /* xgettext:c-format */
972 fprintf (stderr
, _("Unrecognized field %d while decoding insn.\n"),
980 cgen_insert_fn
* const mt_cgen_insert_handlers
[] =
985 cgen_extract_fn
* const mt_cgen_extract_handlers
[] =
990 int mt_cgen_get_int_operand (CGEN_CPU_DESC
, int, const CGEN_FIELDS
*);
991 bfd_vma
mt_cgen_get_vma_operand (CGEN_CPU_DESC
, int, const CGEN_FIELDS
*);
993 /* Getting values from cgen_fields is handled by a collection of functions.
994 They are distinguished by the type of the VALUE argument they return.
995 TODO: floating point, inlining support, remove cases where result type
999 mt_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1001 const CGEN_FIELDS
* fields
)
1007 case MT_OPERAND_A23
:
1008 value
= fields
->f_a23
;
1010 case MT_OPERAND_BALL
:
1011 value
= fields
->f_ball
;
1013 case MT_OPERAND_BALL2
:
1014 value
= fields
->f_ball2
;
1016 case MT_OPERAND_BANKADDR
:
1017 value
= fields
->f_bankaddr
;
1019 case MT_OPERAND_BRC
:
1020 value
= fields
->f_brc
;
1022 case MT_OPERAND_BRC2
:
1023 value
= fields
->f_brc2
;
1025 case MT_OPERAND_CB1INCR
:
1026 value
= fields
->f_cb1incr
;
1028 case MT_OPERAND_CB1SEL
:
1029 value
= fields
->f_cb1sel
;
1031 case MT_OPERAND_CB2INCR
:
1032 value
= fields
->f_cb2incr
;
1034 case MT_OPERAND_CB2SEL
:
1035 value
= fields
->f_cb2sel
;
1037 case MT_OPERAND_CBRB
:
1038 value
= fields
->f_cbrb
;
1040 case MT_OPERAND_CBS
:
1041 value
= fields
->f_cbs
;
1043 case MT_OPERAND_CBX
:
1044 value
= fields
->f_cbx
;
1046 case MT_OPERAND_CCB
:
1047 value
= fields
->f_ccb
;
1049 case MT_OPERAND_CDB
:
1050 value
= fields
->f_cdb
;
1052 case MT_OPERAND_CELL
:
1053 value
= fields
->f_cell
;
1055 case MT_OPERAND_COLNUM
:
1056 value
= fields
->f_colnum
;
1058 case MT_OPERAND_CONTNUM
:
1059 value
= fields
->f_contnum
;
1061 case MT_OPERAND_CR
:
1062 value
= fields
->f_cr
;
1064 case MT_OPERAND_CTXDISP
:
1065 value
= fields
->f_ctxdisp
;
1067 case MT_OPERAND_DUP
:
1068 value
= fields
->f_dup
;
1070 case MT_OPERAND_FBDISP
:
1071 value
= fields
->f_fbdisp
;
1073 case MT_OPERAND_FBINCR
:
1074 value
= fields
->f_fbincr
;
1076 case MT_OPERAND_FRDR
:
1077 value
= fields
->f_dr
;
1079 case MT_OPERAND_FRDRRR
:
1080 value
= fields
->f_drrr
;
1082 case MT_OPERAND_FRSR1
:
1083 value
= fields
->f_sr1
;
1085 case MT_OPERAND_FRSR2
:
1086 value
= fields
->f_sr2
;
1088 case MT_OPERAND_ID
:
1089 value
= fields
->f_id
;
1091 case MT_OPERAND_IMM16
:
1092 value
= fields
->f_imm16s
;
1094 case MT_OPERAND_IMM16L
:
1095 value
= fields
->f_imm16l
;
1097 case MT_OPERAND_IMM16O
:
1098 value
= fields
->f_imm16s
;
1100 case MT_OPERAND_IMM16Z
:
1101 value
= fields
->f_imm16u
;
1103 case MT_OPERAND_INCAMT
:
1104 value
= fields
->f_incamt
;
1106 case MT_OPERAND_INCR
:
1107 value
= fields
->f_incr
;
1109 case MT_OPERAND_LENGTH
:
1110 value
= fields
->f_length
;
1112 case MT_OPERAND_LOOPSIZE
:
1113 value
= fields
->f_loopo
;
1115 case MT_OPERAND_MASK
:
1116 value
= fields
->f_mask
;
1118 case MT_OPERAND_MASK1
:
1119 value
= fields
->f_mask1
;
1121 case MT_OPERAND_MODE
:
1122 value
= fields
->f_mode
;
1124 case MT_OPERAND_PERM
:
1125 value
= fields
->f_perm
;
1127 case MT_OPERAND_RBBC
:
1128 value
= fields
->f_rbbc
;
1130 case MT_OPERAND_RC
:
1131 value
= fields
->f_rc
;
1133 case MT_OPERAND_RC1
:
1134 value
= fields
->f_rc1
;
1136 case MT_OPERAND_RC2
:
1137 value
= fields
->f_rc2
;
1139 case MT_OPERAND_RC3
:
1140 value
= fields
->f_rc3
;
1142 case MT_OPERAND_RCNUM
:
1143 value
= fields
->f_rcnum
;
1145 case MT_OPERAND_RDA
:
1146 value
= fields
->f_rda
;
1148 case MT_OPERAND_ROWNUM
:
1149 value
= fields
->f_rownum
;
1151 case MT_OPERAND_ROWNUM1
:
1152 value
= fields
->f_rownum1
;
1154 case MT_OPERAND_ROWNUM2
:
1155 value
= fields
->f_rownum2
;
1157 case MT_OPERAND_SIZE
:
1158 value
= fields
->f_size
;
1160 case MT_OPERAND_TYPE
:
1161 value
= fields
->f_type
;
1163 case MT_OPERAND_WR
:
1164 value
= fields
->f_wr
;
1166 case MT_OPERAND_XMODE
:
1167 value
= fields
->f_xmode
;
1171 /* xgettext:c-format */
1172 fprintf (stderr
, _("Unrecognized field %d while getting int operand.\n"),
1181 mt_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1183 const CGEN_FIELDS
* fields
)
1189 case MT_OPERAND_A23
:
1190 value
= fields
->f_a23
;
1192 case MT_OPERAND_BALL
:
1193 value
= fields
->f_ball
;
1195 case MT_OPERAND_BALL2
:
1196 value
= fields
->f_ball2
;
1198 case MT_OPERAND_BANKADDR
:
1199 value
= fields
->f_bankaddr
;
1201 case MT_OPERAND_BRC
:
1202 value
= fields
->f_brc
;
1204 case MT_OPERAND_BRC2
:
1205 value
= fields
->f_brc2
;
1207 case MT_OPERAND_CB1INCR
:
1208 value
= fields
->f_cb1incr
;
1210 case MT_OPERAND_CB1SEL
:
1211 value
= fields
->f_cb1sel
;
1213 case MT_OPERAND_CB2INCR
:
1214 value
= fields
->f_cb2incr
;
1216 case MT_OPERAND_CB2SEL
:
1217 value
= fields
->f_cb2sel
;
1219 case MT_OPERAND_CBRB
:
1220 value
= fields
->f_cbrb
;
1222 case MT_OPERAND_CBS
:
1223 value
= fields
->f_cbs
;
1225 case MT_OPERAND_CBX
:
1226 value
= fields
->f_cbx
;
1228 case MT_OPERAND_CCB
:
1229 value
= fields
->f_ccb
;
1231 case MT_OPERAND_CDB
:
1232 value
= fields
->f_cdb
;
1234 case MT_OPERAND_CELL
:
1235 value
= fields
->f_cell
;
1237 case MT_OPERAND_COLNUM
:
1238 value
= fields
->f_colnum
;
1240 case MT_OPERAND_CONTNUM
:
1241 value
= fields
->f_contnum
;
1243 case MT_OPERAND_CR
:
1244 value
= fields
->f_cr
;
1246 case MT_OPERAND_CTXDISP
:
1247 value
= fields
->f_ctxdisp
;
1249 case MT_OPERAND_DUP
:
1250 value
= fields
->f_dup
;
1252 case MT_OPERAND_FBDISP
:
1253 value
= fields
->f_fbdisp
;
1255 case MT_OPERAND_FBINCR
:
1256 value
= fields
->f_fbincr
;
1258 case MT_OPERAND_FRDR
:
1259 value
= fields
->f_dr
;
1261 case MT_OPERAND_FRDRRR
:
1262 value
= fields
->f_drrr
;
1264 case MT_OPERAND_FRSR1
:
1265 value
= fields
->f_sr1
;
1267 case MT_OPERAND_FRSR2
:
1268 value
= fields
->f_sr2
;
1270 case MT_OPERAND_ID
:
1271 value
= fields
->f_id
;
1273 case MT_OPERAND_IMM16
:
1274 value
= fields
->f_imm16s
;
1276 case MT_OPERAND_IMM16L
:
1277 value
= fields
->f_imm16l
;
1279 case MT_OPERAND_IMM16O
:
1280 value
= fields
->f_imm16s
;
1282 case MT_OPERAND_IMM16Z
:
1283 value
= fields
->f_imm16u
;
1285 case MT_OPERAND_INCAMT
:
1286 value
= fields
->f_incamt
;
1288 case MT_OPERAND_INCR
:
1289 value
= fields
->f_incr
;
1291 case MT_OPERAND_LENGTH
:
1292 value
= fields
->f_length
;
1294 case MT_OPERAND_LOOPSIZE
:
1295 value
= fields
->f_loopo
;
1297 case MT_OPERAND_MASK
:
1298 value
= fields
->f_mask
;
1300 case MT_OPERAND_MASK1
:
1301 value
= fields
->f_mask1
;
1303 case MT_OPERAND_MODE
:
1304 value
= fields
->f_mode
;
1306 case MT_OPERAND_PERM
:
1307 value
= fields
->f_perm
;
1309 case MT_OPERAND_RBBC
:
1310 value
= fields
->f_rbbc
;
1312 case MT_OPERAND_RC
:
1313 value
= fields
->f_rc
;
1315 case MT_OPERAND_RC1
:
1316 value
= fields
->f_rc1
;
1318 case MT_OPERAND_RC2
:
1319 value
= fields
->f_rc2
;
1321 case MT_OPERAND_RC3
:
1322 value
= fields
->f_rc3
;
1324 case MT_OPERAND_RCNUM
:
1325 value
= fields
->f_rcnum
;
1327 case MT_OPERAND_RDA
:
1328 value
= fields
->f_rda
;
1330 case MT_OPERAND_ROWNUM
:
1331 value
= fields
->f_rownum
;
1333 case MT_OPERAND_ROWNUM1
:
1334 value
= fields
->f_rownum1
;
1336 case MT_OPERAND_ROWNUM2
:
1337 value
= fields
->f_rownum2
;
1339 case MT_OPERAND_SIZE
:
1340 value
= fields
->f_size
;
1342 case MT_OPERAND_TYPE
:
1343 value
= fields
->f_type
;
1345 case MT_OPERAND_WR
:
1346 value
= fields
->f_wr
;
1348 case MT_OPERAND_XMODE
:
1349 value
= fields
->f_xmode
;
1353 /* xgettext:c-format */
1354 fprintf (stderr
, _("Unrecognized field %d while getting vma operand.\n"),
1362 void mt_cgen_set_int_operand (CGEN_CPU_DESC
, int, CGEN_FIELDS
*, int);
1363 void mt_cgen_set_vma_operand (CGEN_CPU_DESC
, int, CGEN_FIELDS
*, bfd_vma
);
1365 /* Stuffing values in cgen_fields is handled by a collection of functions.
1366 They are distinguished by the type of the VALUE argument they accept.
1367 TODO: floating point, inlining support, remove cases where argument type
1371 mt_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1373 CGEN_FIELDS
* fields
,
1378 case MT_OPERAND_A23
:
1379 fields
->f_a23
= value
;
1381 case MT_OPERAND_BALL
:
1382 fields
->f_ball
= value
;
1384 case MT_OPERAND_BALL2
:
1385 fields
->f_ball2
= value
;
1387 case MT_OPERAND_BANKADDR
:
1388 fields
->f_bankaddr
= value
;
1390 case MT_OPERAND_BRC
:
1391 fields
->f_brc
= value
;
1393 case MT_OPERAND_BRC2
:
1394 fields
->f_brc2
= value
;
1396 case MT_OPERAND_CB1INCR
:
1397 fields
->f_cb1incr
= value
;
1399 case MT_OPERAND_CB1SEL
:
1400 fields
->f_cb1sel
= value
;
1402 case MT_OPERAND_CB2INCR
:
1403 fields
->f_cb2incr
= value
;
1405 case MT_OPERAND_CB2SEL
:
1406 fields
->f_cb2sel
= value
;
1408 case MT_OPERAND_CBRB
:
1409 fields
->f_cbrb
= value
;
1411 case MT_OPERAND_CBS
:
1412 fields
->f_cbs
= value
;
1414 case MT_OPERAND_CBX
:
1415 fields
->f_cbx
= value
;
1417 case MT_OPERAND_CCB
:
1418 fields
->f_ccb
= value
;
1420 case MT_OPERAND_CDB
:
1421 fields
->f_cdb
= value
;
1423 case MT_OPERAND_CELL
:
1424 fields
->f_cell
= value
;
1426 case MT_OPERAND_COLNUM
:
1427 fields
->f_colnum
= value
;
1429 case MT_OPERAND_CONTNUM
:
1430 fields
->f_contnum
= value
;
1432 case MT_OPERAND_CR
:
1433 fields
->f_cr
= value
;
1435 case MT_OPERAND_CTXDISP
:
1436 fields
->f_ctxdisp
= value
;
1438 case MT_OPERAND_DUP
:
1439 fields
->f_dup
= value
;
1441 case MT_OPERAND_FBDISP
:
1442 fields
->f_fbdisp
= value
;
1444 case MT_OPERAND_FBINCR
:
1445 fields
->f_fbincr
= value
;
1447 case MT_OPERAND_FRDR
:
1448 fields
->f_dr
= value
;
1450 case MT_OPERAND_FRDRRR
:
1451 fields
->f_drrr
= value
;
1453 case MT_OPERAND_FRSR1
:
1454 fields
->f_sr1
= value
;
1456 case MT_OPERAND_FRSR2
:
1457 fields
->f_sr2
= value
;
1459 case MT_OPERAND_ID
:
1460 fields
->f_id
= value
;
1462 case MT_OPERAND_IMM16
:
1463 fields
->f_imm16s
= value
;
1465 case MT_OPERAND_IMM16L
:
1466 fields
->f_imm16l
= value
;
1468 case MT_OPERAND_IMM16O
:
1469 fields
->f_imm16s
= value
;
1471 case MT_OPERAND_IMM16Z
:
1472 fields
->f_imm16u
= value
;
1474 case MT_OPERAND_INCAMT
:
1475 fields
->f_incamt
= value
;
1477 case MT_OPERAND_INCR
:
1478 fields
->f_incr
= value
;
1480 case MT_OPERAND_LENGTH
:
1481 fields
->f_length
= value
;
1483 case MT_OPERAND_LOOPSIZE
:
1484 fields
->f_loopo
= value
;
1486 case MT_OPERAND_MASK
:
1487 fields
->f_mask
= value
;
1489 case MT_OPERAND_MASK1
:
1490 fields
->f_mask1
= value
;
1492 case MT_OPERAND_MODE
:
1493 fields
->f_mode
= value
;
1495 case MT_OPERAND_PERM
:
1496 fields
->f_perm
= value
;
1498 case MT_OPERAND_RBBC
:
1499 fields
->f_rbbc
= value
;
1501 case MT_OPERAND_RC
:
1502 fields
->f_rc
= value
;
1504 case MT_OPERAND_RC1
:
1505 fields
->f_rc1
= value
;
1507 case MT_OPERAND_RC2
:
1508 fields
->f_rc2
= value
;
1510 case MT_OPERAND_RC3
:
1511 fields
->f_rc3
= value
;
1513 case MT_OPERAND_RCNUM
:
1514 fields
->f_rcnum
= value
;
1516 case MT_OPERAND_RDA
:
1517 fields
->f_rda
= value
;
1519 case MT_OPERAND_ROWNUM
:
1520 fields
->f_rownum
= value
;
1522 case MT_OPERAND_ROWNUM1
:
1523 fields
->f_rownum1
= value
;
1525 case MT_OPERAND_ROWNUM2
:
1526 fields
->f_rownum2
= value
;
1528 case MT_OPERAND_SIZE
:
1529 fields
->f_size
= value
;
1531 case MT_OPERAND_TYPE
:
1532 fields
->f_type
= value
;
1534 case MT_OPERAND_WR
:
1535 fields
->f_wr
= value
;
1537 case MT_OPERAND_XMODE
:
1538 fields
->f_xmode
= value
;
1542 /* xgettext:c-format */
1543 fprintf (stderr
, _("Unrecognized field %d while setting int operand.\n"),
1550 mt_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED
,
1552 CGEN_FIELDS
* fields
,
1557 case MT_OPERAND_A23
:
1558 fields
->f_a23
= value
;
1560 case MT_OPERAND_BALL
:
1561 fields
->f_ball
= value
;
1563 case MT_OPERAND_BALL2
:
1564 fields
->f_ball2
= value
;
1566 case MT_OPERAND_BANKADDR
:
1567 fields
->f_bankaddr
= value
;
1569 case MT_OPERAND_BRC
:
1570 fields
->f_brc
= value
;
1572 case MT_OPERAND_BRC2
:
1573 fields
->f_brc2
= value
;
1575 case MT_OPERAND_CB1INCR
:
1576 fields
->f_cb1incr
= value
;
1578 case MT_OPERAND_CB1SEL
:
1579 fields
->f_cb1sel
= value
;
1581 case MT_OPERAND_CB2INCR
:
1582 fields
->f_cb2incr
= value
;
1584 case MT_OPERAND_CB2SEL
:
1585 fields
->f_cb2sel
= value
;
1587 case MT_OPERAND_CBRB
:
1588 fields
->f_cbrb
= value
;
1590 case MT_OPERAND_CBS
:
1591 fields
->f_cbs
= value
;
1593 case MT_OPERAND_CBX
:
1594 fields
->f_cbx
= value
;
1596 case MT_OPERAND_CCB
:
1597 fields
->f_ccb
= value
;
1599 case MT_OPERAND_CDB
:
1600 fields
->f_cdb
= value
;
1602 case MT_OPERAND_CELL
:
1603 fields
->f_cell
= value
;
1605 case MT_OPERAND_COLNUM
:
1606 fields
->f_colnum
= value
;
1608 case MT_OPERAND_CONTNUM
:
1609 fields
->f_contnum
= value
;
1611 case MT_OPERAND_CR
:
1612 fields
->f_cr
= value
;
1614 case MT_OPERAND_CTXDISP
:
1615 fields
->f_ctxdisp
= value
;
1617 case MT_OPERAND_DUP
:
1618 fields
->f_dup
= value
;
1620 case MT_OPERAND_FBDISP
:
1621 fields
->f_fbdisp
= value
;
1623 case MT_OPERAND_FBINCR
:
1624 fields
->f_fbincr
= value
;
1626 case MT_OPERAND_FRDR
:
1627 fields
->f_dr
= value
;
1629 case MT_OPERAND_FRDRRR
:
1630 fields
->f_drrr
= value
;
1632 case MT_OPERAND_FRSR1
:
1633 fields
->f_sr1
= value
;
1635 case MT_OPERAND_FRSR2
:
1636 fields
->f_sr2
= value
;
1638 case MT_OPERAND_ID
:
1639 fields
->f_id
= value
;
1641 case MT_OPERAND_IMM16
:
1642 fields
->f_imm16s
= value
;
1644 case MT_OPERAND_IMM16L
:
1645 fields
->f_imm16l
= value
;
1647 case MT_OPERAND_IMM16O
:
1648 fields
->f_imm16s
= value
;
1650 case MT_OPERAND_IMM16Z
:
1651 fields
->f_imm16u
= value
;
1653 case MT_OPERAND_INCAMT
:
1654 fields
->f_incamt
= value
;
1656 case MT_OPERAND_INCR
:
1657 fields
->f_incr
= value
;
1659 case MT_OPERAND_LENGTH
:
1660 fields
->f_length
= value
;
1662 case MT_OPERAND_LOOPSIZE
:
1663 fields
->f_loopo
= value
;
1665 case MT_OPERAND_MASK
:
1666 fields
->f_mask
= value
;
1668 case MT_OPERAND_MASK1
:
1669 fields
->f_mask1
= value
;
1671 case MT_OPERAND_MODE
:
1672 fields
->f_mode
= value
;
1674 case MT_OPERAND_PERM
:
1675 fields
->f_perm
= value
;
1677 case MT_OPERAND_RBBC
:
1678 fields
->f_rbbc
= value
;
1680 case MT_OPERAND_RC
:
1681 fields
->f_rc
= value
;
1683 case MT_OPERAND_RC1
:
1684 fields
->f_rc1
= value
;
1686 case MT_OPERAND_RC2
:
1687 fields
->f_rc2
= value
;
1689 case MT_OPERAND_RC3
:
1690 fields
->f_rc3
= value
;
1692 case MT_OPERAND_RCNUM
:
1693 fields
->f_rcnum
= value
;
1695 case MT_OPERAND_RDA
:
1696 fields
->f_rda
= value
;
1698 case MT_OPERAND_ROWNUM
:
1699 fields
->f_rownum
= value
;
1701 case MT_OPERAND_ROWNUM1
:
1702 fields
->f_rownum1
= value
;
1704 case MT_OPERAND_ROWNUM2
:
1705 fields
->f_rownum2
= value
;
1707 case MT_OPERAND_SIZE
:
1708 fields
->f_size
= value
;
1710 case MT_OPERAND_TYPE
:
1711 fields
->f_type
= value
;
1713 case MT_OPERAND_WR
:
1714 fields
->f_wr
= value
;
1716 case MT_OPERAND_XMODE
:
1717 fields
->f_xmode
= value
;
1721 /* xgettext:c-format */
1722 fprintf (stderr
, _("Unrecognized field %d while setting vma operand.\n"),
1728 /* Function to call before using the instruction builder tables. */
1731 mt_cgen_init_ibld_table (CGEN_CPU_DESC cd
)
1733 cd
->insert_handlers
= & mt_cgen_insert_handlers
[0];
1734 cd
->extract_handlers
= & mt_cgen_extract_handlers
[0];
1736 cd
->insert_operand
= mt_cgen_insert_operand
;
1737 cd
->extract_operand
= mt_cgen_extract_operand
;
1739 cd
->get_int_operand
= mt_cgen_get_int_operand
;
1740 cd
->set_int_operand
= mt_cgen_set_int_operand
;
1741 cd
->get_vma_operand
= mt_cgen_get_vma_operand
;
1742 cd
->set_vma_operand
= mt_cgen_set_vma_operand
;