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 1996, 1997, 1998, 1999, 2000, 2001, 2005, 2006, 2007,
7
2008, 2010 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,
91
x = cgen_get_insn_value (cd, bufp, word_length);
93
/* Written this way to avoid undefined behaviour. */
94
mask = (((1L << (length - 1)) - 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);
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];
134
/* Written this way to avoid undefined behaviour. */
135
unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
137
/* If LENGTH is zero, this operand doesn't contribute to the value. */
141
if (word_length > 8 * sizeof (CGEN_INSN_INT))
144
/* For architectures with insns smaller than the base-insn-bitsize,
145
word_length may be too big. */
146
if (cd->min_insn_bitsize < cd->base_insn_bitsize)
149
&& word_length > total_length)
150
word_length = total_length;
153
/* Ensure VALUE will fit. */
154
if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
156
long minval = - (1L << (length - 1));
157
unsigned long maxval = mask;
159
if ((value > 0 && (unsigned long) value > maxval)
162
/* xgettext:c-format */
164
_("operand out of range (%ld not between %ld and %lu)"),
165
value, minval, maxval);
169
else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
171
unsigned long maxval = mask;
172
unsigned long val = (unsigned long) value;
174
/* For hosts with a word size > 32 check to see if value has been sign
175
extended beyond 32 bits. If so then ignore these higher sign bits
176
as the user is attempting to store a 32-bit signed value into an
177
unsigned 32-bit field which is allowed. */
178
if (sizeof (unsigned long) > 4 && ((value >> 32) == -1))
183
/* xgettext:c-format */
185
_("operand out of range (0x%lx not between 0 and 0x%lx)"),
192
if (! cgen_signed_overflow_ok_p (cd))
194
long minval = - (1L << (length - 1));
195
long maxval = (1L << (length - 1)) - 1;
197
if (value < minval || value > maxval)
200
/* xgettext:c-format */
201
(errbuf, _("operand out of range (%ld not between %ld and %ld)"),
202
value, minval, maxval);
213
if (CGEN_INSN_LSB0_P)
214
shift = (word_offset + start + 1) - length;
216
shift = total_length - (word_offset + start + length);
217
*buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
220
#else /* ! CGEN_INT_INSN_P */
223
unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
225
insert_1 (cd, value, start, length, word_length, bufp);
228
#endif /* ! CGEN_INT_INSN_P */
233
/* Default insn builder (insert handler).
234
The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
235
that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
236
recorded in host byte order, otherwise BUFFER is an array of bytes
237
and the value is recorded in target byte order).
238
The result is an error message or NULL if success. */
241
insert_insn_normal (CGEN_CPU_DESC cd,
242
const CGEN_INSN * insn,
243
CGEN_FIELDS * fields,
244
CGEN_INSN_BYTES_PTR buffer,
247
const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
249
const CGEN_SYNTAX_CHAR_TYPE * syn;
251
CGEN_INIT_INSERT (cd);
252
value = CGEN_INSN_BASE_VALUE (insn);
254
/* If we're recording insns as numbers (rather than a string of bytes),
255
target byte order handling is deferred until later. */
259
put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
260
CGEN_FIELDS_BITSIZE (fields), value);
264
cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
265
(unsigned) CGEN_FIELDS_BITSIZE (fields)),
268
#endif /* ! CGEN_INT_INSN_P */
270
/* ??? It would be better to scan the format's fields.
271
Still need to be able to insert a value based on the operand though;
272
e.g. storing a branch displacement that got resolved later.
273
Needs more thought first. */
275
for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
279
if (CGEN_SYNTAX_CHAR_P (* syn))
282
errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
292
/* Cover function to store an insn value into an integral insn. Must go here
293
because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
296
put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
297
CGEN_INSN_BYTES_PTR buf,
302
/* For architectures with insns smaller than the base-insn-bitsize,
303
length may be too big. */
304
if (length > insn_length)
308
int shift = insn_length - length;
309
/* Written this way to avoid undefined behaviour. */
310
CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
312
*buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
317
/* Operand extraction. */
319
#if ! CGEN_INT_INSN_P
321
/* Subroutine of extract_normal.
322
Ensure sufficient bytes are cached in EX_INFO.
323
OFFSET is the offset in bytes from the start of the insn of the value.
324
BYTES is the length of the needed value.
325
Returns 1 for success, 0 for failure. */
327
static CGEN_INLINE int
328
fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
329
CGEN_EXTRACT_INFO *ex_info,
334
/* It's doubtful that the middle part has already been fetched so
335
we don't optimize that case. kiss. */
337
disassemble_info *info = (disassemble_info *) ex_info->dis_info;
339
/* First do a quick check. */
340
mask = (1 << bytes) - 1;
341
if (((ex_info->valid >> offset) & mask) == mask)
344
/* Search for the first byte we need to read. */
345
for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
346
if (! (mask & ex_info->valid))
354
status = (*info->read_memory_func)
355
(pc, ex_info->insn_bytes + offset, bytes, info);
359
(*info->memory_error_func) (status, pc, info);
363
ex_info->valid |= ((1 << bytes) - 1) << offset;
369
/* Subroutine of extract_normal. */
371
static CGEN_INLINE long
372
extract_1 (CGEN_CPU_DESC cd,
373
CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
378
bfd_vma pc ATTRIBUTE_UNUSED)
383
x = cgen_get_insn_value (cd, bufp, word_length);
385
if (CGEN_INSN_LSB0_P)
386
shift = (start + 1) - length;
388
shift = (word_length - (start + length));
392
#endif /* ! CGEN_INT_INSN_P */
394
/* Default extraction routine.
396
INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
397
or sometimes less for cases like the m32r where the base insn size is 32
398
but some insns are 16 bits.
399
ATTRS is a mask of the boolean attributes. We only need `SIGNED',
400
but for generality we take a bitmask of all of them.
401
WORD_OFFSET is the offset in bits from the start of the insn of the value.
402
WORD_LENGTH is the length of the word in bits in which the value resides.
403
START is the starting bit number in the word, architecture origin.
404
LENGTH is the length of VALUE in bits.
405
TOTAL_LENGTH is the total length of the insn in bits.
407
Returns 1 for success, 0 for failure. */
409
/* ??? The return code isn't properly used. wip. */
411
/* ??? This doesn't handle bfd_vma's. Create another function when
415
extract_normal (CGEN_CPU_DESC cd,
416
#if ! CGEN_INT_INSN_P
417
CGEN_EXTRACT_INFO *ex_info,
419
CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
421
CGEN_INSN_INT insn_value,
423
unsigned int word_offset,
426
unsigned int word_length,
427
unsigned int total_length,
428
#if ! CGEN_INT_INSN_P
431
bfd_vma pc ATTRIBUTE_UNUSED,
437
/* If LENGTH is zero, this operand doesn't contribute to the value
438
so give it a standard value of zero. */
445
if (word_length > 8 * sizeof (CGEN_INSN_INT))
448
/* For architectures with insns smaller than the insn-base-bitsize,
449
word_length may be too big. */
450
if (cd->min_insn_bitsize < cd->base_insn_bitsize)
452
if (word_offset + word_length > total_length)
453
word_length = total_length - word_offset;
456
/* Does the value reside in INSN_VALUE, and at the right alignment? */
458
if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
460
if (CGEN_INSN_LSB0_P)
461
value = insn_value >> ((word_offset + start + 1) - length);
463
value = insn_value >> (total_length - ( word_offset + start + length));
466
#if ! CGEN_INT_INSN_P
470
unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
472
if (word_length > 8 * sizeof (CGEN_INSN_INT))
475
if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
478
value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
481
#endif /* ! CGEN_INT_INSN_P */
483
/* Written this way to avoid undefined behaviour. */
484
mask = (((1L << (length - 1)) - 1) << 1) | 1;
488
if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
489
&& (value & (1L << (length - 1))))
497
/* Default insn extractor.
499
INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
500
The extracted fields are stored in FIELDS.
501
EX_INFO is used to handle reading variable length insns.
502
Return the length of the insn in bits, or 0 if no match,
503
or -1 if an error occurs fetching data (memory_error_func will have
507
extract_insn_normal (CGEN_CPU_DESC cd,
508
const CGEN_INSN *insn,
509
CGEN_EXTRACT_INFO *ex_info,
510
CGEN_INSN_INT insn_value,
514
const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
515
const CGEN_SYNTAX_CHAR_TYPE *syn;
517
CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
519
CGEN_INIT_EXTRACT (cd);
521
for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
525
if (CGEN_SYNTAX_CHAR_P (*syn))
528
length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
529
ex_info, insn_value, fields, pc);
534
/* We recognized and successfully extracted this insn. */
535
return CGEN_INSN_BITSIZE (insn);
538
/* Machine generated code added here. */
540
const char * mt_cgen_insert_operand
541
(CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
543
/* Main entry point for operand insertion.
545
This function is basically just a big switch statement. Earlier versions
546
used tables to look up the function to use, but
547
- if the table contains both assembler and disassembler functions then
548
the disassembler contains much of the assembler and vice-versa,
549
- there's a lot of inlining possibilities as things grow,
550
- using a switch statement avoids the function call overhead.
552
This function could be moved into `parse_insn_normal', but keeping it
553
separate makes clear the interface between `parse_insn_normal' and each of
554
the handlers. It's also needed by GAS to insert operands that couldn't be
555
resolved during parsing. */
558
mt_cgen_insert_operand (CGEN_CPU_DESC cd,
560
CGEN_FIELDS * fields,
561
CGEN_INSN_BYTES_PTR buffer,
562
bfd_vma pc ATTRIBUTE_UNUSED)
564
const char * errmsg = NULL;
565
unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
569
case MT_OPERAND_A23 :
570
errmsg = insert_normal (cd, fields->f_a23, 0, 0, 23, 1, 32, total_length, buffer);
572
case MT_OPERAND_BALL :
573
errmsg = insert_normal (cd, fields->f_ball, 0, 0, 19, 1, 32, total_length, buffer);
575
case MT_OPERAND_BALL2 :
576
errmsg = insert_normal (cd, fields->f_ball2, 0, 0, 15, 1, 32, total_length, buffer);
578
case MT_OPERAND_BANKADDR :
579
errmsg = insert_normal (cd, fields->f_bankaddr, 0, 0, 25, 13, 32, total_length, buffer);
581
case MT_OPERAND_BRC :
582
errmsg = insert_normal (cd, fields->f_brc, 0, 0, 18, 3, 32, total_length, buffer);
584
case MT_OPERAND_BRC2 :
585
errmsg = insert_normal (cd, fields->f_brc2, 0, 0, 14, 3, 32, total_length, buffer);
587
case MT_OPERAND_CB1INCR :
588
errmsg = insert_normal (cd, fields->f_cb1incr, 0|(1<<CGEN_IFLD_SIGNED), 0, 19, 6, 32, total_length, buffer);
590
case MT_OPERAND_CB1SEL :
591
errmsg = insert_normal (cd, fields->f_cb1sel, 0, 0, 25, 3, 32, total_length, buffer);
593
case MT_OPERAND_CB2INCR :
594
errmsg = insert_normal (cd, fields->f_cb2incr, 0|(1<<CGEN_IFLD_SIGNED), 0, 13, 6, 32, total_length, buffer);
596
case MT_OPERAND_CB2SEL :
597
errmsg = insert_normal (cd, fields->f_cb2sel, 0, 0, 22, 3, 32, total_length, buffer);
599
case MT_OPERAND_CBRB :
600
errmsg = insert_normal (cd, fields->f_cbrb, 0, 0, 10, 1, 32, total_length, buffer);
602
case MT_OPERAND_CBS :
603
errmsg = insert_normal (cd, fields->f_cbs, 0, 0, 19, 2, 32, total_length, buffer);
605
case MT_OPERAND_CBX :
606
errmsg = insert_normal (cd, fields->f_cbx, 0, 0, 14, 3, 32, total_length, buffer);
608
case MT_OPERAND_CCB :
609
errmsg = insert_normal (cd, fields->f_ccb, 0, 0, 11, 1, 32, total_length, buffer);
611
case MT_OPERAND_CDB :
612
errmsg = insert_normal (cd, fields->f_cdb, 0, 0, 10, 1, 32, total_length, buffer);
614
case MT_OPERAND_CELL :
615
errmsg = insert_normal (cd, fields->f_cell, 0, 0, 9, 3, 32, total_length, buffer);
617
case MT_OPERAND_COLNUM :
618
errmsg = insert_normal (cd, fields->f_colnum, 0, 0, 18, 3, 32, total_length, buffer);
620
case MT_OPERAND_CONTNUM :
621
errmsg = insert_normal (cd, fields->f_contnum, 0, 0, 8, 9, 32, total_length, buffer);
624
errmsg = insert_normal (cd, fields->f_cr, 0, 0, 22, 3, 32, total_length, buffer);
626
case MT_OPERAND_CTXDISP :
627
errmsg = insert_normal (cd, fields->f_ctxdisp, 0, 0, 5, 6, 32, total_length, buffer);
629
case MT_OPERAND_DUP :
630
errmsg = insert_normal (cd, fields->f_dup, 0, 0, 6, 1, 32, total_length, buffer);
632
case MT_OPERAND_FBDISP :
633
errmsg = insert_normal (cd, fields->f_fbdisp, 0, 0, 15, 6, 32, total_length, buffer);
635
case MT_OPERAND_FBINCR :
636
errmsg = insert_normal (cd, fields->f_fbincr, 0, 0, 23, 4, 32, total_length, buffer);
638
case MT_OPERAND_FRDR :
639
errmsg = insert_normal (cd, fields->f_dr, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, buffer);
641
case MT_OPERAND_FRDRRR :
642
errmsg = insert_normal (cd, fields->f_drrr, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 15, 4, 32, total_length, buffer);
644
case MT_OPERAND_FRSR1 :
645
errmsg = insert_normal (cd, fields->f_sr1, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 23, 4, 32, total_length, buffer);
647
case MT_OPERAND_FRSR2 :
648
errmsg = insert_normal (cd, fields->f_sr2, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, buffer);
651
errmsg = insert_normal (cd, fields->f_id, 0, 0, 14, 1, 32, total_length, buffer);
653
case MT_OPERAND_IMM16 :
655
long value = fields->f_imm16s;
656
value = ((value) + (0));
657
errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
660
case MT_OPERAND_IMM16L :
661
errmsg = insert_normal (cd, fields->f_imm16l, 0, 0, 23, 16, 32, total_length, buffer);
663
case MT_OPERAND_IMM16O :
665
long value = fields->f_imm16s;
666
value = ((value) + (0));
667
errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
670
case MT_OPERAND_IMM16Z :
671
errmsg = insert_normal (cd, fields->f_imm16u, 0, 0, 15, 16, 32, total_length, buffer);
673
case MT_OPERAND_INCAMT :
674
errmsg = insert_normal (cd, fields->f_incamt, 0, 0, 19, 8, 32, total_length, buffer);
676
case MT_OPERAND_INCR :
677
errmsg = insert_normal (cd, fields->f_incr, 0, 0, 17, 6, 32, total_length, buffer);
679
case MT_OPERAND_LENGTH :
680
errmsg = insert_normal (cd, fields->f_length, 0, 0, 15, 3, 32, total_length, buffer);
682
case MT_OPERAND_LOOPSIZE :
684
long value = fields->f_loopo;
685
value = ((USI) (value) >> (2));
686
errmsg = insert_normal (cd, value, 0, 0, 7, 8, 32, total_length, buffer);
689
case MT_OPERAND_MASK :
690
errmsg = insert_normal (cd, fields->f_mask, 0, 0, 25, 16, 32, total_length, buffer);
692
case MT_OPERAND_MASK1 :
693
errmsg = insert_normal (cd, fields->f_mask1, 0, 0, 22, 3, 32, total_length, buffer);
695
case MT_OPERAND_MODE :
696
errmsg = insert_normal (cd, fields->f_mode, 0, 0, 25, 2, 32, total_length, buffer);
698
case MT_OPERAND_PERM :
699
errmsg = insert_normal (cd, fields->f_perm, 0, 0, 25, 2, 32, total_length, buffer);
701
case MT_OPERAND_RBBC :
702
errmsg = insert_normal (cd, fields->f_rbbc, 0, 0, 25, 2, 32, total_length, buffer);
705
errmsg = insert_normal (cd, fields->f_rc, 0, 0, 15, 1, 32, total_length, buffer);
707
case MT_OPERAND_RC1 :
708
errmsg = insert_normal (cd, fields->f_rc1, 0, 0, 11, 1, 32, total_length, buffer);
710
case MT_OPERAND_RC2 :
711
errmsg = insert_normal (cd, fields->f_rc2, 0, 0, 6, 1, 32, total_length, buffer);
713
case MT_OPERAND_RC3 :
714
errmsg = insert_normal (cd, fields->f_rc3, 0, 0, 7, 1, 32, total_length, buffer);
716
case MT_OPERAND_RCNUM :
717
errmsg = insert_normal (cd, fields->f_rcnum, 0, 0, 14, 3, 32, total_length, buffer);
719
case MT_OPERAND_RDA :
720
errmsg = insert_normal (cd, fields->f_rda, 0, 0, 25, 1, 32, total_length, buffer);
722
case MT_OPERAND_ROWNUM :
723
errmsg = insert_normal (cd, fields->f_rownum, 0, 0, 14, 3, 32, total_length, buffer);
725
case MT_OPERAND_ROWNUM1 :
726
errmsg = insert_normal (cd, fields->f_rownum1, 0, 0, 12, 3, 32, total_length, buffer);
728
case MT_OPERAND_ROWNUM2 :
729
errmsg = insert_normal (cd, fields->f_rownum2, 0, 0, 9, 3, 32, total_length, buffer);
731
case MT_OPERAND_SIZE :
732
errmsg = insert_normal (cd, fields->f_size, 0, 0, 13, 14, 32, total_length, buffer);
734
case MT_OPERAND_TYPE :
735
errmsg = insert_normal (cd, fields->f_type, 0, 0, 21, 2, 32, total_length, buffer);
738
errmsg = insert_normal (cd, fields->f_wr, 0, 0, 24, 1, 32, total_length, buffer);
740
case MT_OPERAND_XMODE :
741
errmsg = insert_normal (cd, fields->f_xmode, 0, 0, 23, 1, 32, total_length, buffer);
745
/* xgettext:c-format */
746
fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
754
int mt_cgen_extract_operand
755
(CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
757
/* Main entry point for operand extraction.
758
The result is <= 0 for error, >0 for success.
759
??? Actual values aren't well defined right now.
761
This function is basically just a big switch statement. Earlier versions
762
used tables to look up the function to use, but
763
- if the table contains both assembler and disassembler functions then
764
the disassembler contains much of the assembler and vice-versa,
765
- there's a lot of inlining possibilities as things grow,
766
- using a switch statement avoids the function call overhead.
768
This function could be moved into `print_insn_normal', but keeping it
769
separate makes clear the interface between `print_insn_normal' and each of
773
mt_cgen_extract_operand (CGEN_CPU_DESC cd,
775
CGEN_EXTRACT_INFO *ex_info,
776
CGEN_INSN_INT insn_value,
777
CGEN_FIELDS * fields,
780
/* Assume success (for those operands that are nops). */
782
unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
786
case MT_OPERAND_A23 :
787
length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 1, 32, total_length, pc, & fields->f_a23);
789
case MT_OPERAND_BALL :
790
length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 1, 32, total_length, pc, & fields->f_ball);
792
case MT_OPERAND_BALL2 :
793
length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_ball2);
795
case MT_OPERAND_BANKADDR :
796
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 13, 32, total_length, pc, & fields->f_bankaddr);
798
case MT_OPERAND_BRC :
799
length = extract_normal (cd, ex_info, insn_value, 0, 0, 18, 3, 32, total_length, pc, & fields->f_brc);
801
case MT_OPERAND_BRC2 :
802
length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_brc2);
804
case MT_OPERAND_CB1INCR :
805
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 19, 6, 32, total_length, pc, & fields->f_cb1incr);
807
case MT_OPERAND_CB1SEL :
808
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_cb1sel);
810
case MT_OPERAND_CB2INCR :
811
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 13, 6, 32, total_length, pc, & fields->f_cb2incr);
813
case MT_OPERAND_CB2SEL :
814
length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_cb2sel);
816
case MT_OPERAND_CBRB :
817
length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 1, 32, total_length, pc, & fields->f_cbrb);
819
case MT_OPERAND_CBS :
820
length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 2, 32, total_length, pc, & fields->f_cbs);
822
case MT_OPERAND_CBX :
823
length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_cbx);
825
case MT_OPERAND_CCB :
826
length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_ccb);
828
case MT_OPERAND_CDB :
829
length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 1, 32, total_length, pc, & fields->f_cdb);
831
case MT_OPERAND_CELL :
832
length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_cell);
834
case MT_OPERAND_COLNUM :
835
length = extract_normal (cd, ex_info, insn_value, 0, 0, 18, 3, 32, total_length, pc, & fields->f_colnum);
837
case MT_OPERAND_CONTNUM :
838
length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 9, 32, total_length, pc, & fields->f_contnum);
841
length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_cr);
843
case MT_OPERAND_CTXDISP :
844
length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_ctxdisp);
846
case MT_OPERAND_DUP :
847
length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_dup);
849
case MT_OPERAND_FBDISP :
850
length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_fbdisp);
852
case MT_OPERAND_FBINCR :
853
length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 4, 32, total_length, pc, & fields->f_fbincr);
855
case MT_OPERAND_FRDR :
856
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, pc, & fields->f_dr);
858
case MT_OPERAND_FRDRRR :
859
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 15, 4, 32, total_length, pc, & fields->f_drrr);
861
case MT_OPERAND_FRSR1 :
862
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 23, 4, 32, total_length, pc, & fields->f_sr1);
864
case MT_OPERAND_FRSR2 :
865
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, pc, & fields->f_sr2);
868
length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 1, 32, total_length, pc, & fields->f_id);
870
case MT_OPERAND_IMM16 :
873
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & value);
874
value = ((value) + (0));
875
fields->f_imm16s = value;
878
case MT_OPERAND_IMM16L :
879
length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 16, 32, total_length, pc, & fields->f_imm16l);
881
case MT_OPERAND_IMM16O :
884
length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & value);
885
value = ((value) + (0));
886
fields->f_imm16s = value;
889
case MT_OPERAND_IMM16Z :
890
length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_imm16u);
892
case MT_OPERAND_INCAMT :
893
length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 8, 32, total_length, pc, & fields->f_incamt);
895
case MT_OPERAND_INCR :
896
length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_incr);
898
case MT_OPERAND_LENGTH :
899
length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_length);
901
case MT_OPERAND_LOOPSIZE :
904
length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 8, 32, total_length, pc, & value);
905
value = ((((value) << (2))) + (8));
906
fields->f_loopo = value;
909
case MT_OPERAND_MASK :
910
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 16, 32, total_length, pc, & fields->f_mask);
912
case MT_OPERAND_MASK1 :
913
length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_mask1);
915
case MT_OPERAND_MODE :
916
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_mode);
918
case MT_OPERAND_PERM :
919
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_perm);
921
case MT_OPERAND_RBBC :
922
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_rbbc);
925
length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_rc);
927
case MT_OPERAND_RC1 :
928
length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_rc1);
930
case MT_OPERAND_RC2 :
931
length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_rc2);
933
case MT_OPERAND_RC3 :
934
length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_rc3);
936
case MT_OPERAND_RCNUM :
937
length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_rcnum);
939
case MT_OPERAND_RDA :
940
length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_rda);
942
case MT_OPERAND_ROWNUM :
943
length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_rownum);
945
case MT_OPERAND_ROWNUM1 :
946
length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rownum1);
948
case MT_OPERAND_ROWNUM2 :
949
length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rownum2);
951
case MT_OPERAND_SIZE :
952
length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 14, 32, total_length, pc, & fields->f_size);
954
case MT_OPERAND_TYPE :
955
length = extract_normal (cd, ex_info, insn_value, 0, 0, 21, 2, 32, total_length, pc, & fields->f_type);
958
length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 1, 32, total_length, pc, & fields->f_wr);
960
case MT_OPERAND_XMODE :
961
length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 1, 32, total_length, pc, & fields->f_xmode);
965
/* xgettext:c-format */
966
fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
974
cgen_insert_fn * const mt_cgen_insert_handlers[] =
979
cgen_extract_fn * const mt_cgen_extract_handlers[] =
984
int mt_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
985
bfd_vma mt_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
987
/* Getting values from cgen_fields is handled by a collection of functions.
988
They are distinguished by the type of the VALUE argument they return.
989
TODO: floating point, inlining support, remove cases where result type
993
mt_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
995
const CGEN_FIELDS * fields)
1001
case MT_OPERAND_A23 :
1002
value = fields->f_a23;
1004
case MT_OPERAND_BALL :
1005
value = fields->f_ball;
1007
case MT_OPERAND_BALL2 :
1008
value = fields->f_ball2;
1010
case MT_OPERAND_BANKADDR :
1011
value = fields->f_bankaddr;
1013
case MT_OPERAND_BRC :
1014
value = fields->f_brc;
1016
case MT_OPERAND_BRC2 :
1017
value = fields->f_brc2;
1019
case MT_OPERAND_CB1INCR :
1020
value = fields->f_cb1incr;
1022
case MT_OPERAND_CB1SEL :
1023
value = fields->f_cb1sel;
1025
case MT_OPERAND_CB2INCR :
1026
value = fields->f_cb2incr;
1028
case MT_OPERAND_CB2SEL :
1029
value = fields->f_cb2sel;
1031
case MT_OPERAND_CBRB :
1032
value = fields->f_cbrb;
1034
case MT_OPERAND_CBS :
1035
value = fields->f_cbs;
1037
case MT_OPERAND_CBX :
1038
value = fields->f_cbx;
1040
case MT_OPERAND_CCB :
1041
value = fields->f_ccb;
1043
case MT_OPERAND_CDB :
1044
value = fields->f_cdb;
1046
case MT_OPERAND_CELL :
1047
value = fields->f_cell;
1049
case MT_OPERAND_COLNUM :
1050
value = fields->f_colnum;
1052
case MT_OPERAND_CONTNUM :
1053
value = fields->f_contnum;
1055
case MT_OPERAND_CR :
1056
value = fields->f_cr;
1058
case MT_OPERAND_CTXDISP :
1059
value = fields->f_ctxdisp;
1061
case MT_OPERAND_DUP :
1062
value = fields->f_dup;
1064
case MT_OPERAND_FBDISP :
1065
value = fields->f_fbdisp;
1067
case MT_OPERAND_FBINCR :
1068
value = fields->f_fbincr;
1070
case MT_OPERAND_FRDR :
1071
value = fields->f_dr;
1073
case MT_OPERAND_FRDRRR :
1074
value = fields->f_drrr;
1076
case MT_OPERAND_FRSR1 :
1077
value = fields->f_sr1;
1079
case MT_OPERAND_FRSR2 :
1080
value = fields->f_sr2;
1082
case MT_OPERAND_ID :
1083
value = fields->f_id;
1085
case MT_OPERAND_IMM16 :
1086
value = fields->f_imm16s;
1088
case MT_OPERAND_IMM16L :
1089
value = fields->f_imm16l;
1091
case MT_OPERAND_IMM16O :
1092
value = fields->f_imm16s;
1094
case MT_OPERAND_IMM16Z :
1095
value = fields->f_imm16u;
1097
case MT_OPERAND_INCAMT :
1098
value = fields->f_incamt;
1100
case MT_OPERAND_INCR :
1101
value = fields->f_incr;
1103
case MT_OPERAND_LENGTH :
1104
value = fields->f_length;
1106
case MT_OPERAND_LOOPSIZE :
1107
value = fields->f_loopo;
1109
case MT_OPERAND_MASK :
1110
value = fields->f_mask;
1112
case MT_OPERAND_MASK1 :
1113
value = fields->f_mask1;
1115
case MT_OPERAND_MODE :
1116
value = fields->f_mode;
1118
case MT_OPERAND_PERM :
1119
value = fields->f_perm;
1121
case MT_OPERAND_RBBC :
1122
value = fields->f_rbbc;
1124
case MT_OPERAND_RC :
1125
value = fields->f_rc;
1127
case MT_OPERAND_RC1 :
1128
value = fields->f_rc1;
1130
case MT_OPERAND_RC2 :
1131
value = fields->f_rc2;
1133
case MT_OPERAND_RC3 :
1134
value = fields->f_rc3;
1136
case MT_OPERAND_RCNUM :
1137
value = fields->f_rcnum;
1139
case MT_OPERAND_RDA :
1140
value = fields->f_rda;
1142
case MT_OPERAND_ROWNUM :
1143
value = fields->f_rownum;
1145
case MT_OPERAND_ROWNUM1 :
1146
value = fields->f_rownum1;
1148
case MT_OPERAND_ROWNUM2 :
1149
value = fields->f_rownum2;
1151
case MT_OPERAND_SIZE :
1152
value = fields->f_size;
1154
case MT_OPERAND_TYPE :
1155
value = fields->f_type;
1157
case MT_OPERAND_WR :
1158
value = fields->f_wr;
1160
case MT_OPERAND_XMODE :
1161
value = fields->f_xmode;
1165
/* xgettext:c-format */
1166
fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1175
mt_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1177
const CGEN_FIELDS * fields)
1183
case MT_OPERAND_A23 :
1184
value = fields->f_a23;
1186
case MT_OPERAND_BALL :
1187
value = fields->f_ball;
1189
case MT_OPERAND_BALL2 :
1190
value = fields->f_ball2;
1192
case MT_OPERAND_BANKADDR :
1193
value = fields->f_bankaddr;
1195
case MT_OPERAND_BRC :
1196
value = fields->f_brc;
1198
case MT_OPERAND_BRC2 :
1199
value = fields->f_brc2;
1201
case MT_OPERAND_CB1INCR :
1202
value = fields->f_cb1incr;
1204
case MT_OPERAND_CB1SEL :
1205
value = fields->f_cb1sel;
1207
case MT_OPERAND_CB2INCR :
1208
value = fields->f_cb2incr;
1210
case MT_OPERAND_CB2SEL :
1211
value = fields->f_cb2sel;
1213
case MT_OPERAND_CBRB :
1214
value = fields->f_cbrb;
1216
case MT_OPERAND_CBS :
1217
value = fields->f_cbs;
1219
case MT_OPERAND_CBX :
1220
value = fields->f_cbx;
1222
case MT_OPERAND_CCB :
1223
value = fields->f_ccb;
1225
case MT_OPERAND_CDB :
1226
value = fields->f_cdb;
1228
case MT_OPERAND_CELL :
1229
value = fields->f_cell;
1231
case MT_OPERAND_COLNUM :
1232
value = fields->f_colnum;
1234
case MT_OPERAND_CONTNUM :
1235
value = fields->f_contnum;
1237
case MT_OPERAND_CR :
1238
value = fields->f_cr;
1240
case MT_OPERAND_CTXDISP :
1241
value = fields->f_ctxdisp;
1243
case MT_OPERAND_DUP :
1244
value = fields->f_dup;
1246
case MT_OPERAND_FBDISP :
1247
value = fields->f_fbdisp;
1249
case MT_OPERAND_FBINCR :
1250
value = fields->f_fbincr;
1252
case MT_OPERAND_FRDR :
1253
value = fields->f_dr;
1255
case MT_OPERAND_FRDRRR :
1256
value = fields->f_drrr;
1258
case MT_OPERAND_FRSR1 :
1259
value = fields->f_sr1;
1261
case MT_OPERAND_FRSR2 :
1262
value = fields->f_sr2;
1264
case MT_OPERAND_ID :
1265
value = fields->f_id;
1267
case MT_OPERAND_IMM16 :
1268
value = fields->f_imm16s;
1270
case MT_OPERAND_IMM16L :
1271
value = fields->f_imm16l;
1273
case MT_OPERAND_IMM16O :
1274
value = fields->f_imm16s;
1276
case MT_OPERAND_IMM16Z :
1277
value = fields->f_imm16u;
1279
case MT_OPERAND_INCAMT :
1280
value = fields->f_incamt;
1282
case MT_OPERAND_INCR :
1283
value = fields->f_incr;
1285
case MT_OPERAND_LENGTH :
1286
value = fields->f_length;
1288
case MT_OPERAND_LOOPSIZE :
1289
value = fields->f_loopo;
1291
case MT_OPERAND_MASK :
1292
value = fields->f_mask;
1294
case MT_OPERAND_MASK1 :
1295
value = fields->f_mask1;
1297
case MT_OPERAND_MODE :
1298
value = fields->f_mode;
1300
case MT_OPERAND_PERM :
1301
value = fields->f_perm;
1303
case MT_OPERAND_RBBC :
1304
value = fields->f_rbbc;
1306
case MT_OPERAND_RC :
1307
value = fields->f_rc;
1309
case MT_OPERAND_RC1 :
1310
value = fields->f_rc1;
1312
case MT_OPERAND_RC2 :
1313
value = fields->f_rc2;
1315
case MT_OPERAND_RC3 :
1316
value = fields->f_rc3;
1318
case MT_OPERAND_RCNUM :
1319
value = fields->f_rcnum;
1321
case MT_OPERAND_RDA :
1322
value = fields->f_rda;
1324
case MT_OPERAND_ROWNUM :
1325
value = fields->f_rownum;
1327
case MT_OPERAND_ROWNUM1 :
1328
value = fields->f_rownum1;
1330
case MT_OPERAND_ROWNUM2 :
1331
value = fields->f_rownum2;
1333
case MT_OPERAND_SIZE :
1334
value = fields->f_size;
1336
case MT_OPERAND_TYPE :
1337
value = fields->f_type;
1339
case MT_OPERAND_WR :
1340
value = fields->f_wr;
1342
case MT_OPERAND_XMODE :
1343
value = fields->f_xmode;
1347
/* xgettext:c-format */
1348
fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
1356
void mt_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1357
void mt_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
1359
/* Stuffing values in cgen_fields is handled by a collection of functions.
1360
They are distinguished by the type of the VALUE argument they accept.
1361
TODO: floating point, inlining support, remove cases where argument type
1365
mt_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1367
CGEN_FIELDS * fields,
1372
case MT_OPERAND_A23 :
1373
fields->f_a23 = value;
1375
case MT_OPERAND_BALL :
1376
fields->f_ball = value;
1378
case MT_OPERAND_BALL2 :
1379
fields->f_ball2 = value;
1381
case MT_OPERAND_BANKADDR :
1382
fields->f_bankaddr = value;
1384
case MT_OPERAND_BRC :
1385
fields->f_brc = value;
1387
case MT_OPERAND_BRC2 :
1388
fields->f_brc2 = value;
1390
case MT_OPERAND_CB1INCR :
1391
fields->f_cb1incr = value;
1393
case MT_OPERAND_CB1SEL :
1394
fields->f_cb1sel = value;
1396
case MT_OPERAND_CB2INCR :
1397
fields->f_cb2incr = value;
1399
case MT_OPERAND_CB2SEL :
1400
fields->f_cb2sel = value;
1402
case MT_OPERAND_CBRB :
1403
fields->f_cbrb = value;
1405
case MT_OPERAND_CBS :
1406
fields->f_cbs = value;
1408
case MT_OPERAND_CBX :
1409
fields->f_cbx = value;
1411
case MT_OPERAND_CCB :
1412
fields->f_ccb = value;
1414
case MT_OPERAND_CDB :
1415
fields->f_cdb = value;
1417
case MT_OPERAND_CELL :
1418
fields->f_cell = value;
1420
case MT_OPERAND_COLNUM :
1421
fields->f_colnum = value;
1423
case MT_OPERAND_CONTNUM :
1424
fields->f_contnum = value;
1426
case MT_OPERAND_CR :
1427
fields->f_cr = value;
1429
case MT_OPERAND_CTXDISP :
1430
fields->f_ctxdisp = value;
1432
case MT_OPERAND_DUP :
1433
fields->f_dup = value;
1435
case MT_OPERAND_FBDISP :
1436
fields->f_fbdisp = value;
1438
case MT_OPERAND_FBINCR :
1439
fields->f_fbincr = value;
1441
case MT_OPERAND_FRDR :
1442
fields->f_dr = value;
1444
case MT_OPERAND_FRDRRR :
1445
fields->f_drrr = value;
1447
case MT_OPERAND_FRSR1 :
1448
fields->f_sr1 = value;
1450
case MT_OPERAND_FRSR2 :
1451
fields->f_sr2 = value;
1453
case MT_OPERAND_ID :
1454
fields->f_id = value;
1456
case MT_OPERAND_IMM16 :
1457
fields->f_imm16s = value;
1459
case MT_OPERAND_IMM16L :
1460
fields->f_imm16l = value;
1462
case MT_OPERAND_IMM16O :
1463
fields->f_imm16s = value;
1465
case MT_OPERAND_IMM16Z :
1466
fields->f_imm16u = value;
1468
case MT_OPERAND_INCAMT :
1469
fields->f_incamt = value;
1471
case MT_OPERAND_INCR :
1472
fields->f_incr = value;
1474
case MT_OPERAND_LENGTH :
1475
fields->f_length = value;
1477
case MT_OPERAND_LOOPSIZE :
1478
fields->f_loopo = value;
1480
case MT_OPERAND_MASK :
1481
fields->f_mask = value;
1483
case MT_OPERAND_MASK1 :
1484
fields->f_mask1 = value;
1486
case MT_OPERAND_MODE :
1487
fields->f_mode = value;
1489
case MT_OPERAND_PERM :
1490
fields->f_perm = value;
1492
case MT_OPERAND_RBBC :
1493
fields->f_rbbc = value;
1495
case MT_OPERAND_RC :
1496
fields->f_rc = value;
1498
case MT_OPERAND_RC1 :
1499
fields->f_rc1 = value;
1501
case MT_OPERAND_RC2 :
1502
fields->f_rc2 = value;
1504
case MT_OPERAND_RC3 :
1505
fields->f_rc3 = value;
1507
case MT_OPERAND_RCNUM :
1508
fields->f_rcnum = value;
1510
case MT_OPERAND_RDA :
1511
fields->f_rda = value;
1513
case MT_OPERAND_ROWNUM :
1514
fields->f_rownum = value;
1516
case MT_OPERAND_ROWNUM1 :
1517
fields->f_rownum1 = value;
1519
case MT_OPERAND_ROWNUM2 :
1520
fields->f_rownum2 = value;
1522
case MT_OPERAND_SIZE :
1523
fields->f_size = value;
1525
case MT_OPERAND_TYPE :
1526
fields->f_type = value;
1528
case MT_OPERAND_WR :
1529
fields->f_wr = value;
1531
case MT_OPERAND_XMODE :
1532
fields->f_xmode = value;
1536
/* xgettext:c-format */
1537
fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
1544
mt_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1546
CGEN_FIELDS * fields,
1551
case MT_OPERAND_A23 :
1552
fields->f_a23 = value;
1554
case MT_OPERAND_BALL :
1555
fields->f_ball = value;
1557
case MT_OPERAND_BALL2 :
1558
fields->f_ball2 = value;
1560
case MT_OPERAND_BANKADDR :
1561
fields->f_bankaddr = value;
1563
case MT_OPERAND_BRC :
1564
fields->f_brc = value;
1566
case MT_OPERAND_BRC2 :
1567
fields->f_brc2 = value;
1569
case MT_OPERAND_CB1INCR :
1570
fields->f_cb1incr = value;
1572
case MT_OPERAND_CB1SEL :
1573
fields->f_cb1sel = value;
1575
case MT_OPERAND_CB2INCR :
1576
fields->f_cb2incr = value;
1578
case MT_OPERAND_CB2SEL :
1579
fields->f_cb2sel = value;
1581
case MT_OPERAND_CBRB :
1582
fields->f_cbrb = value;
1584
case MT_OPERAND_CBS :
1585
fields->f_cbs = value;
1587
case MT_OPERAND_CBX :
1588
fields->f_cbx = value;
1590
case MT_OPERAND_CCB :
1591
fields->f_ccb = value;
1593
case MT_OPERAND_CDB :
1594
fields->f_cdb = value;
1596
case MT_OPERAND_CELL :
1597
fields->f_cell = value;
1599
case MT_OPERAND_COLNUM :
1600
fields->f_colnum = value;
1602
case MT_OPERAND_CONTNUM :
1603
fields->f_contnum = value;
1605
case MT_OPERAND_CR :
1606
fields->f_cr = value;
1608
case MT_OPERAND_CTXDISP :
1609
fields->f_ctxdisp = value;
1611
case MT_OPERAND_DUP :
1612
fields->f_dup = value;
1614
case MT_OPERAND_FBDISP :
1615
fields->f_fbdisp = value;
1617
case MT_OPERAND_FBINCR :
1618
fields->f_fbincr = value;
1620
case MT_OPERAND_FRDR :
1621
fields->f_dr = value;
1623
case MT_OPERAND_FRDRRR :
1624
fields->f_drrr = value;
1626
case MT_OPERAND_FRSR1 :
1627
fields->f_sr1 = value;
1629
case MT_OPERAND_FRSR2 :
1630
fields->f_sr2 = value;
1632
case MT_OPERAND_ID :
1633
fields->f_id = value;
1635
case MT_OPERAND_IMM16 :
1636
fields->f_imm16s = value;
1638
case MT_OPERAND_IMM16L :
1639
fields->f_imm16l = value;
1641
case MT_OPERAND_IMM16O :
1642
fields->f_imm16s = value;
1644
case MT_OPERAND_IMM16Z :
1645
fields->f_imm16u = value;
1647
case MT_OPERAND_INCAMT :
1648
fields->f_incamt = value;
1650
case MT_OPERAND_INCR :
1651
fields->f_incr = value;
1653
case MT_OPERAND_LENGTH :
1654
fields->f_length = value;
1656
case MT_OPERAND_LOOPSIZE :
1657
fields->f_loopo = value;
1659
case MT_OPERAND_MASK :
1660
fields->f_mask = value;
1662
case MT_OPERAND_MASK1 :
1663
fields->f_mask1 = value;
1665
case MT_OPERAND_MODE :
1666
fields->f_mode = value;
1668
case MT_OPERAND_PERM :
1669
fields->f_perm = value;
1671
case MT_OPERAND_RBBC :
1672
fields->f_rbbc = value;
1674
case MT_OPERAND_RC :
1675
fields->f_rc = value;
1677
case MT_OPERAND_RC1 :
1678
fields->f_rc1 = value;
1680
case MT_OPERAND_RC2 :
1681
fields->f_rc2 = value;
1683
case MT_OPERAND_RC3 :
1684
fields->f_rc3 = value;
1686
case MT_OPERAND_RCNUM :
1687
fields->f_rcnum = value;
1689
case MT_OPERAND_RDA :
1690
fields->f_rda = value;
1692
case MT_OPERAND_ROWNUM :
1693
fields->f_rownum = value;
1695
case MT_OPERAND_ROWNUM1 :
1696
fields->f_rownum1 = value;
1698
case MT_OPERAND_ROWNUM2 :
1699
fields->f_rownum2 = value;
1701
case MT_OPERAND_SIZE :
1702
fields->f_size = value;
1704
case MT_OPERAND_TYPE :
1705
fields->f_type = value;
1707
case MT_OPERAND_WR :
1708
fields->f_wr = value;
1710
case MT_OPERAND_XMODE :
1711
fields->f_xmode = value;
1715
/* xgettext:c-format */
1716
fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
1722
/* Function to call before using the instruction builder tables. */
1725
mt_cgen_init_ibld_table (CGEN_CPU_DESC cd)
1727
cd->insert_handlers = & mt_cgen_insert_handlers[0];
1728
cd->extract_handlers = & mt_cgen_extract_handlers[0];
1730
cd->insert_operand = mt_cgen_insert_operand;
1731
cd->extract_operand = mt_cgen_extract_operand;
1733
cd->get_int_operand = mt_cgen_get_int_operand;
1734
cd->set_int_operand = mt_cgen_set_int_operand;
1735
cd->get_vma_operand = mt_cgen_get_vma_operand;
1736
cd->set_vma_operand = mt_cgen_set_vma_operand;