]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - opcodes/mt-ibld.c
Automatic date update in version.in
[thirdparty/binutils-gdb.git] / opcodes / mt-ibld.c
CommitLineData
4162bb66 1/* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
d031aafb 2/* Instruction building/extraction support for mt. -*- C -*-
ac188222 3
47b0e7ad
NC
4 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
5 - the resultant file is machine generated, cgen-ibld.in isn't
ac188222 6
219d1afa 7 Copyright (C) 1996-2018 Free Software Foundation, Inc.
ac188222 8
9b201bb5 9 This file is part of libopcodes.
ac188222 10
9b201bb5 11 This library is free software; you can redistribute it and/or modify
47b0e7ad 12 it under the terms of the GNU General Public License as published by
9b201bb5 13 the Free Software Foundation; either version 3, or (at your option)
47b0e7ad 14 any later version.
ac188222 15
9b201bb5
NC
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.
ac188222 20
47b0e7ad
NC
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. */
ac188222
DB
24
25/* ??? Eventually more and more of this stuff can go to cpu-independent files.
26 Keep that in mind. */
27
28#include "sysdep.h"
29#include <stdio.h>
30#include "ansidecl.h"
31#include "dis-asm.h"
32#include "bfd.h"
33#include "symcat.h"
d031aafb
NS
34#include "mt-desc.h"
35#include "mt-opc.h"
fe8afbc4 36#include "cgen/basic-modes.h"
ac188222
DB
37#include "opintl.h"
38#include "safe-ctype.h"
39
47b0e7ad 40#undef min
ac188222 41#define min(a,b) ((a) < (b) ? (a) : (b))
47b0e7ad 42#undef max
ac188222
DB
43#define max(a,b) ((a) > (b) ? (a) : (b))
44
45/* Used by the ifield rtx function. */
46#define FLD(f) (fields->f)
47
48static 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);
51static const char * insert_insn_normal
52 (CGEN_CPU_DESC, const CGEN_INSN *,
53 CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
54static 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 *);
58static int extract_insn_normal
59 (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
60 CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
61#if CGEN_INT_INSN_P
62static void put_insn_int_value
63 (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
64#endif
65#if ! CGEN_INT_INSN_P
66static CGEN_INLINE void insert_1
67 (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
68static CGEN_INLINE int fill_cache
69 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma);
70static CGEN_INLINE long extract_1
71 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
72#endif
73\f
74/* Operand insertion. */
75
76#if ! CGEN_INT_INSN_P
77
78/* Subroutine of insert_normal. */
79
80static CGEN_INLINE void
81insert_1 (CGEN_CPU_DESC cd,
82 unsigned long value,
83 int start,
84 int length,
85 int word_length,
86 unsigned char *bufp)
87{
88 unsigned long x,mask;
89 int shift;
90
91 x = cgen_get_insn_value (cd, bufp, word_length);
92
93 /* Written this way to avoid undefined behaviour. */
94 mask = (((1L << (length - 1)) - 1) << 1) | 1;
95 if (CGEN_INSN_LSB0_P)
96 shift = (start + 1) - length;
97 else
98 shift = (word_length - (start + length));
99 x = (x & ~(mask << shift)) | ((value & mask) << shift);
100
101 cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
102}
103
104#endif /* ! CGEN_INT_INSN_P */
105
106/* Default insertion routine.
107
108 ATTRS is a mask of the boolean attributes.
109 WORD_OFFSET is the offset in bits from the start of the insn of the value.
110 WORD_LENGTH is the length of the word in bits in which the value resides.
111 START is the starting bit number in the word, architecture origin.
112 LENGTH is the length of VALUE in bits.
113 TOTAL_LENGTH is the total length of the insn in bits.
114
115 The result is an error message or NULL if success. */
116
117/* ??? This duplicates functionality with bfd's howto table and
118 bfd_install_relocation. */
119/* ??? This doesn't handle bfd_vma's. Create another function when
120 necessary. */
121
122static const char *
123insert_normal (CGEN_CPU_DESC cd,
124 long value,
125 unsigned int attrs,
126 unsigned int word_offset,
127 unsigned int start,
128 unsigned int length,
129 unsigned int word_length,
130 unsigned int total_length,
131 CGEN_INSN_BYTES_PTR buffer)
132{
133 static char errbuf[100];
134 /* Written this way to avoid undefined behaviour. */
135 unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
136
137 /* If LENGTH is zero, this operand doesn't contribute to the value. */
138 if (length == 0)
139 return NULL;
140
b7cd1872 141 if (word_length > 8 * sizeof (CGEN_INSN_INT))
ac188222
DB
142 abort ();
143
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)
147 {
148 if (word_offset == 0
149 && word_length > total_length)
150 word_length = total_length;
151 }
152
153 /* Ensure VALUE will fit. */
154 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
155 {
156 long minval = - (1L << (length - 1));
157 unsigned long maxval = mask;
43e65147 158
ac188222
DB
159 if ((value > 0 && (unsigned long) value > maxval)
160 || value < minval)
161 {
162 /* xgettext:c-format */
163 sprintf (errbuf,
164 _("operand out of range (%ld not between %ld and %lu)"),
165 value, minval, maxval);
166 return errbuf;
167 }
168 }
169 else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
170 {
171 unsigned long maxval = mask;
1620f33d
AM
172 unsigned long val = (unsigned long) value;
173
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))
179 val &= 0xFFFFFFFF;
180
181 if (val > maxval)
ac188222
DB
182 {
183 /* xgettext:c-format */
184 sprintf (errbuf,
1620f33d
AM
185 _("operand out of range (0x%lx not between 0 and 0x%lx)"),
186 val, maxval);
ac188222
DB
187 return errbuf;
188 }
189 }
190 else
191 {
192 if (! cgen_signed_overflow_ok_p (cd))
193 {
194 long minval = - (1L << (length - 1));
195 long maxval = (1L << (length - 1)) - 1;
43e65147 196
ac188222
DB
197 if (value < minval || value > maxval)
198 {
199 sprintf
200 /* xgettext:c-format */
201 (errbuf, _("operand out of range (%ld not between %ld and %ld)"),
202 value, minval, maxval);
203 return errbuf;
204 }
205 }
206 }
207
208#if CGEN_INT_INSN_P
209
210 {
a143b004 211 int shift_within_word, shift_to_word, shift;
ac188222 212
a143b004
AB
213 /* How to shift the value to BIT0 of the word. */
214 shift_to_word = total_length - (word_offset + word_length);
215
216 /* How to shift the value to the field within the word. */
ac188222 217 if (CGEN_INSN_LSB0_P)
a143b004 218 shift_within_word = start + 1 - length;
ac188222 219 else
a143b004
AB
220 shift_within_word = word_length - start - length;
221
222 /* The total SHIFT, then mask in the value. */
223 shift = shift_to_word + shift_within_word;
ac188222
DB
224 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
225 }
226
227#else /* ! CGEN_INT_INSN_P */
228
229 {
230 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
231
232 insert_1 (cd, value, start, length, word_length, bufp);
233 }
234
235#endif /* ! CGEN_INT_INSN_P */
236
237 return NULL;
238}
239
240/* Default insn builder (insert handler).
241 The instruction is recorded in CGEN_INT_INSN_P byte order (meaning
242 that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is
243 recorded in host byte order, otherwise BUFFER is an array of bytes
244 and the value is recorded in target byte order).
245 The result is an error message or NULL if success. */
246
247static const char *
248insert_insn_normal (CGEN_CPU_DESC cd,
249 const CGEN_INSN * insn,
250 CGEN_FIELDS * fields,
251 CGEN_INSN_BYTES_PTR buffer,
252 bfd_vma pc)
253{
254 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
255 unsigned long value;
256 const CGEN_SYNTAX_CHAR_TYPE * syn;
257
258 CGEN_INIT_INSERT (cd);
259 value = CGEN_INSN_BASE_VALUE (insn);
260
261 /* If we're recording insns as numbers (rather than a string of bytes),
262 target byte order handling is deferred until later. */
263
264#if CGEN_INT_INSN_P
265
266 put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
267 CGEN_FIELDS_BITSIZE (fields), value);
268
269#else
270
271 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
272 (unsigned) CGEN_FIELDS_BITSIZE (fields)),
273 value);
274
275#endif /* ! CGEN_INT_INSN_P */
276
277 /* ??? It would be better to scan the format's fields.
278 Still need to be able to insert a value based on the operand though;
279 e.g. storing a branch displacement that got resolved later.
280 Needs more thought first. */
281
282 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
283 {
284 const char *errmsg;
285
286 if (CGEN_SYNTAX_CHAR_P (* syn))
287 continue;
288
289 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
290 fields, buffer, pc);
291 if (errmsg)
292 return errmsg;
293 }
294
295 return NULL;
296}
297
298#if CGEN_INT_INSN_P
299/* Cover function to store an insn value into an integral insn. Must go here
47b0e7ad 300 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
ac188222
DB
301
302static void
303put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
304 CGEN_INSN_BYTES_PTR buf,
305 int length,
306 int insn_length,
307 CGEN_INSN_INT value)
308{
309 /* For architectures with insns smaller than the base-insn-bitsize,
310 length may be too big. */
311 if (length > insn_length)
312 *buf = value;
313 else
314 {
315 int shift = insn_length - length;
316 /* Written this way to avoid undefined behaviour. */
317 CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
47b0e7ad 318
ac188222
DB
319 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
320 }
321}
322#endif
323\f
324/* Operand extraction. */
325
326#if ! CGEN_INT_INSN_P
327
328/* Subroutine of extract_normal.
329 Ensure sufficient bytes are cached in EX_INFO.
330 OFFSET is the offset in bytes from the start of the insn of the value.
331 BYTES is the length of the needed value.
332 Returns 1 for success, 0 for failure. */
333
334static CGEN_INLINE int
335fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
336 CGEN_EXTRACT_INFO *ex_info,
337 int offset,
338 int bytes,
339 bfd_vma pc)
340{
341 /* It's doubtful that the middle part has already been fetched so
342 we don't optimize that case. kiss. */
343 unsigned int mask;
344 disassemble_info *info = (disassemble_info *) ex_info->dis_info;
345
346 /* First do a quick check. */
347 mask = (1 << bytes) - 1;
348 if (((ex_info->valid >> offset) & mask) == mask)
349 return 1;
350
351 /* Search for the first byte we need to read. */
352 for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
353 if (! (mask & ex_info->valid))
354 break;
355
356 if (bytes)
357 {
358 int status;
359
360 pc += offset;
361 status = (*info->read_memory_func)
362 (pc, ex_info->insn_bytes + offset, bytes, info);
363
364 if (status != 0)
365 {
366 (*info->memory_error_func) (status, pc, info);
367 return 0;
368 }
369
370 ex_info->valid |= ((1 << bytes) - 1) << offset;
371 }
372
373 return 1;
374}
375
376/* Subroutine of extract_normal. */
377
378static CGEN_INLINE long
379extract_1 (CGEN_CPU_DESC cd,
380 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
381 int start,
382 int length,
383 int word_length,
384 unsigned char *bufp,
385 bfd_vma pc ATTRIBUTE_UNUSED)
386{
387 unsigned long x;
388 int shift;
47b0e7ad 389
ac188222
DB
390 x = cgen_get_insn_value (cd, bufp, word_length);
391
392 if (CGEN_INSN_LSB0_P)
393 shift = (start + 1) - length;
394 else
395 shift = (word_length - (start + length));
396 return x >> shift;
397}
398
399#endif /* ! CGEN_INT_INSN_P */
400
401/* Default extraction routine.
402
403 INSN_VALUE is the first base_insn_bitsize bits of the insn in host order,
404 or sometimes less for cases like the m32r where the base insn size is 32
405 but some insns are 16 bits.
406 ATTRS is a mask of the boolean attributes. We only need `SIGNED',
407 but for generality we take a bitmask of all of them.
408 WORD_OFFSET is the offset in bits from the start of the insn of the value.
409 WORD_LENGTH is the length of the word in bits in which the value resides.
410 START is the starting bit number in the word, architecture origin.
411 LENGTH is the length of VALUE in bits.
412 TOTAL_LENGTH is the total length of the insn in bits.
413
414 Returns 1 for success, 0 for failure. */
415
416/* ??? The return code isn't properly used. wip. */
417
418/* ??? This doesn't handle bfd_vma's. Create another function when
419 necessary. */
420
421static int
422extract_normal (CGEN_CPU_DESC cd,
423#if ! CGEN_INT_INSN_P
424 CGEN_EXTRACT_INFO *ex_info,
425#else
426 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
427#endif
428 CGEN_INSN_INT insn_value,
429 unsigned int attrs,
430 unsigned int word_offset,
431 unsigned int start,
432 unsigned int length,
433 unsigned int word_length,
434 unsigned int total_length,
435#if ! CGEN_INT_INSN_P
436 bfd_vma pc,
437#else
438 bfd_vma pc ATTRIBUTE_UNUSED,
439#endif
440 long *valuep)
441{
442 long value, mask;
443
444 /* If LENGTH is zero, this operand doesn't contribute to the value
445 so give it a standard value of zero. */
446 if (length == 0)
447 {
448 *valuep = 0;
449 return 1;
450 }
451
b7cd1872 452 if (word_length > 8 * sizeof (CGEN_INSN_INT))
ac188222
DB
453 abort ();
454
455 /* For architectures with insns smaller than the insn-base-bitsize,
456 word_length may be too big. */
457 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
458 {
1620f33d
AM
459 if (word_offset + word_length > total_length)
460 word_length = total_length - word_offset;
ac188222
DB
461 }
462
463 /* Does the value reside in INSN_VALUE, and at the right alignment? */
464
465 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
466 {
467 if (CGEN_INSN_LSB0_P)
468 value = insn_value >> ((word_offset + start + 1) - length);
469 else
470 value = insn_value >> (total_length - ( word_offset + start + length));
471 }
472
473#if ! CGEN_INT_INSN_P
474
475 else
476 {
477 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
478
b7cd1872 479 if (word_length > 8 * sizeof (CGEN_INSN_INT))
ac188222
DB
480 abort ();
481
482 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
483 return 0;
484
485 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
486 }
487
488#endif /* ! CGEN_INT_INSN_P */
489
490 /* Written this way to avoid undefined behaviour. */
491 mask = (((1L << (length - 1)) - 1) << 1) | 1;
492
493 value &= mask;
494 /* sign extend? */
495 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
496 && (value & (1L << (length - 1))))
497 value |= ~mask;
498
499 *valuep = value;
500
501 return 1;
502}
503
504/* Default insn extractor.
505
506 INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
507 The extracted fields are stored in FIELDS.
508 EX_INFO is used to handle reading variable length insns.
509 Return the length of the insn in bits, or 0 if no match,
510 or -1 if an error occurs fetching data (memory_error_func will have
511 been called). */
512
513static int
514extract_insn_normal (CGEN_CPU_DESC cd,
515 const CGEN_INSN *insn,
516 CGEN_EXTRACT_INFO *ex_info,
517 CGEN_INSN_INT insn_value,
518 CGEN_FIELDS *fields,
519 bfd_vma pc)
520{
521 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
522 const CGEN_SYNTAX_CHAR_TYPE *syn;
523
524 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
525
526 CGEN_INIT_EXTRACT (cd);
527
528 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
529 {
530 int length;
531
532 if (CGEN_SYNTAX_CHAR_P (*syn))
533 continue;
534
535 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
536 ex_info, insn_value, fields, pc);
537 if (length <= 0)
538 return length;
539 }
540
541 /* We recognized and successfully extracted this insn. */
542 return CGEN_INSN_BITSIZE (insn);
543}
544\f
47b0e7ad 545/* Machine generated code added here. */
ac188222 546
d031aafb 547const char * mt_cgen_insert_operand
47b0e7ad 548 (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
ac188222
DB
549
550/* Main entry point for operand insertion.
551
552 This function is basically just a big switch statement. Earlier versions
553 used tables to look up the function to use, but
554 - if the table contains both assembler and disassembler functions then
555 the disassembler contains much of the assembler and vice-versa,
556 - there's a lot of inlining possibilities as things grow,
557 - using a switch statement avoids the function call overhead.
558
559 This function could be moved into `parse_insn_normal', but keeping it
560 separate makes clear the interface between `parse_insn_normal' and each of
561 the handlers. It's also needed by GAS to insert operands that couldn't be
562 resolved during parsing. */
563
564const char *
d031aafb 565mt_cgen_insert_operand (CGEN_CPU_DESC cd,
47b0e7ad
NC
566 int opindex,
567 CGEN_FIELDS * fields,
568 CGEN_INSN_BYTES_PTR buffer,
569 bfd_vma pc ATTRIBUTE_UNUSED)
ac188222
DB
570{
571 const char * errmsg = NULL;
572 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
573
574 switch (opindex)
575 {
d031aafb 576 case MT_OPERAND_A23 :
ac188222
DB
577 errmsg = insert_normal (cd, fields->f_a23, 0, 0, 23, 1, 32, total_length, buffer);
578 break;
d031aafb 579 case MT_OPERAND_BALL :
ac188222
DB
580 errmsg = insert_normal (cd, fields->f_ball, 0, 0, 19, 1, 32, total_length, buffer);
581 break;
d031aafb 582 case MT_OPERAND_BALL2 :
ac188222
DB
583 errmsg = insert_normal (cd, fields->f_ball2, 0, 0, 15, 1, 32, total_length, buffer);
584 break;
d031aafb 585 case MT_OPERAND_BANKADDR :
ac188222
DB
586 errmsg = insert_normal (cd, fields->f_bankaddr, 0, 0, 25, 13, 32, total_length, buffer);
587 break;
d031aafb 588 case MT_OPERAND_BRC :
ac188222
DB
589 errmsg = insert_normal (cd, fields->f_brc, 0, 0, 18, 3, 32, total_length, buffer);
590 break;
d031aafb 591 case MT_OPERAND_BRC2 :
ac188222
DB
592 errmsg = insert_normal (cd, fields->f_brc2, 0, 0, 14, 3, 32, total_length, buffer);
593 break;
d031aafb 594 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
595 errmsg = insert_normal (cd, fields->f_cb1incr, 0|(1<<CGEN_IFLD_SIGNED), 0, 19, 6, 32, total_length, buffer);
596 break;
d031aafb 597 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
598 errmsg = insert_normal (cd, fields->f_cb1sel, 0, 0, 25, 3, 32, total_length, buffer);
599 break;
d031aafb 600 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
601 errmsg = insert_normal (cd, fields->f_cb2incr, 0|(1<<CGEN_IFLD_SIGNED), 0, 13, 6, 32, total_length, buffer);
602 break;
d031aafb 603 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
604 errmsg = insert_normal (cd, fields->f_cb2sel, 0, 0, 22, 3, 32, total_length, buffer);
605 break;
d031aafb 606 case MT_OPERAND_CBRB :
ac188222
DB
607 errmsg = insert_normal (cd, fields->f_cbrb, 0, 0, 10, 1, 32, total_length, buffer);
608 break;
d031aafb 609 case MT_OPERAND_CBS :
ac188222
DB
610 errmsg = insert_normal (cd, fields->f_cbs, 0, 0, 19, 2, 32, total_length, buffer);
611 break;
d031aafb 612 case MT_OPERAND_CBX :
ac188222
DB
613 errmsg = insert_normal (cd, fields->f_cbx, 0, 0, 14, 3, 32, total_length, buffer);
614 break;
d031aafb 615 case MT_OPERAND_CCB :
ac188222
DB
616 errmsg = insert_normal (cd, fields->f_ccb, 0, 0, 11, 1, 32, total_length, buffer);
617 break;
d031aafb 618 case MT_OPERAND_CDB :
ac188222
DB
619 errmsg = insert_normal (cd, fields->f_cdb, 0, 0, 10, 1, 32, total_length, buffer);
620 break;
d031aafb 621 case MT_OPERAND_CELL :
ac188222
DB
622 errmsg = insert_normal (cd, fields->f_cell, 0, 0, 9, 3, 32, total_length, buffer);
623 break;
d031aafb 624 case MT_OPERAND_COLNUM :
ac188222
DB
625 errmsg = insert_normal (cd, fields->f_colnum, 0, 0, 18, 3, 32, total_length, buffer);
626 break;
d031aafb 627 case MT_OPERAND_CONTNUM :
ac188222
DB
628 errmsg = insert_normal (cd, fields->f_contnum, 0, 0, 8, 9, 32, total_length, buffer);
629 break;
d031aafb 630 case MT_OPERAND_CR :
ac188222
DB
631 errmsg = insert_normal (cd, fields->f_cr, 0, 0, 22, 3, 32, total_length, buffer);
632 break;
d031aafb 633 case MT_OPERAND_CTXDISP :
ac188222
DB
634 errmsg = insert_normal (cd, fields->f_ctxdisp, 0, 0, 5, 6, 32, total_length, buffer);
635 break;
d031aafb 636 case MT_OPERAND_DUP :
ac188222
DB
637 errmsg = insert_normal (cd, fields->f_dup, 0, 0, 6, 1, 32, total_length, buffer);
638 break;
d031aafb 639 case MT_OPERAND_FBDISP :
ac188222
DB
640 errmsg = insert_normal (cd, fields->f_fbdisp, 0, 0, 15, 6, 32, total_length, buffer);
641 break;
d031aafb 642 case MT_OPERAND_FBINCR :
ac188222
DB
643 errmsg = insert_normal (cd, fields->f_fbincr, 0, 0, 23, 4, 32, total_length, buffer);
644 break;
d031aafb 645 case MT_OPERAND_FRDR :
ac188222
DB
646 errmsg = insert_normal (cd, fields->f_dr, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, buffer);
647 break;
d031aafb 648 case MT_OPERAND_FRDRRR :
ac188222
DB
649 errmsg = insert_normal (cd, fields->f_drrr, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 15, 4, 32, total_length, buffer);
650 break;
d031aafb 651 case MT_OPERAND_FRSR1 :
ac188222
DB
652 errmsg = insert_normal (cd, fields->f_sr1, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 23, 4, 32, total_length, buffer);
653 break;
d031aafb 654 case MT_OPERAND_FRSR2 :
ac188222
DB
655 errmsg = insert_normal (cd, fields->f_sr2, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, buffer);
656 break;
d031aafb 657 case MT_OPERAND_ID :
ac188222
DB
658 errmsg = insert_normal (cd, fields->f_id, 0, 0, 14, 1, 32, total_length, buffer);
659 break;
d031aafb 660 case MT_OPERAND_IMM16 :
ac188222
DB
661 {
662 long value = fields->f_imm16s;
663 value = ((value) + (0));
664 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
665 }
666 break;
d031aafb 667 case MT_OPERAND_IMM16L :
6f84a2a6
NS
668 errmsg = insert_normal (cd, fields->f_imm16l, 0, 0, 23, 16, 32, total_length, buffer);
669 break;
d031aafb 670 case MT_OPERAND_IMM16O :
ac188222
DB
671 {
672 long value = fields->f_imm16s;
673 value = ((value) + (0));
674 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
675 }
676 break;
d031aafb 677 case MT_OPERAND_IMM16Z :
ac188222
DB
678 errmsg = insert_normal (cd, fields->f_imm16u, 0, 0, 15, 16, 32, total_length, buffer);
679 break;
d031aafb 680 case MT_OPERAND_INCAMT :
ac188222
DB
681 errmsg = insert_normal (cd, fields->f_incamt, 0, 0, 19, 8, 32, total_length, buffer);
682 break;
d031aafb 683 case MT_OPERAND_INCR :
ac188222
DB
684 errmsg = insert_normal (cd, fields->f_incr, 0, 0, 17, 6, 32, total_length, buffer);
685 break;
d031aafb 686 case MT_OPERAND_LENGTH :
ac188222
DB
687 errmsg = insert_normal (cd, fields->f_length, 0, 0, 15, 3, 32, total_length, buffer);
688 break;
d031aafb 689 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
690 {
691 long value = fields->f_loopo;
fe8afbc4 692 value = ((USI) (value) >> (2));
6f84a2a6
NS
693 errmsg = insert_normal (cd, value, 0, 0, 7, 8, 32, total_length, buffer);
694 }
695 break;
d031aafb 696 case MT_OPERAND_MASK :
ac188222
DB
697 errmsg = insert_normal (cd, fields->f_mask, 0, 0, 25, 16, 32, total_length, buffer);
698 break;
d031aafb 699 case MT_OPERAND_MASK1 :
ac188222
DB
700 errmsg = insert_normal (cd, fields->f_mask1, 0, 0, 22, 3, 32, total_length, buffer);
701 break;
d031aafb 702 case MT_OPERAND_MODE :
ac188222
DB
703 errmsg = insert_normal (cd, fields->f_mode, 0, 0, 25, 2, 32, total_length, buffer);
704 break;
d031aafb 705 case MT_OPERAND_PERM :
ac188222
DB
706 errmsg = insert_normal (cd, fields->f_perm, 0, 0, 25, 2, 32, total_length, buffer);
707 break;
d031aafb 708 case MT_OPERAND_RBBC :
ac188222
DB
709 errmsg = insert_normal (cd, fields->f_rbbc, 0, 0, 25, 2, 32, total_length, buffer);
710 break;
d031aafb 711 case MT_OPERAND_RC :
ac188222
DB
712 errmsg = insert_normal (cd, fields->f_rc, 0, 0, 15, 1, 32, total_length, buffer);
713 break;
d031aafb 714 case MT_OPERAND_RC1 :
ac188222
DB
715 errmsg = insert_normal (cd, fields->f_rc1, 0, 0, 11, 1, 32, total_length, buffer);
716 break;
d031aafb 717 case MT_OPERAND_RC2 :
ac188222
DB
718 errmsg = insert_normal (cd, fields->f_rc2, 0, 0, 6, 1, 32, total_length, buffer);
719 break;
d031aafb 720 case MT_OPERAND_RC3 :
6f84a2a6
NS
721 errmsg = insert_normal (cd, fields->f_rc3, 0, 0, 7, 1, 32, total_length, buffer);
722 break;
d031aafb 723 case MT_OPERAND_RCNUM :
ac188222
DB
724 errmsg = insert_normal (cd, fields->f_rcnum, 0, 0, 14, 3, 32, total_length, buffer);
725 break;
d031aafb 726 case MT_OPERAND_RDA :
ac188222
DB
727 errmsg = insert_normal (cd, fields->f_rda, 0, 0, 25, 1, 32, total_length, buffer);
728 break;
d031aafb 729 case MT_OPERAND_ROWNUM :
ac188222
DB
730 errmsg = insert_normal (cd, fields->f_rownum, 0, 0, 14, 3, 32, total_length, buffer);
731 break;
d031aafb 732 case MT_OPERAND_ROWNUM1 :
ac188222
DB
733 errmsg = insert_normal (cd, fields->f_rownum1, 0, 0, 12, 3, 32, total_length, buffer);
734 break;
d031aafb 735 case MT_OPERAND_ROWNUM2 :
ac188222
DB
736 errmsg = insert_normal (cd, fields->f_rownum2, 0, 0, 9, 3, 32, total_length, buffer);
737 break;
d031aafb 738 case MT_OPERAND_SIZE :
ac188222
DB
739 errmsg = insert_normal (cd, fields->f_size, 0, 0, 13, 14, 32, total_length, buffer);
740 break;
d031aafb 741 case MT_OPERAND_TYPE :
ac188222
DB
742 errmsg = insert_normal (cd, fields->f_type, 0, 0, 21, 2, 32, total_length, buffer);
743 break;
d031aafb 744 case MT_OPERAND_WR :
ac188222
DB
745 errmsg = insert_normal (cd, fields->f_wr, 0, 0, 24, 1, 32, total_length, buffer);
746 break;
d031aafb 747 case MT_OPERAND_XMODE :
ac188222
DB
748 errmsg = insert_normal (cd, fields->f_xmode, 0, 0, 23, 1, 32, total_length, buffer);
749 break;
750
751 default :
752 /* xgettext:c-format */
753 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
754 opindex);
755 abort ();
756 }
757
758 return errmsg;
759}
760
d031aafb 761int mt_cgen_extract_operand
47b0e7ad 762 (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
ac188222
DB
763
764/* Main entry point for operand extraction.
765 The result is <= 0 for error, >0 for success.
766 ??? Actual values aren't well defined right now.
767
768 This function is basically just a big switch statement. Earlier versions
769 used tables to look up the function to use, but
770 - if the table contains both assembler and disassembler functions then
771 the disassembler contains much of the assembler and vice-versa,
772 - there's a lot of inlining possibilities as things grow,
773 - using a switch statement avoids the function call overhead.
774
775 This function could be moved into `print_insn_normal', but keeping it
776 separate makes clear the interface between `print_insn_normal' and each of
777 the handlers. */
778
779int
d031aafb 780mt_cgen_extract_operand (CGEN_CPU_DESC cd,
47b0e7ad
NC
781 int opindex,
782 CGEN_EXTRACT_INFO *ex_info,
783 CGEN_INSN_INT insn_value,
784 CGEN_FIELDS * fields,
785 bfd_vma pc)
ac188222
DB
786{
787 /* Assume success (for those operands that are nops). */
788 int length = 1;
789 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
790
791 switch (opindex)
792 {
d031aafb 793 case MT_OPERAND_A23 :
ac188222
DB
794 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 1, 32, total_length, pc, & fields->f_a23);
795 break;
d031aafb 796 case MT_OPERAND_BALL :
ac188222
DB
797 length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 1, 32, total_length, pc, & fields->f_ball);
798 break;
d031aafb 799 case MT_OPERAND_BALL2 :
ac188222
DB
800 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_ball2);
801 break;
d031aafb 802 case MT_OPERAND_BANKADDR :
ac188222
DB
803 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 13, 32, total_length, pc, & fields->f_bankaddr);
804 break;
d031aafb 805 case MT_OPERAND_BRC :
ac188222
DB
806 length = extract_normal (cd, ex_info, insn_value, 0, 0, 18, 3, 32, total_length, pc, & fields->f_brc);
807 break;
d031aafb 808 case MT_OPERAND_BRC2 :
ac188222
DB
809 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_brc2);
810 break;
d031aafb 811 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
812 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 19, 6, 32, total_length, pc, & fields->f_cb1incr);
813 break;
d031aafb 814 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
815 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_cb1sel);
816 break;
d031aafb 817 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
818 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 13, 6, 32, total_length, pc, & fields->f_cb2incr);
819 break;
d031aafb 820 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
821 length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_cb2sel);
822 break;
d031aafb 823 case MT_OPERAND_CBRB :
ac188222
DB
824 length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 1, 32, total_length, pc, & fields->f_cbrb);
825 break;
d031aafb 826 case MT_OPERAND_CBS :
ac188222
DB
827 length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 2, 32, total_length, pc, & fields->f_cbs);
828 break;
d031aafb 829 case MT_OPERAND_CBX :
ac188222
DB
830 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_cbx);
831 break;
d031aafb 832 case MT_OPERAND_CCB :
ac188222
DB
833 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_ccb);
834 break;
d031aafb 835 case MT_OPERAND_CDB :
ac188222
DB
836 length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 1, 32, total_length, pc, & fields->f_cdb);
837 break;
d031aafb 838 case MT_OPERAND_CELL :
ac188222
DB
839 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_cell);
840 break;
d031aafb 841 case MT_OPERAND_COLNUM :
ac188222
DB
842 length = extract_normal (cd, ex_info, insn_value, 0, 0, 18, 3, 32, total_length, pc, & fields->f_colnum);
843 break;
d031aafb 844 case MT_OPERAND_CONTNUM :
ac188222
DB
845 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 9, 32, total_length, pc, & fields->f_contnum);
846 break;
d031aafb 847 case MT_OPERAND_CR :
ac188222
DB
848 length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_cr);
849 break;
d031aafb 850 case MT_OPERAND_CTXDISP :
ac188222
DB
851 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_ctxdisp);
852 break;
d031aafb 853 case MT_OPERAND_DUP :
ac188222
DB
854 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_dup);
855 break;
d031aafb 856 case MT_OPERAND_FBDISP :
ac188222
DB
857 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_fbdisp);
858 break;
d031aafb 859 case MT_OPERAND_FBINCR :
ac188222
DB
860 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 4, 32, total_length, pc, & fields->f_fbincr);
861 break;
d031aafb 862 case MT_OPERAND_FRDR :
ac188222
DB
863 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 break;
d031aafb 865 case MT_OPERAND_FRDRRR :
ac188222
DB
866 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 break;
d031aafb 868 case MT_OPERAND_FRSR1 :
ac188222
DB
869 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 break;
d031aafb 871 case MT_OPERAND_FRSR2 :
ac188222
DB
872 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 19, 4, 32, total_length, pc, & fields->f_sr2);
873 break;
d031aafb 874 case MT_OPERAND_ID :
ac188222
DB
875 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 1, 32, total_length, pc, & fields->f_id);
876 break;
d031aafb 877 case MT_OPERAND_IMM16 :
ac188222
DB
878 {
879 long value;
880 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & value);
881 value = ((value) + (0));
882 fields->f_imm16s = value;
883 }
884 break;
d031aafb 885 case MT_OPERAND_IMM16L :
6f84a2a6
NS
886 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 16, 32, total_length, pc, & fields->f_imm16l);
887 break;
d031aafb 888 case MT_OPERAND_IMM16O :
ac188222
DB
889 {
890 long value;
891 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & value);
892 value = ((value) + (0));
893 fields->f_imm16s = value;
894 }
895 break;
d031aafb 896 case MT_OPERAND_IMM16Z :
ac188222
DB
897 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_imm16u);
898 break;
d031aafb 899 case MT_OPERAND_INCAMT :
ac188222
DB
900 length = extract_normal (cd, ex_info, insn_value, 0, 0, 19, 8, 32, total_length, pc, & fields->f_incamt);
901 break;
d031aafb 902 case MT_OPERAND_INCR :
ac188222
DB
903 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_incr);
904 break;
d031aafb 905 case MT_OPERAND_LENGTH :
ac188222
DB
906 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_length);
907 break;
d031aafb 908 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
909 {
910 long value;
911 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 8, 32, total_length, pc, & value);
912 value = ((((value) << (2))) + (8));
913 fields->f_loopo = value;
914 }
915 break;
d031aafb 916 case MT_OPERAND_MASK :
ac188222
DB
917 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 16, 32, total_length, pc, & fields->f_mask);
918 break;
d031aafb 919 case MT_OPERAND_MASK1 :
ac188222
DB
920 length = extract_normal (cd, ex_info, insn_value, 0, 0, 22, 3, 32, total_length, pc, & fields->f_mask1);
921 break;
d031aafb 922 case MT_OPERAND_MODE :
ac188222
DB
923 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_mode);
924 break;
d031aafb 925 case MT_OPERAND_PERM :
ac188222
DB
926 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_perm);
927 break;
d031aafb 928 case MT_OPERAND_RBBC :
ac188222
DB
929 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 2, 32, total_length, pc, & fields->f_rbbc);
930 break;
d031aafb 931 case MT_OPERAND_RC :
ac188222
DB
932 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & fields->f_rc);
933 break;
d031aafb 934 case MT_OPERAND_RC1 :
ac188222
DB
935 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 1, 32, total_length, pc, & fields->f_rc1);
936 break;
d031aafb 937 case MT_OPERAND_RC2 :
ac188222
DB
938 length = extract_normal (cd, ex_info, insn_value, 0, 0, 6, 1, 32, total_length, pc, & fields->f_rc2);
939 break;
d031aafb 940 case MT_OPERAND_RC3 :
6f84a2a6
NS
941 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 1, 32, total_length, pc, & fields->f_rc3);
942 break;
d031aafb 943 case MT_OPERAND_RCNUM :
ac188222
DB
944 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_rcnum);
945 break;
d031aafb 946 case MT_OPERAND_RDA :
ac188222
DB
947 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_rda);
948 break;
d031aafb 949 case MT_OPERAND_ROWNUM :
ac188222
DB
950 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_rownum);
951 break;
d031aafb 952 case MT_OPERAND_ROWNUM1 :
ac188222
DB
953 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rownum1);
954 break;
d031aafb 955 case MT_OPERAND_ROWNUM2 :
ac188222
DB
956 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rownum2);
957 break;
d031aafb 958 case MT_OPERAND_SIZE :
ac188222
DB
959 length = extract_normal (cd, ex_info, insn_value, 0, 0, 13, 14, 32, total_length, pc, & fields->f_size);
960 break;
d031aafb 961 case MT_OPERAND_TYPE :
ac188222
DB
962 length = extract_normal (cd, ex_info, insn_value, 0, 0, 21, 2, 32, total_length, pc, & fields->f_type);
963 break;
d031aafb 964 case MT_OPERAND_WR :
ac188222
DB
965 length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 1, 32, total_length, pc, & fields->f_wr);
966 break;
d031aafb 967 case MT_OPERAND_XMODE :
ac188222
DB
968 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 1, 32, total_length, pc, & fields->f_xmode);
969 break;
970
971 default :
972 /* xgettext:c-format */
973 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
974 opindex);
975 abort ();
976 }
977
978 return length;
979}
980
43e65147 981cgen_insert_fn * const mt_cgen_insert_handlers[] =
ac188222
DB
982{
983 insert_insn_normal,
984};
985
43e65147 986cgen_extract_fn * const mt_cgen_extract_handlers[] =
ac188222
DB
987{
988 extract_insn_normal,
989};
990
d031aafb
NS
991int mt_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
992bfd_vma mt_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
ac188222
DB
993
994/* Getting values from cgen_fields is handled by a collection of functions.
995 They are distinguished by the type of the VALUE argument they return.
996 TODO: floating point, inlining support, remove cases where result type
997 not appropriate. */
998
999int
d031aafb 1000mt_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
47b0e7ad
NC
1001 int opindex,
1002 const CGEN_FIELDS * fields)
ac188222
DB
1003{
1004 int value;
1005
1006 switch (opindex)
1007 {
d031aafb 1008 case MT_OPERAND_A23 :
ac188222
DB
1009 value = fields->f_a23;
1010 break;
d031aafb 1011 case MT_OPERAND_BALL :
ac188222
DB
1012 value = fields->f_ball;
1013 break;
d031aafb 1014 case MT_OPERAND_BALL2 :
ac188222
DB
1015 value = fields->f_ball2;
1016 break;
d031aafb 1017 case MT_OPERAND_BANKADDR :
ac188222
DB
1018 value = fields->f_bankaddr;
1019 break;
d031aafb 1020 case MT_OPERAND_BRC :
ac188222
DB
1021 value = fields->f_brc;
1022 break;
d031aafb 1023 case MT_OPERAND_BRC2 :
ac188222
DB
1024 value = fields->f_brc2;
1025 break;
d031aafb 1026 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
1027 value = fields->f_cb1incr;
1028 break;
d031aafb 1029 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
1030 value = fields->f_cb1sel;
1031 break;
d031aafb 1032 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
1033 value = fields->f_cb2incr;
1034 break;
d031aafb 1035 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
1036 value = fields->f_cb2sel;
1037 break;
d031aafb 1038 case MT_OPERAND_CBRB :
ac188222
DB
1039 value = fields->f_cbrb;
1040 break;
d031aafb 1041 case MT_OPERAND_CBS :
ac188222
DB
1042 value = fields->f_cbs;
1043 break;
d031aafb 1044 case MT_OPERAND_CBX :
ac188222
DB
1045 value = fields->f_cbx;
1046 break;
d031aafb 1047 case MT_OPERAND_CCB :
ac188222
DB
1048 value = fields->f_ccb;
1049 break;
d031aafb 1050 case MT_OPERAND_CDB :
ac188222
DB
1051 value = fields->f_cdb;
1052 break;
d031aafb 1053 case MT_OPERAND_CELL :
ac188222
DB
1054 value = fields->f_cell;
1055 break;
d031aafb 1056 case MT_OPERAND_COLNUM :
ac188222
DB
1057 value = fields->f_colnum;
1058 break;
d031aafb 1059 case MT_OPERAND_CONTNUM :
ac188222
DB
1060 value = fields->f_contnum;
1061 break;
d031aafb 1062 case MT_OPERAND_CR :
ac188222
DB
1063 value = fields->f_cr;
1064 break;
d031aafb 1065 case MT_OPERAND_CTXDISP :
ac188222
DB
1066 value = fields->f_ctxdisp;
1067 break;
d031aafb 1068 case MT_OPERAND_DUP :
ac188222
DB
1069 value = fields->f_dup;
1070 break;
d031aafb 1071 case MT_OPERAND_FBDISP :
ac188222
DB
1072 value = fields->f_fbdisp;
1073 break;
d031aafb 1074 case MT_OPERAND_FBINCR :
ac188222
DB
1075 value = fields->f_fbincr;
1076 break;
d031aafb 1077 case MT_OPERAND_FRDR :
ac188222
DB
1078 value = fields->f_dr;
1079 break;
d031aafb 1080 case MT_OPERAND_FRDRRR :
ac188222
DB
1081 value = fields->f_drrr;
1082 break;
d031aafb 1083 case MT_OPERAND_FRSR1 :
ac188222
DB
1084 value = fields->f_sr1;
1085 break;
d031aafb 1086 case MT_OPERAND_FRSR2 :
ac188222
DB
1087 value = fields->f_sr2;
1088 break;
d031aafb 1089 case MT_OPERAND_ID :
ac188222
DB
1090 value = fields->f_id;
1091 break;
d031aafb 1092 case MT_OPERAND_IMM16 :
ac188222
DB
1093 value = fields->f_imm16s;
1094 break;
d031aafb 1095 case MT_OPERAND_IMM16L :
6f84a2a6
NS
1096 value = fields->f_imm16l;
1097 break;
d031aafb 1098 case MT_OPERAND_IMM16O :
ac188222
DB
1099 value = fields->f_imm16s;
1100 break;
d031aafb 1101 case MT_OPERAND_IMM16Z :
ac188222
DB
1102 value = fields->f_imm16u;
1103 break;
d031aafb 1104 case MT_OPERAND_INCAMT :
ac188222
DB
1105 value = fields->f_incamt;
1106 break;
d031aafb 1107 case MT_OPERAND_INCR :
ac188222
DB
1108 value = fields->f_incr;
1109 break;
d031aafb 1110 case MT_OPERAND_LENGTH :
ac188222
DB
1111 value = fields->f_length;
1112 break;
d031aafb 1113 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
1114 value = fields->f_loopo;
1115 break;
d031aafb 1116 case MT_OPERAND_MASK :
ac188222
DB
1117 value = fields->f_mask;
1118 break;
d031aafb 1119 case MT_OPERAND_MASK1 :
ac188222
DB
1120 value = fields->f_mask1;
1121 break;
d031aafb 1122 case MT_OPERAND_MODE :
ac188222
DB
1123 value = fields->f_mode;
1124 break;
d031aafb 1125 case MT_OPERAND_PERM :
ac188222
DB
1126 value = fields->f_perm;
1127 break;
d031aafb 1128 case MT_OPERAND_RBBC :
ac188222
DB
1129 value = fields->f_rbbc;
1130 break;
d031aafb 1131 case MT_OPERAND_RC :
ac188222
DB
1132 value = fields->f_rc;
1133 break;
d031aafb 1134 case MT_OPERAND_RC1 :
ac188222
DB
1135 value = fields->f_rc1;
1136 break;
d031aafb 1137 case MT_OPERAND_RC2 :
ac188222
DB
1138 value = fields->f_rc2;
1139 break;
d031aafb 1140 case MT_OPERAND_RC3 :
6f84a2a6
NS
1141 value = fields->f_rc3;
1142 break;
d031aafb 1143 case MT_OPERAND_RCNUM :
ac188222
DB
1144 value = fields->f_rcnum;
1145 break;
d031aafb 1146 case MT_OPERAND_RDA :
ac188222
DB
1147 value = fields->f_rda;
1148 break;
d031aafb 1149 case MT_OPERAND_ROWNUM :
ac188222
DB
1150 value = fields->f_rownum;
1151 break;
d031aafb 1152 case MT_OPERAND_ROWNUM1 :
ac188222
DB
1153 value = fields->f_rownum1;
1154 break;
d031aafb 1155 case MT_OPERAND_ROWNUM2 :
ac188222
DB
1156 value = fields->f_rownum2;
1157 break;
d031aafb 1158 case MT_OPERAND_SIZE :
ac188222
DB
1159 value = fields->f_size;
1160 break;
d031aafb 1161 case MT_OPERAND_TYPE :
ac188222
DB
1162 value = fields->f_type;
1163 break;
d031aafb 1164 case MT_OPERAND_WR :
ac188222
DB
1165 value = fields->f_wr;
1166 break;
d031aafb 1167 case MT_OPERAND_XMODE :
ac188222
DB
1168 value = fields->f_xmode;
1169 break;
1170
1171 default :
1172 /* xgettext:c-format */
1173 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1174 opindex);
1175 abort ();
1176 }
1177
1178 return value;
1179}
1180
1181bfd_vma
d031aafb 1182mt_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
47b0e7ad
NC
1183 int opindex,
1184 const CGEN_FIELDS * fields)
ac188222
DB
1185{
1186 bfd_vma value;
1187
1188 switch (opindex)
1189 {
d031aafb 1190 case MT_OPERAND_A23 :
ac188222
DB
1191 value = fields->f_a23;
1192 break;
d031aafb 1193 case MT_OPERAND_BALL :
ac188222
DB
1194 value = fields->f_ball;
1195 break;
d031aafb 1196 case MT_OPERAND_BALL2 :
ac188222
DB
1197 value = fields->f_ball2;
1198 break;
d031aafb 1199 case MT_OPERAND_BANKADDR :
ac188222
DB
1200 value = fields->f_bankaddr;
1201 break;
d031aafb 1202 case MT_OPERAND_BRC :
ac188222
DB
1203 value = fields->f_brc;
1204 break;
d031aafb 1205 case MT_OPERAND_BRC2 :
ac188222
DB
1206 value = fields->f_brc2;
1207 break;
d031aafb 1208 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
1209 value = fields->f_cb1incr;
1210 break;
d031aafb 1211 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
1212 value = fields->f_cb1sel;
1213 break;
d031aafb 1214 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
1215 value = fields->f_cb2incr;
1216 break;
d031aafb 1217 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
1218 value = fields->f_cb2sel;
1219 break;
d031aafb 1220 case MT_OPERAND_CBRB :
ac188222
DB
1221 value = fields->f_cbrb;
1222 break;
d031aafb 1223 case MT_OPERAND_CBS :
ac188222
DB
1224 value = fields->f_cbs;
1225 break;
d031aafb 1226 case MT_OPERAND_CBX :
ac188222
DB
1227 value = fields->f_cbx;
1228 break;
d031aafb 1229 case MT_OPERAND_CCB :
ac188222
DB
1230 value = fields->f_ccb;
1231 break;
d031aafb 1232 case MT_OPERAND_CDB :
ac188222
DB
1233 value = fields->f_cdb;
1234 break;
d031aafb 1235 case MT_OPERAND_CELL :
ac188222
DB
1236 value = fields->f_cell;
1237 break;
d031aafb 1238 case MT_OPERAND_COLNUM :
ac188222
DB
1239 value = fields->f_colnum;
1240 break;
d031aafb 1241 case MT_OPERAND_CONTNUM :
ac188222
DB
1242 value = fields->f_contnum;
1243 break;
d031aafb 1244 case MT_OPERAND_CR :
ac188222
DB
1245 value = fields->f_cr;
1246 break;
d031aafb 1247 case MT_OPERAND_CTXDISP :
ac188222
DB
1248 value = fields->f_ctxdisp;
1249 break;
d031aafb 1250 case MT_OPERAND_DUP :
ac188222
DB
1251 value = fields->f_dup;
1252 break;
d031aafb 1253 case MT_OPERAND_FBDISP :
ac188222
DB
1254 value = fields->f_fbdisp;
1255 break;
d031aafb 1256 case MT_OPERAND_FBINCR :
ac188222
DB
1257 value = fields->f_fbincr;
1258 break;
d031aafb 1259 case MT_OPERAND_FRDR :
ac188222
DB
1260 value = fields->f_dr;
1261 break;
d031aafb 1262 case MT_OPERAND_FRDRRR :
ac188222
DB
1263 value = fields->f_drrr;
1264 break;
d031aafb 1265 case MT_OPERAND_FRSR1 :
ac188222
DB
1266 value = fields->f_sr1;
1267 break;
d031aafb 1268 case MT_OPERAND_FRSR2 :
ac188222
DB
1269 value = fields->f_sr2;
1270 break;
d031aafb 1271 case MT_OPERAND_ID :
ac188222
DB
1272 value = fields->f_id;
1273 break;
d031aafb 1274 case MT_OPERAND_IMM16 :
ac188222
DB
1275 value = fields->f_imm16s;
1276 break;
d031aafb 1277 case MT_OPERAND_IMM16L :
6f84a2a6
NS
1278 value = fields->f_imm16l;
1279 break;
d031aafb 1280 case MT_OPERAND_IMM16O :
ac188222
DB
1281 value = fields->f_imm16s;
1282 break;
d031aafb 1283 case MT_OPERAND_IMM16Z :
ac188222
DB
1284 value = fields->f_imm16u;
1285 break;
d031aafb 1286 case MT_OPERAND_INCAMT :
ac188222
DB
1287 value = fields->f_incamt;
1288 break;
d031aafb 1289 case MT_OPERAND_INCR :
ac188222
DB
1290 value = fields->f_incr;
1291 break;
d031aafb 1292 case MT_OPERAND_LENGTH :
ac188222
DB
1293 value = fields->f_length;
1294 break;
d031aafb 1295 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
1296 value = fields->f_loopo;
1297 break;
d031aafb 1298 case MT_OPERAND_MASK :
ac188222
DB
1299 value = fields->f_mask;
1300 break;
d031aafb 1301 case MT_OPERAND_MASK1 :
ac188222
DB
1302 value = fields->f_mask1;
1303 break;
d031aafb 1304 case MT_OPERAND_MODE :
ac188222
DB
1305 value = fields->f_mode;
1306 break;
d031aafb 1307 case MT_OPERAND_PERM :
ac188222
DB
1308 value = fields->f_perm;
1309 break;
d031aafb 1310 case MT_OPERAND_RBBC :
ac188222
DB
1311 value = fields->f_rbbc;
1312 break;
d031aafb 1313 case MT_OPERAND_RC :
ac188222
DB
1314 value = fields->f_rc;
1315 break;
d031aafb 1316 case MT_OPERAND_RC1 :
ac188222
DB
1317 value = fields->f_rc1;
1318 break;
d031aafb 1319 case MT_OPERAND_RC2 :
ac188222
DB
1320 value = fields->f_rc2;
1321 break;
d031aafb 1322 case MT_OPERAND_RC3 :
6f84a2a6
NS
1323 value = fields->f_rc3;
1324 break;
d031aafb 1325 case MT_OPERAND_RCNUM :
ac188222
DB
1326 value = fields->f_rcnum;
1327 break;
d031aafb 1328 case MT_OPERAND_RDA :
ac188222
DB
1329 value = fields->f_rda;
1330 break;
d031aafb 1331 case MT_OPERAND_ROWNUM :
ac188222
DB
1332 value = fields->f_rownum;
1333 break;
d031aafb 1334 case MT_OPERAND_ROWNUM1 :
ac188222
DB
1335 value = fields->f_rownum1;
1336 break;
d031aafb 1337 case MT_OPERAND_ROWNUM2 :
ac188222
DB
1338 value = fields->f_rownum2;
1339 break;
d031aafb 1340 case MT_OPERAND_SIZE :
ac188222
DB
1341 value = fields->f_size;
1342 break;
d031aafb 1343 case MT_OPERAND_TYPE :
ac188222
DB
1344 value = fields->f_type;
1345 break;
d031aafb 1346 case MT_OPERAND_WR :
ac188222
DB
1347 value = fields->f_wr;
1348 break;
d031aafb 1349 case MT_OPERAND_XMODE :
ac188222
DB
1350 value = fields->f_xmode;
1351 break;
1352
1353 default :
1354 /* xgettext:c-format */
1355 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
1356 opindex);
1357 abort ();
1358 }
1359
1360 return value;
1361}
1362
d031aafb
NS
1363void mt_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1364void mt_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
ac188222
DB
1365
1366/* Stuffing values in cgen_fields is handled by a collection of functions.
1367 They are distinguished by the type of the VALUE argument they accept.
1368 TODO: floating point, inlining support, remove cases where argument type
1369 not appropriate. */
1370
1371void
d031aafb 1372mt_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
47b0e7ad
NC
1373 int opindex,
1374 CGEN_FIELDS * fields,
1375 int value)
ac188222
DB
1376{
1377 switch (opindex)
1378 {
d031aafb 1379 case MT_OPERAND_A23 :
ac188222
DB
1380 fields->f_a23 = value;
1381 break;
d031aafb 1382 case MT_OPERAND_BALL :
ac188222
DB
1383 fields->f_ball = value;
1384 break;
d031aafb 1385 case MT_OPERAND_BALL2 :
ac188222
DB
1386 fields->f_ball2 = value;
1387 break;
d031aafb 1388 case MT_OPERAND_BANKADDR :
ac188222
DB
1389 fields->f_bankaddr = value;
1390 break;
d031aafb 1391 case MT_OPERAND_BRC :
ac188222
DB
1392 fields->f_brc = value;
1393 break;
d031aafb 1394 case MT_OPERAND_BRC2 :
ac188222
DB
1395 fields->f_brc2 = value;
1396 break;
d031aafb 1397 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
1398 fields->f_cb1incr = value;
1399 break;
d031aafb 1400 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
1401 fields->f_cb1sel = value;
1402 break;
d031aafb 1403 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
1404 fields->f_cb2incr = value;
1405 break;
d031aafb 1406 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
1407 fields->f_cb2sel = value;
1408 break;
d031aafb 1409 case MT_OPERAND_CBRB :
ac188222
DB
1410 fields->f_cbrb = value;
1411 break;
d031aafb 1412 case MT_OPERAND_CBS :
ac188222
DB
1413 fields->f_cbs = value;
1414 break;
d031aafb 1415 case MT_OPERAND_CBX :
ac188222
DB
1416 fields->f_cbx = value;
1417 break;
d031aafb 1418 case MT_OPERAND_CCB :
ac188222
DB
1419 fields->f_ccb = value;
1420 break;
d031aafb 1421 case MT_OPERAND_CDB :
ac188222
DB
1422 fields->f_cdb = value;
1423 break;
d031aafb 1424 case MT_OPERAND_CELL :
ac188222
DB
1425 fields->f_cell = value;
1426 break;
d031aafb 1427 case MT_OPERAND_COLNUM :
ac188222
DB
1428 fields->f_colnum = value;
1429 break;
d031aafb 1430 case MT_OPERAND_CONTNUM :
ac188222
DB
1431 fields->f_contnum = value;
1432 break;
d031aafb 1433 case MT_OPERAND_CR :
ac188222
DB
1434 fields->f_cr = value;
1435 break;
d031aafb 1436 case MT_OPERAND_CTXDISP :
ac188222
DB
1437 fields->f_ctxdisp = value;
1438 break;
d031aafb 1439 case MT_OPERAND_DUP :
ac188222
DB
1440 fields->f_dup = value;
1441 break;
d031aafb 1442 case MT_OPERAND_FBDISP :
ac188222
DB
1443 fields->f_fbdisp = value;
1444 break;
d031aafb 1445 case MT_OPERAND_FBINCR :
ac188222
DB
1446 fields->f_fbincr = value;
1447 break;
d031aafb 1448 case MT_OPERAND_FRDR :
ac188222
DB
1449 fields->f_dr = value;
1450 break;
d031aafb 1451 case MT_OPERAND_FRDRRR :
ac188222
DB
1452 fields->f_drrr = value;
1453 break;
d031aafb 1454 case MT_OPERAND_FRSR1 :
ac188222
DB
1455 fields->f_sr1 = value;
1456 break;
d031aafb 1457 case MT_OPERAND_FRSR2 :
ac188222
DB
1458 fields->f_sr2 = value;
1459 break;
d031aafb 1460 case MT_OPERAND_ID :
ac188222
DB
1461 fields->f_id = value;
1462 break;
d031aafb 1463 case MT_OPERAND_IMM16 :
ac188222
DB
1464 fields->f_imm16s = value;
1465 break;
d031aafb 1466 case MT_OPERAND_IMM16L :
6f84a2a6
NS
1467 fields->f_imm16l = value;
1468 break;
d031aafb 1469 case MT_OPERAND_IMM16O :
ac188222
DB
1470 fields->f_imm16s = value;
1471 break;
d031aafb 1472 case MT_OPERAND_IMM16Z :
ac188222
DB
1473 fields->f_imm16u = value;
1474 break;
d031aafb 1475 case MT_OPERAND_INCAMT :
ac188222
DB
1476 fields->f_incamt = value;
1477 break;
d031aafb 1478 case MT_OPERAND_INCR :
ac188222
DB
1479 fields->f_incr = value;
1480 break;
d031aafb 1481 case MT_OPERAND_LENGTH :
ac188222
DB
1482 fields->f_length = value;
1483 break;
d031aafb 1484 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
1485 fields->f_loopo = value;
1486 break;
d031aafb 1487 case MT_OPERAND_MASK :
ac188222
DB
1488 fields->f_mask = value;
1489 break;
d031aafb 1490 case MT_OPERAND_MASK1 :
ac188222
DB
1491 fields->f_mask1 = value;
1492 break;
d031aafb 1493 case MT_OPERAND_MODE :
ac188222
DB
1494 fields->f_mode = value;
1495 break;
d031aafb 1496 case MT_OPERAND_PERM :
ac188222
DB
1497 fields->f_perm = value;
1498 break;
d031aafb 1499 case MT_OPERAND_RBBC :
ac188222
DB
1500 fields->f_rbbc = value;
1501 break;
d031aafb 1502 case MT_OPERAND_RC :
ac188222
DB
1503 fields->f_rc = value;
1504 break;
d031aafb 1505 case MT_OPERAND_RC1 :
ac188222
DB
1506 fields->f_rc1 = value;
1507 break;
d031aafb 1508 case MT_OPERAND_RC2 :
ac188222
DB
1509 fields->f_rc2 = value;
1510 break;
d031aafb 1511 case MT_OPERAND_RC3 :
6f84a2a6
NS
1512 fields->f_rc3 = value;
1513 break;
d031aafb 1514 case MT_OPERAND_RCNUM :
ac188222
DB
1515 fields->f_rcnum = value;
1516 break;
d031aafb 1517 case MT_OPERAND_RDA :
ac188222
DB
1518 fields->f_rda = value;
1519 break;
d031aafb 1520 case MT_OPERAND_ROWNUM :
ac188222
DB
1521 fields->f_rownum = value;
1522 break;
d031aafb 1523 case MT_OPERAND_ROWNUM1 :
ac188222
DB
1524 fields->f_rownum1 = value;
1525 break;
d031aafb 1526 case MT_OPERAND_ROWNUM2 :
ac188222
DB
1527 fields->f_rownum2 = value;
1528 break;
d031aafb 1529 case MT_OPERAND_SIZE :
ac188222
DB
1530 fields->f_size = value;
1531 break;
d031aafb 1532 case MT_OPERAND_TYPE :
ac188222
DB
1533 fields->f_type = value;
1534 break;
d031aafb 1535 case MT_OPERAND_WR :
ac188222
DB
1536 fields->f_wr = value;
1537 break;
d031aafb 1538 case MT_OPERAND_XMODE :
ac188222
DB
1539 fields->f_xmode = value;
1540 break;
1541
1542 default :
1543 /* xgettext:c-format */
1544 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
1545 opindex);
1546 abort ();
1547 }
1548}
1549
1550void
d031aafb 1551mt_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
47b0e7ad
NC
1552 int opindex,
1553 CGEN_FIELDS * fields,
1554 bfd_vma value)
ac188222
DB
1555{
1556 switch (opindex)
1557 {
d031aafb 1558 case MT_OPERAND_A23 :
ac188222
DB
1559 fields->f_a23 = value;
1560 break;
d031aafb 1561 case MT_OPERAND_BALL :
ac188222
DB
1562 fields->f_ball = value;
1563 break;
d031aafb 1564 case MT_OPERAND_BALL2 :
ac188222
DB
1565 fields->f_ball2 = value;
1566 break;
d031aafb 1567 case MT_OPERAND_BANKADDR :
ac188222
DB
1568 fields->f_bankaddr = value;
1569 break;
d031aafb 1570 case MT_OPERAND_BRC :
ac188222
DB
1571 fields->f_brc = value;
1572 break;
d031aafb 1573 case MT_OPERAND_BRC2 :
ac188222
DB
1574 fields->f_brc2 = value;
1575 break;
d031aafb 1576 case MT_OPERAND_CB1INCR :
6f84a2a6
NS
1577 fields->f_cb1incr = value;
1578 break;
d031aafb 1579 case MT_OPERAND_CB1SEL :
6f84a2a6
NS
1580 fields->f_cb1sel = value;
1581 break;
d031aafb 1582 case MT_OPERAND_CB2INCR :
6f84a2a6
NS
1583 fields->f_cb2incr = value;
1584 break;
d031aafb 1585 case MT_OPERAND_CB2SEL :
6f84a2a6
NS
1586 fields->f_cb2sel = value;
1587 break;
d031aafb 1588 case MT_OPERAND_CBRB :
ac188222
DB
1589 fields->f_cbrb = value;
1590 break;
d031aafb 1591 case MT_OPERAND_CBS :
ac188222
DB
1592 fields->f_cbs = value;
1593 break;
d031aafb 1594 case MT_OPERAND_CBX :
ac188222
DB
1595 fields->f_cbx = value;
1596 break;
d031aafb 1597 case MT_OPERAND_CCB :
ac188222
DB
1598 fields->f_ccb = value;
1599 break;
d031aafb 1600 case MT_OPERAND_CDB :
ac188222
DB
1601 fields->f_cdb = value;
1602 break;
d031aafb 1603 case MT_OPERAND_CELL :
ac188222
DB
1604 fields->f_cell = value;
1605 break;
d031aafb 1606 case MT_OPERAND_COLNUM :
ac188222
DB
1607 fields->f_colnum = value;
1608 break;
d031aafb 1609 case MT_OPERAND_CONTNUM :
ac188222
DB
1610 fields->f_contnum = value;
1611 break;
d031aafb 1612 case MT_OPERAND_CR :
ac188222
DB
1613 fields->f_cr = value;
1614 break;
d031aafb 1615 case MT_OPERAND_CTXDISP :
ac188222
DB
1616 fields->f_ctxdisp = value;
1617 break;
d031aafb 1618 case MT_OPERAND_DUP :
ac188222
DB
1619 fields->f_dup = value;
1620 break;
d031aafb 1621 case MT_OPERAND_FBDISP :
ac188222
DB
1622 fields->f_fbdisp = value;
1623 break;
d031aafb 1624 case MT_OPERAND_FBINCR :
ac188222
DB
1625 fields->f_fbincr = value;
1626 break;
d031aafb 1627 case MT_OPERAND_FRDR :
ac188222
DB
1628 fields->f_dr = value;
1629 break;
d031aafb 1630 case MT_OPERAND_FRDRRR :
ac188222
DB
1631 fields->f_drrr = value;
1632 break;
d031aafb 1633 case MT_OPERAND_FRSR1 :
ac188222
DB
1634 fields->f_sr1 = value;
1635 break;
d031aafb 1636 case MT_OPERAND_FRSR2 :
ac188222
DB
1637 fields->f_sr2 = value;
1638 break;
d031aafb 1639 case MT_OPERAND_ID :
ac188222
DB
1640 fields->f_id = value;
1641 break;
d031aafb 1642 case MT_OPERAND_IMM16 :
ac188222
DB
1643 fields->f_imm16s = value;
1644 break;
d031aafb 1645 case MT_OPERAND_IMM16L :
6f84a2a6
NS
1646 fields->f_imm16l = value;
1647 break;
d031aafb 1648 case MT_OPERAND_IMM16O :
ac188222
DB
1649 fields->f_imm16s = value;
1650 break;
d031aafb 1651 case MT_OPERAND_IMM16Z :
ac188222
DB
1652 fields->f_imm16u = value;
1653 break;
d031aafb 1654 case MT_OPERAND_INCAMT :
ac188222
DB
1655 fields->f_incamt = value;
1656 break;
d031aafb 1657 case MT_OPERAND_INCR :
ac188222
DB
1658 fields->f_incr = value;
1659 break;
d031aafb 1660 case MT_OPERAND_LENGTH :
ac188222
DB
1661 fields->f_length = value;
1662 break;
d031aafb 1663 case MT_OPERAND_LOOPSIZE :
6f84a2a6
NS
1664 fields->f_loopo = value;
1665 break;
d031aafb 1666 case MT_OPERAND_MASK :
ac188222
DB
1667 fields->f_mask = value;
1668 break;
d031aafb 1669 case MT_OPERAND_MASK1 :
ac188222
DB
1670 fields->f_mask1 = value;
1671 break;
d031aafb 1672 case MT_OPERAND_MODE :
ac188222
DB
1673 fields->f_mode = value;
1674 break;
d031aafb 1675 case MT_OPERAND_PERM :
ac188222
DB
1676 fields->f_perm = value;
1677 break;
d031aafb 1678 case MT_OPERAND_RBBC :
ac188222
DB
1679 fields->f_rbbc = value;
1680 break;
d031aafb 1681 case MT_OPERAND_RC :
ac188222
DB
1682 fields->f_rc = value;
1683 break;
d031aafb 1684 case MT_OPERAND_RC1 :
ac188222
DB
1685 fields->f_rc1 = value;
1686 break;
d031aafb 1687 case MT_OPERAND_RC2 :
ac188222
DB
1688 fields->f_rc2 = value;
1689 break;
d031aafb 1690 case MT_OPERAND_RC3 :
6f84a2a6
NS
1691 fields->f_rc3 = value;
1692 break;
d031aafb 1693 case MT_OPERAND_RCNUM :
ac188222
DB
1694 fields->f_rcnum = value;
1695 break;
d031aafb 1696 case MT_OPERAND_RDA :
ac188222
DB
1697 fields->f_rda = value;
1698 break;
d031aafb 1699 case MT_OPERAND_ROWNUM :
ac188222
DB
1700 fields->f_rownum = value;
1701 break;
d031aafb 1702 case MT_OPERAND_ROWNUM1 :
ac188222
DB
1703 fields->f_rownum1 = value;
1704 break;
d031aafb 1705 case MT_OPERAND_ROWNUM2 :
ac188222
DB
1706 fields->f_rownum2 = value;
1707 break;
d031aafb 1708 case MT_OPERAND_SIZE :
ac188222
DB
1709 fields->f_size = value;
1710 break;
d031aafb 1711 case MT_OPERAND_TYPE :
ac188222
DB
1712 fields->f_type = value;
1713 break;
d031aafb 1714 case MT_OPERAND_WR :
ac188222
DB
1715 fields->f_wr = value;
1716 break;
d031aafb 1717 case MT_OPERAND_XMODE :
ac188222
DB
1718 fields->f_xmode = value;
1719 break;
1720
1721 default :
1722 /* xgettext:c-format */
1723 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
1724 opindex);
1725 abort ();
1726 }
1727}
1728
1729/* Function to call before using the instruction builder tables. */
1730
1731void
d031aafb 1732mt_cgen_init_ibld_table (CGEN_CPU_DESC cd)
ac188222 1733{
d031aafb
NS
1734 cd->insert_handlers = & mt_cgen_insert_handlers[0];
1735 cd->extract_handlers = & mt_cgen_extract_handlers[0];
ac188222 1736
d031aafb
NS
1737 cd->insert_operand = mt_cgen_insert_operand;
1738 cd->extract_operand = mt_cgen_extract_operand;
ac188222 1739
d031aafb
NS
1740 cd->get_int_operand = mt_cgen_get_int_operand;
1741 cd->set_int_operand = mt_cgen_set_int_operand;
1742 cd->get_vma_operand = mt_cgen_get_vma_operand;
1743 cd->set_vma_operand = mt_cgen_set_vma_operand;
ac188222 1744}