1 /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
2 /* Instruction building/extraction support for epiphany. -*- C -*-
4 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
5 - the resultant file is machine generated, cgen-ibld.in isn't
7 Copyright (C) 1996-2020 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.
34 #include "epiphany-desc.h"
35 #include "epiphany-opc.h"
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);
211 int shift_within_word, shift_to_word, shift;
213 /* How to shift the value to BIT0 of the word. */
214 shift_to_word = total_length - (word_offset + word_length);
216 /* How to shift the value to the field within the word. */
217 if (CGEN_INSN_LSB0_P)
218 shift_within_word = start + 1 - length;
220 shift_within_word = word_length - start - length;
222 /* The total SHIFT, then mask in the value. */
223 shift = shift_to_word + shift_within_word;
224 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
227 #else /* ! CGEN_INT_INSN_P */
230 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
232 insert_1 (cd, value, start, length, word_length, bufp);
235 #endif /* ! CGEN_INT_INSN_P */
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. */
248 insert_insn_normal (CGEN_CPU_DESC cd,
249 const CGEN_INSN * insn,
250 CGEN_FIELDS * fields,
251 CGEN_INSN_BYTES_PTR buffer,
254 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
256 const CGEN_SYNTAX_CHAR_TYPE * syn;
258 CGEN_INIT_INSERT (cd);
259 value = CGEN_INSN_BASE_VALUE (insn);
261 /* If we're recording insns as numbers (rather than a string of bytes),
262 target byte order handling is deferred until later. */
266 put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
267 CGEN_FIELDS_BITSIZE (fields), value);
271 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
272 (unsigned) CGEN_FIELDS_BITSIZE (fields)),
275 #endif /* ! CGEN_INT_INSN_P */
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. */
282 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
286 if (CGEN_SYNTAX_CHAR_P (* syn))
289 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
299 /* Cover function to store an insn value into an integral insn. Must go here
300 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
303 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
304 CGEN_INSN_BYTES_PTR buf,
309 /* For architectures with insns smaller than the base-insn-bitsize,
310 length may be too big. */
311 if (length > insn_length)
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;
319 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
324 /* Operand extraction. */
326 #if ! CGEN_INT_INSN_P
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. */
334 static CGEN_INLINE int
335 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
336 CGEN_EXTRACT_INFO *ex_info,
341 /* It's doubtful that the middle part has already been fetched so
342 we don't optimize that case. kiss. */
344 disassemble_info *info = (disassemble_info *) ex_info->dis_info;
346 /* First do a quick check. */
347 mask = (1 << bytes) - 1;
348 if (((ex_info->valid >> offset) & mask) == mask)
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))
361 status = (*info->read_memory_func)
362 (pc, ex_info->insn_bytes + offset, bytes, info);
366 (*info->memory_error_func) (status, pc, info);
370 ex_info->valid |= ((1 << bytes) - 1) << offset;
376 /* Subroutine of extract_normal. */
378 static CGEN_INLINE long
379 extract_1 (CGEN_CPU_DESC cd,
380 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
385 bfd_vma pc ATTRIBUTE_UNUSED)
390 x = cgen_get_insn_value (cd, bufp, word_length);
392 if (CGEN_INSN_LSB0_P)
393 shift = (start + 1) - length;
395 shift = (word_length - (start + length));
399 #endif /* ! CGEN_INT_INSN_P */
401 /* Default extraction routine.
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.
414 Returns 1 for success, 0 for failure. */
416 /* ??? The return code isn't properly used. wip. */
418 /* ??? This doesn't handle bfd_vma's. Create another function when
422 extract_normal (CGEN_CPU_DESC cd,
423 #if ! CGEN_INT_INSN_P
424 CGEN_EXTRACT_INFO *ex_info,
426 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
428 CGEN_INSN_INT insn_value,
430 unsigned int word_offset,
433 unsigned int word_length,
434 unsigned int total_length,
435 #if ! CGEN_INT_INSN_P
438 bfd_vma pc ATTRIBUTE_UNUSED,
444 /* If LENGTH is zero, this operand doesn't contribute to the value
445 so give it a standard value of zero. */
452 if (word_length > 8 * sizeof (CGEN_INSN_INT))
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)
459 if (word_offset + word_length > total_length)
460 word_length = total_length - word_offset;
463 /* Does the value reside in INSN_VALUE, and at the right alignment? */
465 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
467 if (CGEN_INSN_LSB0_P)
468 value = insn_value >> ((word_offset + start + 1) - length);
470 value = insn_value >> (total_length - ( word_offset + start + length));
473 #if ! CGEN_INT_INSN_P
477 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
479 if (word_length > 8 * sizeof (CGEN_INSN_INT))
482 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
488 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
491 #endif /* ! CGEN_INT_INSN_P */
493 /* Written this way to avoid undefined behaviour. */
494 mask = (((1L << (length - 1)) - 1) << 1) | 1;
498 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
499 && (value & (1L << (length - 1))))
507 /* Default insn extractor.
509 INSN_VALUE is the first base_insn_bitsize bits, translated to host order.
510 The extracted fields are stored in FIELDS.
511 EX_INFO is used to handle reading variable length insns.
512 Return the length of the insn in bits, or 0 if no match,
513 or -1 if an error occurs fetching data (memory_error_func will have
517 extract_insn_normal (CGEN_CPU_DESC cd,
518 const CGEN_INSN *insn,
519 CGEN_EXTRACT_INFO *ex_info,
520 CGEN_INSN_INT insn_value,
524 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
525 const CGEN_SYNTAX_CHAR_TYPE *syn;
527 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
529 CGEN_INIT_EXTRACT (cd);
531 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
535 if (CGEN_SYNTAX_CHAR_P (*syn))
538 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
539 ex_info, insn_value, fields, pc);
544 /* We recognized and successfully extracted this insn. */
545 return CGEN_INSN_BITSIZE (insn);
548 /* Machine generated code added here. */
550 const char * epiphany_cgen_insert_operand
551 (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
553 /* Main entry point for operand insertion.
555 This function is basically just a big switch statement. Earlier versions
556 used tables to look up the function to use, but
557 - if the table contains both assembler and disassembler functions then
558 the disassembler contains much of the assembler and vice-versa,
559 - there's a lot of inlining possibilities as things grow,
560 - using a switch statement avoids the function call overhead.
562 This function could be moved into `parse_insn_normal', but keeping it
563 separate makes clear the interface between `parse_insn_normal' and each of
564 the handlers. It's also needed by GAS to insert operands that couldn't be
565 resolved during parsing. */
568 epiphany_cgen_insert_operand (CGEN_CPU_DESC cd,
570 CGEN_FIELDS * fields,
571 CGEN_INSN_BYTES_PTR buffer,
572 bfd_vma pc ATTRIBUTE_UNUSED)
574 const char * errmsg = NULL;
575 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
579 case EPIPHANY_OPERAND_DIRECTION :
580 errmsg = insert_normal (cd, fields->f_addsubx, 0, 0, 20, 1, 32, total_length, buffer);
582 case EPIPHANY_OPERAND_DISP11 :
585 FLD (f_disp8) = ((((UINT) (FLD (f_disp11)) >> (3))) & (255));
586 FLD (f_disp3) = ((FLD (f_disp11)) & (7));
588 errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
591 errmsg = insert_normal (cd, fields->f_disp8, 0, 0, 23, 8, 32, total_length, buffer);
596 case EPIPHANY_OPERAND_DISP3 :
597 errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
599 case EPIPHANY_OPERAND_DPMI :
600 errmsg = insert_normal (cd, fields->f_subd, 0, 0, 24, 1, 32, total_length, buffer);
602 case EPIPHANY_OPERAND_FRD :
603 errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
605 case EPIPHANY_OPERAND_FRD6 :
608 FLD (f_rd) = ((FLD (f_rd6)) & (7));
609 FLD (f_rd_x) = ((UINT) (FLD (f_rd6)) >> (3));
611 errmsg = insert_normal (cd, fields->f_rd_x, 0, 0, 31, 3, 32, total_length, buffer);
614 errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
619 case EPIPHANY_OPERAND_FRM :
620 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
622 case EPIPHANY_OPERAND_FRM6 :
625 FLD (f_rm) = ((FLD (f_rm6)) & (7));
626 FLD (f_rm_x) = ((UINT) (FLD (f_rm6)) >> (3));
628 errmsg = insert_normal (cd, fields->f_rm_x, 0, 0, 25, 3, 32, total_length, buffer);
631 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
636 case EPIPHANY_OPERAND_FRN :
637 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
639 case EPIPHANY_OPERAND_FRN6 :
642 FLD (f_rn) = ((FLD (f_rn6)) & (7));
643 FLD (f_rn_x) = ((UINT) (FLD (f_rn6)) >> (3));
645 errmsg = insert_normal (cd, fields->f_rn_x, 0, 0, 28, 3, 32, total_length, buffer);
648 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
653 case EPIPHANY_OPERAND_IMM16 :
656 FLD (f_imm8) = ((FLD (f_imm16)) & (255));
657 FLD (f_imm_27_8) = ((UINT) (FLD (f_imm16)) >> (8));
659 errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 12, 8, 32, total_length, buffer);
662 errmsg = insert_normal (cd, fields->f_imm_27_8, 0, 0, 27, 8, 32, total_length, buffer);
667 case EPIPHANY_OPERAND_IMM8 :
668 errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 12, 8, 32, total_length, buffer);
670 case EPIPHANY_OPERAND_RD :
671 errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
673 case EPIPHANY_OPERAND_RD6 :
676 FLD (f_rd) = ((FLD (f_rd6)) & (7));
677 FLD (f_rd_x) = ((UINT) (FLD (f_rd6)) >> (3));
679 errmsg = insert_normal (cd, fields->f_rd_x, 0, 0, 31, 3, 32, total_length, buffer);
682 errmsg = insert_normal (cd, fields->f_rd, 0, 0, 15, 3, 32, total_length, buffer);
687 case EPIPHANY_OPERAND_RM :
688 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
690 case EPIPHANY_OPERAND_RM6 :
693 FLD (f_rm) = ((FLD (f_rm6)) & (7));
694 FLD (f_rm_x) = ((UINT) (FLD (f_rm6)) >> (3));
696 errmsg = insert_normal (cd, fields->f_rm_x, 0, 0, 25, 3, 32, total_length, buffer);
699 errmsg = insert_normal (cd, fields->f_rm, 0, 0, 9, 3, 32, total_length, buffer);
704 case EPIPHANY_OPERAND_RN :
705 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
707 case EPIPHANY_OPERAND_RN6 :
710 FLD (f_rn) = ((FLD (f_rn6)) & (7));
711 FLD (f_rn_x) = ((UINT) (FLD (f_rn6)) >> (3));
713 errmsg = insert_normal (cd, fields->f_rn_x, 0, 0, 28, 3, 32, total_length, buffer);
716 errmsg = insert_normal (cd, fields->f_rn, 0, 0, 12, 3, 32, total_length, buffer);
721 case EPIPHANY_OPERAND_SD :
722 errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
724 case EPIPHANY_OPERAND_SD6 :
727 FLD (f_sd) = ((FLD (f_sd6)) & (7));
728 FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
730 errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
733 errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
738 case EPIPHANY_OPERAND_SDDMA :
741 FLD (f_sd) = ((FLD (f_sd6)) & (7));
742 FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
744 errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
747 errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
752 case EPIPHANY_OPERAND_SDMEM :
755 FLD (f_sd) = ((FLD (f_sd6)) & (7));
756 FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
758 errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
761 errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
766 case EPIPHANY_OPERAND_SDMESH :
769 FLD (f_sd) = ((FLD (f_sd6)) & (7));
770 FLD (f_sd_x) = ((UINT) (FLD (f_sd6)) >> (3));
772 errmsg = insert_normal (cd, fields->f_sd_x, 0, 0, 31, 3, 32, total_length, buffer);
775 errmsg = insert_normal (cd, fields->f_sd, 0, 0, 15, 3, 32, total_length, buffer);
780 case EPIPHANY_OPERAND_SHIFT :
781 errmsg = insert_normal (cd, fields->f_shift, 0, 0, 9, 5, 32, total_length, buffer);
783 case EPIPHANY_OPERAND_SIMM11 :
786 FLD (f_disp8) = ((255) & (((USI) (FLD (f_sdisp11)) >> (3))));
787 FLD (f_disp3) = ((FLD (f_sdisp11)) & (7));
789 errmsg = insert_normal (cd, fields->f_disp3, 0, 0, 9, 3, 32, total_length, buffer);
792 errmsg = insert_normal (cd, fields->f_disp8, 0, 0, 23, 8, 32, total_length, buffer);
797 case EPIPHANY_OPERAND_SIMM24 :
799 long value = fields->f_simm24;
800 value = ((SI) (((value) - (pc))) >> (1));
801 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 31, 24, 32, total_length, buffer);
804 case EPIPHANY_OPERAND_SIMM3 :
805 errmsg = insert_normal (cd, fields->f_sdisp3, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 3, 32, total_length, buffer);
807 case EPIPHANY_OPERAND_SIMM8 :
809 long value = fields->f_simm8;
810 value = ((SI) (((value) - (pc))) >> (1));
811 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 8, 32, total_length, buffer);
814 case EPIPHANY_OPERAND_SN :
815 errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
817 case EPIPHANY_OPERAND_SN6 :
820 FLD (f_sn) = ((FLD (f_sn6)) & (7));
821 FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
823 errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
826 errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
831 case EPIPHANY_OPERAND_SNDMA :
834 FLD (f_sn) = ((FLD (f_sn6)) & (7));
835 FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
837 errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
840 errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
845 case EPIPHANY_OPERAND_SNMEM :
848 FLD (f_sn) = ((FLD (f_sn6)) & (7));
849 FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
851 errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
854 errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
859 case EPIPHANY_OPERAND_SNMESH :
862 FLD (f_sn) = ((FLD (f_sn6)) & (7));
863 FLD (f_sn_x) = ((UINT) (FLD (f_sn6)) >> (3));
865 errmsg = insert_normal (cd, fields->f_sn_x, 0, 0, 28, 3, 32, total_length, buffer);
868 errmsg = insert_normal (cd, fields->f_sn, 0, 0, 12, 3, 32, total_length, buffer);
873 case EPIPHANY_OPERAND_SWI_NUM :
874 errmsg = insert_normal (cd, fields->f_trap_num, 0, 0, 15, 6, 32, total_length, buffer);
876 case EPIPHANY_OPERAND_TRAPNUM6 :
877 errmsg = insert_normal (cd, fields->f_trap_num, 0, 0, 15, 6, 32, total_length, buffer);
881 /* xgettext:c-format */
882 opcodes_error_handler
883 (_("internal error: unrecognized field %d while building insn"),
891 int epiphany_cgen_extract_operand
892 (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
894 /* Main entry point for operand extraction.
895 The result is <= 0 for error, >0 for success.
896 ??? Actual values aren't well defined right now.
898 This function is basically just a big switch statement. Earlier versions
899 used tables to look up the function to use, but
900 - if the table contains both assembler and disassembler functions then
901 the disassembler contains much of the assembler and vice-versa,
902 - there's a lot of inlining possibilities as things grow,
903 - using a switch statement avoids the function call overhead.
905 This function could be moved into `print_insn_normal', but keeping it
906 separate makes clear the interface between `print_insn_normal' and each of
910 epiphany_cgen_extract_operand (CGEN_CPU_DESC cd,
912 CGEN_EXTRACT_INFO *ex_info,
913 CGEN_INSN_INT insn_value,
914 CGEN_FIELDS * fields,
917 /* Assume success (for those operands that are nops). */
919 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
923 case EPIPHANY_OPERAND_DIRECTION :
924 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 1, 32, total_length, pc, & fields->f_addsubx);
926 case EPIPHANY_OPERAND_DISP11 :
928 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
929 if (length <= 0) break;
930 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 8, 32, total_length, pc, & fields->f_disp8);
931 if (length <= 0) break;
933 FLD (f_disp11) = ((((FLD (f_disp8)) << (3))) | (FLD (f_disp3)));
937 case EPIPHANY_OPERAND_DISP3 :
938 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
940 case EPIPHANY_OPERAND_DPMI :
941 length = extract_normal (cd, ex_info, insn_value, 0, 0, 24, 1, 32, total_length, pc, & fields->f_subd);
943 case EPIPHANY_OPERAND_FRD :
944 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
946 case EPIPHANY_OPERAND_FRD6 :
948 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_rd_x);
949 if (length <= 0) break;
950 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
951 if (length <= 0) break;
953 FLD (f_rd6) = ((((FLD (f_rd_x)) << (3))) | (FLD (f_rd)));
957 case EPIPHANY_OPERAND_FRM :
958 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
960 case EPIPHANY_OPERAND_FRM6 :
962 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_rm_x);
963 if (length <= 0) break;
964 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
965 if (length <= 0) break;
967 FLD (f_rm6) = ((((FLD (f_rm_x)) << (3))) | (FLD (f_rm)));
971 case EPIPHANY_OPERAND_FRN :
972 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
974 case EPIPHANY_OPERAND_FRN6 :
976 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_rn_x);
977 if (length <= 0) break;
978 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
979 if (length <= 0) break;
981 FLD (f_rn6) = ((((FLD (f_rn_x)) << (3))) | (FLD (f_rn)));
985 case EPIPHANY_OPERAND_IMM16 :
987 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 8, 32, total_length, pc, & fields->f_imm8);
988 if (length <= 0) break;
989 length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 8, 32, total_length, pc, & fields->f_imm_27_8);
990 if (length <= 0) break;
992 FLD (f_imm16) = ((((FLD (f_imm_27_8)) << (8))) | (FLD (f_imm8)));
996 case EPIPHANY_OPERAND_IMM8 :
997 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 8, 32, total_length, pc, & fields->f_imm8);
999 case EPIPHANY_OPERAND_RD :
1000 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
1002 case EPIPHANY_OPERAND_RD6 :
1004 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_rd_x);
1005 if (length <= 0) break;
1006 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_rd);
1007 if (length <= 0) break;
1009 FLD (f_rd6) = ((((FLD (f_rd_x)) << (3))) | (FLD (f_rd)));
1013 case EPIPHANY_OPERAND_RM :
1014 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
1016 case EPIPHANY_OPERAND_RM6 :
1018 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 3, 32, total_length, pc, & fields->f_rm_x);
1019 if (length <= 0) break;
1020 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_rm);
1021 if (length <= 0) break;
1023 FLD (f_rm6) = ((((FLD (f_rm_x)) << (3))) | (FLD (f_rm)));
1027 case EPIPHANY_OPERAND_RN :
1028 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
1030 case EPIPHANY_OPERAND_RN6 :
1032 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_rn_x);
1033 if (length <= 0) break;
1034 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_rn);
1035 if (length <= 0) break;
1037 FLD (f_rn6) = ((((FLD (f_rn_x)) << (3))) | (FLD (f_rn)));
1041 case EPIPHANY_OPERAND_SD :
1042 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
1044 case EPIPHANY_OPERAND_SD6 :
1046 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
1047 if (length <= 0) break;
1048 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
1049 if (length <= 0) break;
1051 FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
1055 case EPIPHANY_OPERAND_SDDMA :
1057 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
1058 if (length <= 0) break;
1059 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
1060 if (length <= 0) break;
1062 FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
1066 case EPIPHANY_OPERAND_SDMEM :
1068 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
1069 if (length <= 0) break;
1070 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
1071 if (length <= 0) break;
1073 FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
1077 case EPIPHANY_OPERAND_SDMESH :
1079 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 3, 32, total_length, pc, & fields->f_sd_x);
1080 if (length <= 0) break;
1081 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 3, 32, total_length, pc, & fields->f_sd);
1082 if (length <= 0) break;
1084 FLD (f_sd6) = ((((FLD (f_sd_x)) << (3))) | (FLD (f_sd)));
1088 case EPIPHANY_OPERAND_SHIFT :
1089 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 5, 32, total_length, pc, & fields->f_shift);
1091 case EPIPHANY_OPERAND_SIMM11 :
1093 length = extract_normal (cd, ex_info, insn_value, 0, 0, 9, 3, 32, total_length, pc, & fields->f_disp3);
1094 if (length <= 0) break;
1095 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 8, 32, total_length, pc, & fields->f_disp8);
1096 if (length <= 0) break;
1098 FLD (f_sdisp11) = ((((((((((FLD (f_disp8)) << (3))) | (FLD (f_disp3)))) & (2047))) ^ (1024))) - (1024));
1102 case EPIPHANY_OPERAND_SIMM24 :
1105 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 31, 24, 32, total_length, pc, & value);
1106 value = ((((value) * (2))) + (pc));
1107 fields->f_simm24 = value;
1110 case EPIPHANY_OPERAND_SIMM3 :
1111 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 3, 32, total_length, pc, & fields->f_sdisp3);
1113 case EPIPHANY_OPERAND_SIMM8 :
1116 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 8, 32, total_length, pc, & value);
1117 value = ((((value) * (2))) + (pc));
1118 fields->f_simm8 = value;
1121 case EPIPHANY_OPERAND_SN :
1122 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
1124 case EPIPHANY_OPERAND_SN6 :
1126 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
1127 if (length <= 0) break;
1128 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
1129 if (length <= 0) break;
1131 FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
1135 case EPIPHANY_OPERAND_SNDMA :
1137 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
1138 if (length <= 0) break;
1139 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
1140 if (length <= 0) break;
1142 FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
1146 case EPIPHANY_OPERAND_SNMEM :
1148 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
1149 if (length <= 0) break;
1150 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
1151 if (length <= 0) break;
1153 FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
1157 case EPIPHANY_OPERAND_SNMESH :
1159 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_sn_x);
1160 if (length <= 0) break;
1161 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 3, 32, total_length, pc, & fields->f_sn);
1162 if (length <= 0) break;
1164 FLD (f_sn6) = ((((FLD (f_sn_x)) << (3))) | (FLD (f_sn)));
1168 case EPIPHANY_OPERAND_SWI_NUM :
1169 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_trap_num);
1171 case EPIPHANY_OPERAND_TRAPNUM6 :
1172 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 6, 32, total_length, pc, & fields->f_trap_num);
1176 /* xgettext:c-format */
1177 opcodes_error_handler
1178 (_("internal error: unrecognized field %d while decoding insn"),
1186 cgen_insert_fn * const epiphany_cgen_insert_handlers[] =
1191 cgen_extract_fn * const epiphany_cgen_extract_handlers[] =
1193 extract_insn_normal,
1196 int epiphany_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1197 bfd_vma epiphany_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1199 /* Getting values from cgen_fields is handled by a collection of functions.
1200 They are distinguished by the type of the VALUE argument they return.
1201 TODO: floating point, inlining support, remove cases where result type
1205 epiphany_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1207 const CGEN_FIELDS * fields)
1213 case EPIPHANY_OPERAND_DIRECTION :
1214 value = fields->f_addsubx;
1216 case EPIPHANY_OPERAND_DISP11 :
1217 value = fields->f_disp11;
1219 case EPIPHANY_OPERAND_DISP3 :
1220 value = fields->f_disp3;
1222 case EPIPHANY_OPERAND_DPMI :
1223 value = fields->f_subd;
1225 case EPIPHANY_OPERAND_FRD :
1226 value = fields->f_rd;
1228 case EPIPHANY_OPERAND_FRD6 :
1229 value = fields->f_rd6;
1231 case EPIPHANY_OPERAND_FRM :
1232 value = fields->f_rm;
1234 case EPIPHANY_OPERAND_FRM6 :
1235 value = fields->f_rm6;
1237 case EPIPHANY_OPERAND_FRN :
1238 value = fields->f_rn;
1240 case EPIPHANY_OPERAND_FRN6 :
1241 value = fields->f_rn6;
1243 case EPIPHANY_OPERAND_IMM16 :
1244 value = fields->f_imm16;
1246 case EPIPHANY_OPERAND_IMM8 :
1247 value = fields->f_imm8;
1249 case EPIPHANY_OPERAND_RD :
1250 value = fields->f_rd;
1252 case EPIPHANY_OPERAND_RD6 :
1253 value = fields->f_rd6;
1255 case EPIPHANY_OPERAND_RM :
1256 value = fields->f_rm;
1258 case EPIPHANY_OPERAND_RM6 :
1259 value = fields->f_rm6;
1261 case EPIPHANY_OPERAND_RN :
1262 value = fields->f_rn;
1264 case EPIPHANY_OPERAND_RN6 :
1265 value = fields->f_rn6;
1267 case EPIPHANY_OPERAND_SD :
1268 value = fields->f_sd;
1270 case EPIPHANY_OPERAND_SD6 :
1271 value = fields->f_sd6;
1273 case EPIPHANY_OPERAND_SDDMA :
1274 value = fields->f_sd6;
1276 case EPIPHANY_OPERAND_SDMEM :
1277 value = fields->f_sd6;
1279 case EPIPHANY_OPERAND_SDMESH :
1280 value = fields->f_sd6;
1282 case EPIPHANY_OPERAND_SHIFT :
1283 value = fields->f_shift;
1285 case EPIPHANY_OPERAND_SIMM11 :
1286 value = fields->f_sdisp11;
1288 case EPIPHANY_OPERAND_SIMM24 :
1289 value = fields->f_simm24;
1291 case EPIPHANY_OPERAND_SIMM3 :
1292 value = fields->f_sdisp3;
1294 case EPIPHANY_OPERAND_SIMM8 :
1295 value = fields->f_simm8;
1297 case EPIPHANY_OPERAND_SN :
1298 value = fields->f_sn;
1300 case EPIPHANY_OPERAND_SN6 :
1301 value = fields->f_sn6;
1303 case EPIPHANY_OPERAND_SNDMA :
1304 value = fields->f_sn6;
1306 case EPIPHANY_OPERAND_SNMEM :
1307 value = fields->f_sn6;
1309 case EPIPHANY_OPERAND_SNMESH :
1310 value = fields->f_sn6;
1312 case EPIPHANY_OPERAND_SWI_NUM :
1313 value = fields->f_trap_num;
1315 case EPIPHANY_OPERAND_TRAPNUM6 :
1316 value = fields->f_trap_num;
1320 /* xgettext:c-format */
1321 opcodes_error_handler
1322 (_("internal error: unrecognized field %d while getting int operand"),
1331 epiphany_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1333 const CGEN_FIELDS * fields)
1339 case EPIPHANY_OPERAND_DIRECTION :
1340 value = fields->f_addsubx;
1342 case EPIPHANY_OPERAND_DISP11 :
1343 value = fields->f_disp11;
1345 case EPIPHANY_OPERAND_DISP3 :
1346 value = fields->f_disp3;
1348 case EPIPHANY_OPERAND_DPMI :
1349 value = fields->f_subd;
1351 case EPIPHANY_OPERAND_FRD :
1352 value = fields->f_rd;
1354 case EPIPHANY_OPERAND_FRD6 :
1355 value = fields->f_rd6;
1357 case EPIPHANY_OPERAND_FRM :
1358 value = fields->f_rm;
1360 case EPIPHANY_OPERAND_FRM6 :
1361 value = fields->f_rm6;
1363 case EPIPHANY_OPERAND_FRN :
1364 value = fields->f_rn;
1366 case EPIPHANY_OPERAND_FRN6 :
1367 value = fields->f_rn6;
1369 case EPIPHANY_OPERAND_IMM16 :
1370 value = fields->f_imm16;
1372 case EPIPHANY_OPERAND_IMM8 :
1373 value = fields->f_imm8;
1375 case EPIPHANY_OPERAND_RD :
1376 value = fields->f_rd;
1378 case EPIPHANY_OPERAND_RD6 :
1379 value = fields->f_rd6;
1381 case EPIPHANY_OPERAND_RM :
1382 value = fields->f_rm;
1384 case EPIPHANY_OPERAND_RM6 :
1385 value = fields->f_rm6;
1387 case EPIPHANY_OPERAND_RN :
1388 value = fields->f_rn;
1390 case EPIPHANY_OPERAND_RN6 :
1391 value = fields->f_rn6;
1393 case EPIPHANY_OPERAND_SD :
1394 value = fields->f_sd;
1396 case EPIPHANY_OPERAND_SD6 :
1397 value = fields->f_sd6;
1399 case EPIPHANY_OPERAND_SDDMA :
1400 value = fields->f_sd6;
1402 case EPIPHANY_OPERAND_SDMEM :
1403 value = fields->f_sd6;
1405 case EPIPHANY_OPERAND_SDMESH :
1406 value = fields->f_sd6;
1408 case EPIPHANY_OPERAND_SHIFT :
1409 value = fields->f_shift;
1411 case EPIPHANY_OPERAND_SIMM11 :
1412 value = fields->f_sdisp11;
1414 case EPIPHANY_OPERAND_SIMM24 :
1415 value = fields->f_simm24;
1417 case EPIPHANY_OPERAND_SIMM3 :
1418 value = fields->f_sdisp3;
1420 case EPIPHANY_OPERAND_SIMM8 :
1421 value = fields->f_simm8;
1423 case EPIPHANY_OPERAND_SN :
1424 value = fields->f_sn;
1426 case EPIPHANY_OPERAND_SN6 :
1427 value = fields->f_sn6;
1429 case EPIPHANY_OPERAND_SNDMA :
1430 value = fields->f_sn6;
1432 case EPIPHANY_OPERAND_SNMEM :
1433 value = fields->f_sn6;
1435 case EPIPHANY_OPERAND_SNMESH :
1436 value = fields->f_sn6;
1438 case EPIPHANY_OPERAND_SWI_NUM :
1439 value = fields->f_trap_num;
1441 case EPIPHANY_OPERAND_TRAPNUM6 :
1442 value = fields->f_trap_num;
1446 /* xgettext:c-format */
1447 opcodes_error_handler
1448 (_("internal error: unrecognized field %d while getting vma operand"),
1456 void epiphany_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1457 void epiphany_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
1459 /* Stuffing values in cgen_fields is handled by a collection of functions.
1460 They are distinguished by the type of the VALUE argument they accept.
1461 TODO: floating point, inlining support, remove cases where argument type
1465 epiphany_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1467 CGEN_FIELDS * fields,
1472 case EPIPHANY_OPERAND_DIRECTION :
1473 fields->f_addsubx = value;
1475 case EPIPHANY_OPERAND_DISP11 :
1476 fields->f_disp11 = value;
1478 case EPIPHANY_OPERAND_DISP3 :
1479 fields->f_disp3 = value;
1481 case EPIPHANY_OPERAND_DPMI :
1482 fields->f_subd = value;
1484 case EPIPHANY_OPERAND_FRD :
1485 fields->f_rd = value;
1487 case EPIPHANY_OPERAND_FRD6 :
1488 fields->f_rd6 = value;
1490 case EPIPHANY_OPERAND_FRM :
1491 fields->f_rm = value;
1493 case EPIPHANY_OPERAND_FRM6 :
1494 fields->f_rm6 = value;
1496 case EPIPHANY_OPERAND_FRN :
1497 fields->f_rn = value;
1499 case EPIPHANY_OPERAND_FRN6 :
1500 fields->f_rn6 = value;
1502 case EPIPHANY_OPERAND_IMM16 :
1503 fields->f_imm16 = value;
1505 case EPIPHANY_OPERAND_IMM8 :
1506 fields->f_imm8 = value;
1508 case EPIPHANY_OPERAND_RD :
1509 fields->f_rd = value;
1511 case EPIPHANY_OPERAND_RD6 :
1512 fields->f_rd6 = value;
1514 case EPIPHANY_OPERAND_RM :
1515 fields->f_rm = value;
1517 case EPIPHANY_OPERAND_RM6 :
1518 fields->f_rm6 = value;
1520 case EPIPHANY_OPERAND_RN :
1521 fields->f_rn = value;
1523 case EPIPHANY_OPERAND_RN6 :
1524 fields->f_rn6 = value;
1526 case EPIPHANY_OPERAND_SD :
1527 fields->f_sd = value;
1529 case EPIPHANY_OPERAND_SD6 :
1530 fields->f_sd6 = value;
1532 case EPIPHANY_OPERAND_SDDMA :
1533 fields->f_sd6 = value;
1535 case EPIPHANY_OPERAND_SDMEM :
1536 fields->f_sd6 = value;
1538 case EPIPHANY_OPERAND_SDMESH :
1539 fields->f_sd6 = value;
1541 case EPIPHANY_OPERAND_SHIFT :
1542 fields->f_shift = value;
1544 case EPIPHANY_OPERAND_SIMM11 :
1545 fields->f_sdisp11 = value;
1547 case EPIPHANY_OPERAND_SIMM24 :
1548 fields->f_simm24 = value;
1550 case EPIPHANY_OPERAND_SIMM3 :
1551 fields->f_sdisp3 = value;
1553 case EPIPHANY_OPERAND_SIMM8 :
1554 fields->f_simm8 = value;
1556 case EPIPHANY_OPERAND_SN :
1557 fields->f_sn = value;
1559 case EPIPHANY_OPERAND_SN6 :
1560 fields->f_sn6 = value;
1562 case EPIPHANY_OPERAND_SNDMA :
1563 fields->f_sn6 = value;
1565 case EPIPHANY_OPERAND_SNMEM :
1566 fields->f_sn6 = value;
1568 case EPIPHANY_OPERAND_SNMESH :
1569 fields->f_sn6 = value;
1571 case EPIPHANY_OPERAND_SWI_NUM :
1572 fields->f_trap_num = value;
1574 case EPIPHANY_OPERAND_TRAPNUM6 :
1575 fields->f_trap_num = value;
1579 /* xgettext:c-format */
1580 opcodes_error_handler
1581 (_("internal error: unrecognized field %d while setting int operand"),
1588 epiphany_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1590 CGEN_FIELDS * fields,
1595 case EPIPHANY_OPERAND_DIRECTION :
1596 fields->f_addsubx = value;
1598 case EPIPHANY_OPERAND_DISP11 :
1599 fields->f_disp11 = value;
1601 case EPIPHANY_OPERAND_DISP3 :
1602 fields->f_disp3 = value;
1604 case EPIPHANY_OPERAND_DPMI :
1605 fields->f_subd = value;
1607 case EPIPHANY_OPERAND_FRD :
1608 fields->f_rd = value;
1610 case EPIPHANY_OPERAND_FRD6 :
1611 fields->f_rd6 = value;
1613 case EPIPHANY_OPERAND_FRM :
1614 fields->f_rm = value;
1616 case EPIPHANY_OPERAND_FRM6 :
1617 fields->f_rm6 = value;
1619 case EPIPHANY_OPERAND_FRN :
1620 fields->f_rn = value;
1622 case EPIPHANY_OPERAND_FRN6 :
1623 fields->f_rn6 = value;
1625 case EPIPHANY_OPERAND_IMM16 :
1626 fields->f_imm16 = value;
1628 case EPIPHANY_OPERAND_IMM8 :
1629 fields->f_imm8 = value;
1631 case EPIPHANY_OPERAND_RD :
1632 fields->f_rd = value;
1634 case EPIPHANY_OPERAND_RD6 :
1635 fields->f_rd6 = value;
1637 case EPIPHANY_OPERAND_RM :
1638 fields->f_rm = value;
1640 case EPIPHANY_OPERAND_RM6 :
1641 fields->f_rm6 = value;
1643 case EPIPHANY_OPERAND_RN :
1644 fields->f_rn = value;
1646 case EPIPHANY_OPERAND_RN6 :
1647 fields->f_rn6 = value;
1649 case EPIPHANY_OPERAND_SD :
1650 fields->f_sd = value;
1652 case EPIPHANY_OPERAND_SD6 :
1653 fields->f_sd6 = value;
1655 case EPIPHANY_OPERAND_SDDMA :
1656 fields->f_sd6 = value;
1658 case EPIPHANY_OPERAND_SDMEM :
1659 fields->f_sd6 = value;
1661 case EPIPHANY_OPERAND_SDMESH :
1662 fields->f_sd6 = value;
1664 case EPIPHANY_OPERAND_SHIFT :
1665 fields->f_shift = value;
1667 case EPIPHANY_OPERAND_SIMM11 :
1668 fields->f_sdisp11 = value;
1670 case EPIPHANY_OPERAND_SIMM24 :
1671 fields->f_simm24 = value;
1673 case EPIPHANY_OPERAND_SIMM3 :
1674 fields->f_sdisp3 = value;
1676 case EPIPHANY_OPERAND_SIMM8 :
1677 fields->f_simm8 = value;
1679 case EPIPHANY_OPERAND_SN :
1680 fields->f_sn = value;
1682 case EPIPHANY_OPERAND_SN6 :
1683 fields->f_sn6 = value;
1685 case EPIPHANY_OPERAND_SNDMA :
1686 fields->f_sn6 = value;
1688 case EPIPHANY_OPERAND_SNMEM :
1689 fields->f_sn6 = value;
1691 case EPIPHANY_OPERAND_SNMESH :
1692 fields->f_sn6 = value;
1694 case EPIPHANY_OPERAND_SWI_NUM :
1695 fields->f_trap_num = value;
1697 case EPIPHANY_OPERAND_TRAPNUM6 :
1698 fields->f_trap_num = value;
1702 /* xgettext:c-format */
1703 opcodes_error_handler
1704 (_("internal error: unrecognized field %d while setting vma operand"),
1710 /* Function to call before using the instruction builder tables. */
1713 epiphany_cgen_init_ibld_table (CGEN_CPU_DESC cd)
1715 cd->insert_handlers = & epiphany_cgen_insert_handlers[0];
1716 cd->extract_handlers = & epiphany_cgen_extract_handlers[0];
1718 cd->insert_operand = epiphany_cgen_insert_operand;
1719 cd->extract_operand = epiphany_cgen_extract_operand;
1721 cd->get_int_operand = epiphany_cgen_get_int_operand;
1722 cd->set_int_operand = epiphany_cgen_set_int_operand;
1723 cd->get_vma_operand = epiphany_cgen_get_vma_operand;
1724 cd->set_vma_operand = epiphany_cgen_set_vma_operand;