2251ee01bded6de7cb395ce1a3dbd90f1a662d64
[deliverable/binutils-gdb.git] / opcodes / frv-ibld.c
1 /* DO NOT EDIT! -*- buffer-read-only: t -*- vi:set ro: */
2 /* Instruction building/extraction support for frv. -*- C -*-
3
4 THIS FILE IS MACHINE GENERATED WITH CGEN: Cpu tools GENerator.
5 - the resultant file is machine generated, cgen-ibld.in isn't
6
7 Copyright (C) 1996-2018 Free Software Foundation, Inc.
8
9 This file is part of libopcodes.
10
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)
14 any later version.
15
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.
20
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. */
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"
34 #include "frv-desc.h"
35 #include "frv-opc.h"
36 #include "cgen/basic-modes.h"
37 #include "opintl.h"
38 #include "safe-ctype.h"
39
40 #undef min
41 #define min(a,b) ((a) < (b) ? (a) : (b))
42 #undef max
43 #define max(a,b) ((a) > (b) ? (a) : (b))
44
45 /* Used by the ifield rtx function. */
46 #define FLD(f) (fields->f)
47
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);
61 #if CGEN_INT_INSN_P
62 static 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
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);
72 #endif
73 \f
74 /* Operand insertion. */
75
76 #if ! CGEN_INT_INSN_P
77
78 /* Subroutine of insert_normal. */
79
80 static CGEN_INLINE void
81 insert_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
122 static const char *
123 insert_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
141 if (word_length > 8 * sizeof (CGEN_INSN_INT))
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;
158
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;
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)
182 {
183 /* xgettext:c-format */
184 sprintf (errbuf,
185 _("operand out of range (0x%lx not between 0 and 0x%lx)"),
186 val, maxval);
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;
196
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 {
211 int shift_within_word, shift_to_word, shift;
212
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. */
217 if (CGEN_INSN_LSB0_P)
218 shift_within_word = start + 1 - length;
219 else
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;
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
247 static const char *
248 insert_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
300 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */
301
302 static void
303 put_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;
318
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
334 static CGEN_INLINE int
335 fill_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
378 static CGEN_INLINE long
379 extract_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;
389
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
421 static int
422 extract_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
452 if (word_length > 8 * sizeof (CGEN_INSN_INT))
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 {
459 if (word_offset + word_length > total_length)
460 word_length = total_length - word_offset;
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
479 if (word_length > 8 * sizeof (CGEN_INSN_INT))
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
513 static int
514 extract_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
545 /* Machine generated code added here. */
546
547 const char * frv_cgen_insert_operand
548 (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
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
564 const char *
565 frv_cgen_insert_operand (CGEN_CPU_DESC cd,
566 int opindex,
567 CGEN_FIELDS * fields,
568 CGEN_INSN_BYTES_PTR buffer,
569 bfd_vma pc ATTRIBUTE_UNUSED)
570 {
571 const char * errmsg = NULL;
572 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
573
574 switch (opindex)
575 {
576 case FRV_OPERAND_A0 :
577 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
578 break;
579 case FRV_OPERAND_A1 :
580 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
581 break;
582 case FRV_OPERAND_ACC40SI :
583 errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer);
584 break;
585 case FRV_OPERAND_ACC40SK :
586 errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer);
587 break;
588 case FRV_OPERAND_ACC40UI :
589 errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer);
590 break;
591 case FRV_OPERAND_ACC40UK :
592 errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer);
593 break;
594 case FRV_OPERAND_ACCGI :
595 errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer);
596 break;
597 case FRV_OPERAND_ACCGK :
598 errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer);
599 break;
600 case FRV_OPERAND_CCI :
601 errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer);
602 break;
603 case FRV_OPERAND_CPRDOUBLEK :
604 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
605 break;
606 case FRV_OPERAND_CPRI :
607 errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer);
608 break;
609 case FRV_OPERAND_CPRJ :
610 errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer);
611 break;
612 case FRV_OPERAND_CPRK :
613 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
614 break;
615 case FRV_OPERAND_CRI :
616 errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer);
617 break;
618 case FRV_OPERAND_CRJ :
619 errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer);
620 break;
621 case FRV_OPERAND_CRJ_FLOAT :
622 errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer);
623 break;
624 case FRV_OPERAND_CRJ_INT :
625 {
626 long value = fields->f_CRj_int;
627 value = ((value) - (4));
628 errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer);
629 }
630 break;
631 case FRV_OPERAND_CRK :
632 errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer);
633 break;
634 case FRV_OPERAND_FCCI_1 :
635 errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer);
636 break;
637 case FRV_OPERAND_FCCI_2 :
638 errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer);
639 break;
640 case FRV_OPERAND_FCCI_3 :
641 errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer);
642 break;
643 case FRV_OPERAND_FCCK :
644 errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer);
645 break;
646 case FRV_OPERAND_FRDOUBLEI :
647 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
648 break;
649 case FRV_OPERAND_FRDOUBLEJ :
650 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
651 break;
652 case FRV_OPERAND_FRDOUBLEK :
653 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
654 break;
655 case FRV_OPERAND_FRI :
656 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
657 break;
658 case FRV_OPERAND_FRINTI :
659 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
660 break;
661 case FRV_OPERAND_FRINTIEVEN :
662 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
663 break;
664 case FRV_OPERAND_FRINTJ :
665 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
666 break;
667 case FRV_OPERAND_FRINTJEVEN :
668 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
669 break;
670 case FRV_OPERAND_FRINTK :
671 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
672 break;
673 case FRV_OPERAND_FRINTKEVEN :
674 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
675 break;
676 case FRV_OPERAND_FRJ :
677 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
678 break;
679 case FRV_OPERAND_FRK :
680 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
681 break;
682 case FRV_OPERAND_FRKHI :
683 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
684 break;
685 case FRV_OPERAND_FRKLO :
686 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
687 break;
688 case FRV_OPERAND_GRDOUBLEK :
689 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
690 break;
691 case FRV_OPERAND_GRI :
692 errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer);
693 break;
694 case FRV_OPERAND_GRJ :
695 errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer);
696 break;
697 case FRV_OPERAND_GRK :
698 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
699 break;
700 case FRV_OPERAND_GRKHI :
701 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
702 break;
703 case FRV_OPERAND_GRKLO :
704 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
705 break;
706 case FRV_OPERAND_ICCI_1 :
707 errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer);
708 break;
709 case FRV_OPERAND_ICCI_2 :
710 errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer);
711 break;
712 case FRV_OPERAND_ICCI_3 :
713 errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer);
714 break;
715 case FRV_OPERAND_LI :
716 errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer);
717 break;
718 case FRV_OPERAND_LRAD :
719 errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer);
720 break;
721 case FRV_OPERAND_LRAE :
722 errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer);
723 break;
724 case FRV_OPERAND_LRAS :
725 errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer);
726 break;
727 case FRV_OPERAND_TLBPRL :
728 errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer);
729 break;
730 case FRV_OPERAND_TLBPROPX :
731 errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer);
732 break;
733 case FRV_OPERAND_AE :
734 errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
735 break;
736 case FRV_OPERAND_CALLANN :
737 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
738 break;
739 case FRV_OPERAND_CCOND :
740 errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
741 break;
742 case FRV_OPERAND_COND :
743 errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer);
744 break;
745 case FRV_OPERAND_D12 :
746 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
747 break;
748 case FRV_OPERAND_DEBUG :
749 errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer);
750 break;
751 case FRV_OPERAND_EIR :
752 errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer);
753 break;
754 case FRV_OPERAND_HINT :
755 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
756 break;
757 case FRV_OPERAND_HINT_NOT_TAKEN :
758 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
759 break;
760 case FRV_OPERAND_HINT_TAKEN :
761 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
762 break;
763 case FRV_OPERAND_LABEL16 :
764 {
765 long value = fields->f_label16;
766 value = ((SI) (((value) - (pc))) >> (2));
767 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer);
768 }
769 break;
770 case FRV_OPERAND_LABEL24 :
771 {
772 {
773 FLD (f_labelH6) = ((SI) (((FLD (f_label24)) - (pc))) >> (20));
774 FLD (f_labelL18) = ((((UINT) (((FLD (f_label24)) - (pc))) >> (2))) & (262143));
775 }
776 errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer);
777 if (errmsg)
778 break;
779 errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer);
780 if (errmsg)
781 break;
782 }
783 break;
784 case FRV_OPERAND_LDANN :
785 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
786 break;
787 case FRV_OPERAND_LDDANN :
788 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
789 break;
790 case FRV_OPERAND_LOCK :
791 errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
792 break;
793 case FRV_OPERAND_PACK :
794 errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer);
795 break;
796 case FRV_OPERAND_S10 :
797 errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer);
798 break;
799 case FRV_OPERAND_S12 :
800 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
801 break;
802 case FRV_OPERAND_S16 :
803 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
804 break;
805 case FRV_OPERAND_S5 :
806 errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer);
807 break;
808 case FRV_OPERAND_S6 :
809 errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer);
810 break;
811 case FRV_OPERAND_S6_1 :
812 errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer);
813 break;
814 case FRV_OPERAND_SLO16 :
815 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
816 break;
817 case FRV_OPERAND_SPR :
818 {
819 {
820 FLD (f_spr_h) = ((UINT) (FLD (f_spr)) >> (6));
821 FLD (f_spr_l) = ((FLD (f_spr)) & (63));
822 }
823 errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer);
824 if (errmsg)
825 break;
826 errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer);
827 if (errmsg)
828 break;
829 }
830 break;
831 case FRV_OPERAND_U12 :
832 {
833 {
834 FLD (f_u12_h) = ((SI) (FLD (f_u12)) >> (6));
835 FLD (f_u12_l) = ((FLD (f_u12)) & (63));
836 }
837 errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer);
838 if (errmsg)
839 break;
840 errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer);
841 if (errmsg)
842 break;
843 }
844 break;
845 case FRV_OPERAND_U16 :
846 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
847 break;
848 case FRV_OPERAND_U6 :
849 errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer);
850 break;
851 case FRV_OPERAND_UHI16 :
852 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
853 break;
854 case FRV_OPERAND_ULO16 :
855 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
856 break;
857
858 default :
859 /* xgettext:c-format */
860 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
861 opindex);
862 abort ();
863 }
864
865 return errmsg;
866 }
867
868 int frv_cgen_extract_operand
869 (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
870
871 /* Main entry point for operand extraction.
872 The result is <= 0 for error, >0 for success.
873 ??? Actual values aren't well defined right now.
874
875 This function is basically just a big switch statement. Earlier versions
876 used tables to look up the function to use, but
877 - if the table contains both assembler and disassembler functions then
878 the disassembler contains much of the assembler and vice-versa,
879 - there's a lot of inlining possibilities as things grow,
880 - using a switch statement avoids the function call overhead.
881
882 This function could be moved into `print_insn_normal', but keeping it
883 separate makes clear the interface between `print_insn_normal' and each of
884 the handlers. */
885
886 int
887 frv_cgen_extract_operand (CGEN_CPU_DESC cd,
888 int opindex,
889 CGEN_EXTRACT_INFO *ex_info,
890 CGEN_INSN_INT insn_value,
891 CGEN_FIELDS * fields,
892 bfd_vma pc)
893 {
894 /* Assume success (for those operands that are nops). */
895 int length = 1;
896 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
897
898 switch (opindex)
899 {
900 case FRV_OPERAND_A0 :
901 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
902 break;
903 case FRV_OPERAND_A1 :
904 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
905 break;
906 case FRV_OPERAND_ACC40SI :
907 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si);
908 break;
909 case FRV_OPERAND_ACC40SK :
910 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk);
911 break;
912 case FRV_OPERAND_ACC40UI :
913 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui);
914 break;
915 case FRV_OPERAND_ACC40UK :
916 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk);
917 break;
918 case FRV_OPERAND_ACCGI :
919 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi);
920 break;
921 case FRV_OPERAND_ACCGK :
922 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk);
923 break;
924 case FRV_OPERAND_CCI :
925 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi);
926 break;
927 case FRV_OPERAND_CPRDOUBLEK :
928 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
929 break;
930 case FRV_OPERAND_CPRI :
931 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi);
932 break;
933 case FRV_OPERAND_CPRJ :
934 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj);
935 break;
936 case FRV_OPERAND_CPRK :
937 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
938 break;
939 case FRV_OPERAND_CRI :
940 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi);
941 break;
942 case FRV_OPERAND_CRJ :
943 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj);
944 break;
945 case FRV_OPERAND_CRJ_FLOAT :
946 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float);
947 break;
948 case FRV_OPERAND_CRJ_INT :
949 {
950 long value;
951 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value);
952 value = ((value) + (4));
953 fields->f_CRj_int = value;
954 }
955 break;
956 case FRV_OPERAND_CRK :
957 length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk);
958 break;
959 case FRV_OPERAND_FCCI_1 :
960 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1);
961 break;
962 case FRV_OPERAND_FCCI_2 :
963 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2);
964 break;
965 case FRV_OPERAND_FCCI_3 :
966 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3);
967 break;
968 case FRV_OPERAND_FCCK :
969 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk);
970 break;
971 case FRV_OPERAND_FRDOUBLEI :
972 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
973 break;
974 case FRV_OPERAND_FRDOUBLEJ :
975 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
976 break;
977 case FRV_OPERAND_FRDOUBLEK :
978 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
979 break;
980 case FRV_OPERAND_FRI :
981 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
982 break;
983 case FRV_OPERAND_FRINTI :
984 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
985 break;
986 case FRV_OPERAND_FRINTIEVEN :
987 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
988 break;
989 case FRV_OPERAND_FRINTJ :
990 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
991 break;
992 case FRV_OPERAND_FRINTJEVEN :
993 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
994 break;
995 case FRV_OPERAND_FRINTK :
996 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
997 break;
998 case FRV_OPERAND_FRINTKEVEN :
999 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1000 break;
1001 case FRV_OPERAND_FRJ :
1002 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
1003 break;
1004 case FRV_OPERAND_FRK :
1005 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1006 break;
1007 case FRV_OPERAND_FRKHI :
1008 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1009 break;
1010 case FRV_OPERAND_FRKLO :
1011 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
1012 break;
1013 case FRV_OPERAND_GRDOUBLEK :
1014 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1015 break;
1016 case FRV_OPERAND_GRI :
1017 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi);
1018 break;
1019 case FRV_OPERAND_GRJ :
1020 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj);
1021 break;
1022 case FRV_OPERAND_GRK :
1023 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1024 break;
1025 case FRV_OPERAND_GRKHI :
1026 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1027 break;
1028 case FRV_OPERAND_GRKLO :
1029 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
1030 break;
1031 case FRV_OPERAND_ICCI_1 :
1032 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1);
1033 break;
1034 case FRV_OPERAND_ICCI_2 :
1035 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2);
1036 break;
1037 case FRV_OPERAND_ICCI_3 :
1038 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3);
1039 break;
1040 case FRV_OPERAND_LI :
1041 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI);
1042 break;
1043 case FRV_OPERAND_LRAD :
1044 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD);
1045 break;
1046 case FRV_OPERAND_LRAE :
1047 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE);
1048 break;
1049 case FRV_OPERAND_LRAS :
1050 length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS);
1051 break;
1052 case FRV_OPERAND_TLBPRL :
1053 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL);
1054 break;
1055 case FRV_OPERAND_TLBPROPX :
1056 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx);
1057 break;
1058 case FRV_OPERAND_AE :
1059 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
1060 break;
1061 case FRV_OPERAND_CALLANN :
1062 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1063 break;
1064 case FRV_OPERAND_CCOND :
1065 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
1066 break;
1067 case FRV_OPERAND_COND :
1068 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond);
1069 break;
1070 case FRV_OPERAND_D12 :
1071 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
1072 break;
1073 case FRV_OPERAND_DEBUG :
1074 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug);
1075 break;
1076 case FRV_OPERAND_EIR :
1077 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir);
1078 break;
1079 case FRV_OPERAND_HINT :
1080 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1081 break;
1082 case FRV_OPERAND_HINT_NOT_TAKEN :
1083 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1084 break;
1085 case FRV_OPERAND_HINT_TAKEN :
1086 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
1087 break;
1088 case FRV_OPERAND_LABEL16 :
1089 {
1090 long value;
1091 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, pc, & value);
1092 value = ((((value) << (2))) + (pc));
1093 fields->f_label16 = value;
1094 }
1095 break;
1096 case FRV_OPERAND_LABEL24 :
1097 {
1098 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6);
1099 if (length <= 0) break;
1100 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
1101 if (length <= 0) break;
1102 {
1103 FLD (f_label24) = ((((((((FLD (f_labelH6)) << (18))) | (FLD (f_labelL18)))) << (2))) + (pc));
1104 }
1105 }
1106 break;
1107 case FRV_OPERAND_LDANN :
1108 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1109 break;
1110 case FRV_OPERAND_LDDANN :
1111 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
1112 break;
1113 case FRV_OPERAND_LOCK :
1114 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
1115 break;
1116 case FRV_OPERAND_PACK :
1117 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack);
1118 break;
1119 case FRV_OPERAND_S10 :
1120 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10);
1121 break;
1122 case FRV_OPERAND_S12 :
1123 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
1124 break;
1125 case FRV_OPERAND_S16 :
1126 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
1127 break;
1128 case FRV_OPERAND_S5 :
1129 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5);
1130 break;
1131 case FRV_OPERAND_S6 :
1132 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6);
1133 break;
1134 case FRV_OPERAND_S6_1 :
1135 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1);
1136 break;
1137 case FRV_OPERAND_SLO16 :
1138 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
1139 break;
1140 case FRV_OPERAND_SPR :
1141 {
1142 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h);
1143 if (length <= 0) break;
1144 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l);
1145 if (length <= 0) break;
1146 {
1147 FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l)));
1148 }
1149 }
1150 break;
1151 case FRV_OPERAND_U12 :
1152 {
1153 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h);
1154 if (length <= 0) break;
1155 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
1156 if (length <= 0) break;
1157 {
1158 FLD (f_u12) = ((((FLD (f_u12_h)) << (6))) | (FLD (f_u12_l)));
1159 }
1160 }
1161 break;
1162 case FRV_OPERAND_U16 :
1163 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1164 break;
1165 case FRV_OPERAND_U6 :
1166 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6);
1167 break;
1168 case FRV_OPERAND_UHI16 :
1169 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1170 break;
1171 case FRV_OPERAND_ULO16 :
1172 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
1173 break;
1174
1175 default :
1176 /* xgettext:c-format */
1177 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
1178 opindex);
1179 abort ();
1180 }
1181
1182 return length;
1183 }
1184
1185 cgen_insert_fn * const frv_cgen_insert_handlers[] =
1186 {
1187 insert_insn_normal,
1188 };
1189
1190 cgen_extract_fn * const frv_cgen_extract_handlers[] =
1191 {
1192 extract_insn_normal,
1193 };
1194
1195 int frv_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1196 bfd_vma frv_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *);
1197
1198 /* Getting values from cgen_fields is handled by a collection of functions.
1199 They are distinguished by the type of the VALUE argument they return.
1200 TODO: floating point, inlining support, remove cases where result type
1201 not appropriate. */
1202
1203 int
1204 frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1205 int opindex,
1206 const CGEN_FIELDS * fields)
1207 {
1208 int value;
1209
1210 switch (opindex)
1211 {
1212 case FRV_OPERAND_A0 :
1213 value = fields->f_A;
1214 break;
1215 case FRV_OPERAND_A1 :
1216 value = fields->f_A;
1217 break;
1218 case FRV_OPERAND_ACC40SI :
1219 value = fields->f_ACC40Si;
1220 break;
1221 case FRV_OPERAND_ACC40SK :
1222 value = fields->f_ACC40Sk;
1223 break;
1224 case FRV_OPERAND_ACC40UI :
1225 value = fields->f_ACC40Ui;
1226 break;
1227 case FRV_OPERAND_ACC40UK :
1228 value = fields->f_ACC40Uk;
1229 break;
1230 case FRV_OPERAND_ACCGI :
1231 value = fields->f_ACCGi;
1232 break;
1233 case FRV_OPERAND_ACCGK :
1234 value = fields->f_ACCGk;
1235 break;
1236 case FRV_OPERAND_CCI :
1237 value = fields->f_CCi;
1238 break;
1239 case FRV_OPERAND_CPRDOUBLEK :
1240 value = fields->f_CPRk;
1241 break;
1242 case FRV_OPERAND_CPRI :
1243 value = fields->f_CPRi;
1244 break;
1245 case FRV_OPERAND_CPRJ :
1246 value = fields->f_CPRj;
1247 break;
1248 case FRV_OPERAND_CPRK :
1249 value = fields->f_CPRk;
1250 break;
1251 case FRV_OPERAND_CRI :
1252 value = fields->f_CRi;
1253 break;
1254 case FRV_OPERAND_CRJ :
1255 value = fields->f_CRj;
1256 break;
1257 case FRV_OPERAND_CRJ_FLOAT :
1258 value = fields->f_CRj_float;
1259 break;
1260 case FRV_OPERAND_CRJ_INT :
1261 value = fields->f_CRj_int;
1262 break;
1263 case FRV_OPERAND_CRK :
1264 value = fields->f_CRk;
1265 break;
1266 case FRV_OPERAND_FCCI_1 :
1267 value = fields->f_FCCi_1;
1268 break;
1269 case FRV_OPERAND_FCCI_2 :
1270 value = fields->f_FCCi_2;
1271 break;
1272 case FRV_OPERAND_FCCI_3 :
1273 value = fields->f_FCCi_3;
1274 break;
1275 case FRV_OPERAND_FCCK :
1276 value = fields->f_FCCk;
1277 break;
1278 case FRV_OPERAND_FRDOUBLEI :
1279 value = fields->f_FRi;
1280 break;
1281 case FRV_OPERAND_FRDOUBLEJ :
1282 value = fields->f_FRj;
1283 break;
1284 case FRV_OPERAND_FRDOUBLEK :
1285 value = fields->f_FRk;
1286 break;
1287 case FRV_OPERAND_FRI :
1288 value = fields->f_FRi;
1289 break;
1290 case FRV_OPERAND_FRINTI :
1291 value = fields->f_FRi;
1292 break;
1293 case FRV_OPERAND_FRINTIEVEN :
1294 value = fields->f_FRi;
1295 break;
1296 case FRV_OPERAND_FRINTJ :
1297 value = fields->f_FRj;
1298 break;
1299 case FRV_OPERAND_FRINTJEVEN :
1300 value = fields->f_FRj;
1301 break;
1302 case FRV_OPERAND_FRINTK :
1303 value = fields->f_FRk;
1304 break;
1305 case FRV_OPERAND_FRINTKEVEN :
1306 value = fields->f_FRk;
1307 break;
1308 case FRV_OPERAND_FRJ :
1309 value = fields->f_FRj;
1310 break;
1311 case FRV_OPERAND_FRK :
1312 value = fields->f_FRk;
1313 break;
1314 case FRV_OPERAND_FRKHI :
1315 value = fields->f_FRk;
1316 break;
1317 case FRV_OPERAND_FRKLO :
1318 value = fields->f_FRk;
1319 break;
1320 case FRV_OPERAND_GRDOUBLEK :
1321 value = fields->f_GRk;
1322 break;
1323 case FRV_OPERAND_GRI :
1324 value = fields->f_GRi;
1325 break;
1326 case FRV_OPERAND_GRJ :
1327 value = fields->f_GRj;
1328 break;
1329 case FRV_OPERAND_GRK :
1330 value = fields->f_GRk;
1331 break;
1332 case FRV_OPERAND_GRKHI :
1333 value = fields->f_GRk;
1334 break;
1335 case FRV_OPERAND_GRKLO :
1336 value = fields->f_GRk;
1337 break;
1338 case FRV_OPERAND_ICCI_1 :
1339 value = fields->f_ICCi_1;
1340 break;
1341 case FRV_OPERAND_ICCI_2 :
1342 value = fields->f_ICCi_2;
1343 break;
1344 case FRV_OPERAND_ICCI_3 :
1345 value = fields->f_ICCi_3;
1346 break;
1347 case FRV_OPERAND_LI :
1348 value = fields->f_LI;
1349 break;
1350 case FRV_OPERAND_LRAD :
1351 value = fields->f_LRAD;
1352 break;
1353 case FRV_OPERAND_LRAE :
1354 value = fields->f_LRAE;
1355 break;
1356 case FRV_OPERAND_LRAS :
1357 value = fields->f_LRAS;
1358 break;
1359 case FRV_OPERAND_TLBPRL :
1360 value = fields->f_TLBPRL;
1361 break;
1362 case FRV_OPERAND_TLBPROPX :
1363 value = fields->f_TLBPRopx;
1364 break;
1365 case FRV_OPERAND_AE :
1366 value = fields->f_ae;
1367 break;
1368 case FRV_OPERAND_CALLANN :
1369 value = fields->f_reloc_ann;
1370 break;
1371 case FRV_OPERAND_CCOND :
1372 value = fields->f_ccond;
1373 break;
1374 case FRV_OPERAND_COND :
1375 value = fields->f_cond;
1376 break;
1377 case FRV_OPERAND_D12 :
1378 value = fields->f_d12;
1379 break;
1380 case FRV_OPERAND_DEBUG :
1381 value = fields->f_debug;
1382 break;
1383 case FRV_OPERAND_EIR :
1384 value = fields->f_eir;
1385 break;
1386 case FRV_OPERAND_HINT :
1387 value = fields->f_hint;
1388 break;
1389 case FRV_OPERAND_HINT_NOT_TAKEN :
1390 value = fields->f_hint;
1391 break;
1392 case FRV_OPERAND_HINT_TAKEN :
1393 value = fields->f_hint;
1394 break;
1395 case FRV_OPERAND_LABEL16 :
1396 value = fields->f_label16;
1397 break;
1398 case FRV_OPERAND_LABEL24 :
1399 value = fields->f_label24;
1400 break;
1401 case FRV_OPERAND_LDANN :
1402 value = fields->f_reloc_ann;
1403 break;
1404 case FRV_OPERAND_LDDANN :
1405 value = fields->f_reloc_ann;
1406 break;
1407 case FRV_OPERAND_LOCK :
1408 value = fields->f_lock;
1409 break;
1410 case FRV_OPERAND_PACK :
1411 value = fields->f_pack;
1412 break;
1413 case FRV_OPERAND_S10 :
1414 value = fields->f_s10;
1415 break;
1416 case FRV_OPERAND_S12 :
1417 value = fields->f_d12;
1418 break;
1419 case FRV_OPERAND_S16 :
1420 value = fields->f_s16;
1421 break;
1422 case FRV_OPERAND_S5 :
1423 value = fields->f_s5;
1424 break;
1425 case FRV_OPERAND_S6 :
1426 value = fields->f_s6;
1427 break;
1428 case FRV_OPERAND_S6_1 :
1429 value = fields->f_s6_1;
1430 break;
1431 case FRV_OPERAND_SLO16 :
1432 value = fields->f_s16;
1433 break;
1434 case FRV_OPERAND_SPR :
1435 value = fields->f_spr;
1436 break;
1437 case FRV_OPERAND_U12 :
1438 value = fields->f_u12;
1439 break;
1440 case FRV_OPERAND_U16 :
1441 value = fields->f_u16;
1442 break;
1443 case FRV_OPERAND_U6 :
1444 value = fields->f_u6;
1445 break;
1446 case FRV_OPERAND_UHI16 :
1447 value = fields->f_u16;
1448 break;
1449 case FRV_OPERAND_ULO16 :
1450 value = fields->f_u16;
1451 break;
1452
1453 default :
1454 /* xgettext:c-format */
1455 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
1456 opindex);
1457 abort ();
1458 }
1459
1460 return value;
1461 }
1462
1463 bfd_vma
1464 frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1465 int opindex,
1466 const CGEN_FIELDS * fields)
1467 {
1468 bfd_vma value;
1469
1470 switch (opindex)
1471 {
1472 case FRV_OPERAND_A0 :
1473 value = fields->f_A;
1474 break;
1475 case FRV_OPERAND_A1 :
1476 value = fields->f_A;
1477 break;
1478 case FRV_OPERAND_ACC40SI :
1479 value = fields->f_ACC40Si;
1480 break;
1481 case FRV_OPERAND_ACC40SK :
1482 value = fields->f_ACC40Sk;
1483 break;
1484 case FRV_OPERAND_ACC40UI :
1485 value = fields->f_ACC40Ui;
1486 break;
1487 case FRV_OPERAND_ACC40UK :
1488 value = fields->f_ACC40Uk;
1489 break;
1490 case FRV_OPERAND_ACCGI :
1491 value = fields->f_ACCGi;
1492 break;
1493 case FRV_OPERAND_ACCGK :
1494 value = fields->f_ACCGk;
1495 break;
1496 case FRV_OPERAND_CCI :
1497 value = fields->f_CCi;
1498 break;
1499 case FRV_OPERAND_CPRDOUBLEK :
1500 value = fields->f_CPRk;
1501 break;
1502 case FRV_OPERAND_CPRI :
1503 value = fields->f_CPRi;
1504 break;
1505 case FRV_OPERAND_CPRJ :
1506 value = fields->f_CPRj;
1507 break;
1508 case FRV_OPERAND_CPRK :
1509 value = fields->f_CPRk;
1510 break;
1511 case FRV_OPERAND_CRI :
1512 value = fields->f_CRi;
1513 break;
1514 case FRV_OPERAND_CRJ :
1515 value = fields->f_CRj;
1516 break;
1517 case FRV_OPERAND_CRJ_FLOAT :
1518 value = fields->f_CRj_float;
1519 break;
1520 case FRV_OPERAND_CRJ_INT :
1521 value = fields->f_CRj_int;
1522 break;
1523 case FRV_OPERAND_CRK :
1524 value = fields->f_CRk;
1525 break;
1526 case FRV_OPERAND_FCCI_1 :
1527 value = fields->f_FCCi_1;
1528 break;
1529 case FRV_OPERAND_FCCI_2 :
1530 value = fields->f_FCCi_2;
1531 break;
1532 case FRV_OPERAND_FCCI_3 :
1533 value = fields->f_FCCi_3;
1534 break;
1535 case FRV_OPERAND_FCCK :
1536 value = fields->f_FCCk;
1537 break;
1538 case FRV_OPERAND_FRDOUBLEI :
1539 value = fields->f_FRi;
1540 break;
1541 case FRV_OPERAND_FRDOUBLEJ :
1542 value = fields->f_FRj;
1543 break;
1544 case FRV_OPERAND_FRDOUBLEK :
1545 value = fields->f_FRk;
1546 break;
1547 case FRV_OPERAND_FRI :
1548 value = fields->f_FRi;
1549 break;
1550 case FRV_OPERAND_FRINTI :
1551 value = fields->f_FRi;
1552 break;
1553 case FRV_OPERAND_FRINTIEVEN :
1554 value = fields->f_FRi;
1555 break;
1556 case FRV_OPERAND_FRINTJ :
1557 value = fields->f_FRj;
1558 break;
1559 case FRV_OPERAND_FRINTJEVEN :
1560 value = fields->f_FRj;
1561 break;
1562 case FRV_OPERAND_FRINTK :
1563 value = fields->f_FRk;
1564 break;
1565 case FRV_OPERAND_FRINTKEVEN :
1566 value = fields->f_FRk;
1567 break;
1568 case FRV_OPERAND_FRJ :
1569 value = fields->f_FRj;
1570 break;
1571 case FRV_OPERAND_FRK :
1572 value = fields->f_FRk;
1573 break;
1574 case FRV_OPERAND_FRKHI :
1575 value = fields->f_FRk;
1576 break;
1577 case FRV_OPERAND_FRKLO :
1578 value = fields->f_FRk;
1579 break;
1580 case FRV_OPERAND_GRDOUBLEK :
1581 value = fields->f_GRk;
1582 break;
1583 case FRV_OPERAND_GRI :
1584 value = fields->f_GRi;
1585 break;
1586 case FRV_OPERAND_GRJ :
1587 value = fields->f_GRj;
1588 break;
1589 case FRV_OPERAND_GRK :
1590 value = fields->f_GRk;
1591 break;
1592 case FRV_OPERAND_GRKHI :
1593 value = fields->f_GRk;
1594 break;
1595 case FRV_OPERAND_GRKLO :
1596 value = fields->f_GRk;
1597 break;
1598 case FRV_OPERAND_ICCI_1 :
1599 value = fields->f_ICCi_1;
1600 break;
1601 case FRV_OPERAND_ICCI_2 :
1602 value = fields->f_ICCi_2;
1603 break;
1604 case FRV_OPERAND_ICCI_3 :
1605 value = fields->f_ICCi_3;
1606 break;
1607 case FRV_OPERAND_LI :
1608 value = fields->f_LI;
1609 break;
1610 case FRV_OPERAND_LRAD :
1611 value = fields->f_LRAD;
1612 break;
1613 case FRV_OPERAND_LRAE :
1614 value = fields->f_LRAE;
1615 break;
1616 case FRV_OPERAND_LRAS :
1617 value = fields->f_LRAS;
1618 break;
1619 case FRV_OPERAND_TLBPRL :
1620 value = fields->f_TLBPRL;
1621 break;
1622 case FRV_OPERAND_TLBPROPX :
1623 value = fields->f_TLBPRopx;
1624 break;
1625 case FRV_OPERAND_AE :
1626 value = fields->f_ae;
1627 break;
1628 case FRV_OPERAND_CALLANN :
1629 value = fields->f_reloc_ann;
1630 break;
1631 case FRV_OPERAND_CCOND :
1632 value = fields->f_ccond;
1633 break;
1634 case FRV_OPERAND_COND :
1635 value = fields->f_cond;
1636 break;
1637 case FRV_OPERAND_D12 :
1638 value = fields->f_d12;
1639 break;
1640 case FRV_OPERAND_DEBUG :
1641 value = fields->f_debug;
1642 break;
1643 case FRV_OPERAND_EIR :
1644 value = fields->f_eir;
1645 break;
1646 case FRV_OPERAND_HINT :
1647 value = fields->f_hint;
1648 break;
1649 case FRV_OPERAND_HINT_NOT_TAKEN :
1650 value = fields->f_hint;
1651 break;
1652 case FRV_OPERAND_HINT_TAKEN :
1653 value = fields->f_hint;
1654 break;
1655 case FRV_OPERAND_LABEL16 :
1656 value = fields->f_label16;
1657 break;
1658 case FRV_OPERAND_LABEL24 :
1659 value = fields->f_label24;
1660 break;
1661 case FRV_OPERAND_LDANN :
1662 value = fields->f_reloc_ann;
1663 break;
1664 case FRV_OPERAND_LDDANN :
1665 value = fields->f_reloc_ann;
1666 break;
1667 case FRV_OPERAND_LOCK :
1668 value = fields->f_lock;
1669 break;
1670 case FRV_OPERAND_PACK :
1671 value = fields->f_pack;
1672 break;
1673 case FRV_OPERAND_S10 :
1674 value = fields->f_s10;
1675 break;
1676 case FRV_OPERAND_S12 :
1677 value = fields->f_d12;
1678 break;
1679 case FRV_OPERAND_S16 :
1680 value = fields->f_s16;
1681 break;
1682 case FRV_OPERAND_S5 :
1683 value = fields->f_s5;
1684 break;
1685 case FRV_OPERAND_S6 :
1686 value = fields->f_s6;
1687 break;
1688 case FRV_OPERAND_S6_1 :
1689 value = fields->f_s6_1;
1690 break;
1691 case FRV_OPERAND_SLO16 :
1692 value = fields->f_s16;
1693 break;
1694 case FRV_OPERAND_SPR :
1695 value = fields->f_spr;
1696 break;
1697 case FRV_OPERAND_U12 :
1698 value = fields->f_u12;
1699 break;
1700 case FRV_OPERAND_U16 :
1701 value = fields->f_u16;
1702 break;
1703 case FRV_OPERAND_U6 :
1704 value = fields->f_u6;
1705 break;
1706 case FRV_OPERAND_UHI16 :
1707 value = fields->f_u16;
1708 break;
1709 case FRV_OPERAND_ULO16 :
1710 value = fields->f_u16;
1711 break;
1712
1713 default :
1714 /* xgettext:c-format */
1715 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
1716 opindex);
1717 abort ();
1718 }
1719
1720 return value;
1721 }
1722
1723 void frv_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int);
1724 void frv_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma);
1725
1726 /* Stuffing values in cgen_fields is handled by a collection of functions.
1727 They are distinguished by the type of the VALUE argument they accept.
1728 TODO: floating point, inlining support, remove cases where argument type
1729 not appropriate. */
1730
1731 void
1732 frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1733 int opindex,
1734 CGEN_FIELDS * fields,
1735 int value)
1736 {
1737 switch (opindex)
1738 {
1739 case FRV_OPERAND_A0 :
1740 fields->f_A = value;
1741 break;
1742 case FRV_OPERAND_A1 :
1743 fields->f_A = value;
1744 break;
1745 case FRV_OPERAND_ACC40SI :
1746 fields->f_ACC40Si = value;
1747 break;
1748 case FRV_OPERAND_ACC40SK :
1749 fields->f_ACC40Sk = value;
1750 break;
1751 case FRV_OPERAND_ACC40UI :
1752 fields->f_ACC40Ui = value;
1753 break;
1754 case FRV_OPERAND_ACC40UK :
1755 fields->f_ACC40Uk = value;
1756 break;
1757 case FRV_OPERAND_ACCGI :
1758 fields->f_ACCGi = value;
1759 break;
1760 case FRV_OPERAND_ACCGK :
1761 fields->f_ACCGk = value;
1762 break;
1763 case FRV_OPERAND_CCI :
1764 fields->f_CCi = value;
1765 break;
1766 case FRV_OPERAND_CPRDOUBLEK :
1767 fields->f_CPRk = value;
1768 break;
1769 case FRV_OPERAND_CPRI :
1770 fields->f_CPRi = value;
1771 break;
1772 case FRV_OPERAND_CPRJ :
1773 fields->f_CPRj = value;
1774 break;
1775 case FRV_OPERAND_CPRK :
1776 fields->f_CPRk = value;
1777 break;
1778 case FRV_OPERAND_CRI :
1779 fields->f_CRi = value;
1780 break;
1781 case FRV_OPERAND_CRJ :
1782 fields->f_CRj = value;
1783 break;
1784 case FRV_OPERAND_CRJ_FLOAT :
1785 fields->f_CRj_float = value;
1786 break;
1787 case FRV_OPERAND_CRJ_INT :
1788 fields->f_CRj_int = value;
1789 break;
1790 case FRV_OPERAND_CRK :
1791 fields->f_CRk = value;
1792 break;
1793 case FRV_OPERAND_FCCI_1 :
1794 fields->f_FCCi_1 = value;
1795 break;
1796 case FRV_OPERAND_FCCI_2 :
1797 fields->f_FCCi_2 = value;
1798 break;
1799 case FRV_OPERAND_FCCI_3 :
1800 fields->f_FCCi_3 = value;
1801 break;
1802 case FRV_OPERAND_FCCK :
1803 fields->f_FCCk = value;
1804 break;
1805 case FRV_OPERAND_FRDOUBLEI :
1806 fields->f_FRi = value;
1807 break;
1808 case FRV_OPERAND_FRDOUBLEJ :
1809 fields->f_FRj = value;
1810 break;
1811 case FRV_OPERAND_FRDOUBLEK :
1812 fields->f_FRk = value;
1813 break;
1814 case FRV_OPERAND_FRI :
1815 fields->f_FRi = value;
1816 break;
1817 case FRV_OPERAND_FRINTI :
1818 fields->f_FRi = value;
1819 break;
1820 case FRV_OPERAND_FRINTIEVEN :
1821 fields->f_FRi = value;
1822 break;
1823 case FRV_OPERAND_FRINTJ :
1824 fields->f_FRj = value;
1825 break;
1826 case FRV_OPERAND_FRINTJEVEN :
1827 fields->f_FRj = value;
1828 break;
1829 case FRV_OPERAND_FRINTK :
1830 fields->f_FRk = value;
1831 break;
1832 case FRV_OPERAND_FRINTKEVEN :
1833 fields->f_FRk = value;
1834 break;
1835 case FRV_OPERAND_FRJ :
1836 fields->f_FRj = value;
1837 break;
1838 case FRV_OPERAND_FRK :
1839 fields->f_FRk = value;
1840 break;
1841 case FRV_OPERAND_FRKHI :
1842 fields->f_FRk = value;
1843 break;
1844 case FRV_OPERAND_FRKLO :
1845 fields->f_FRk = value;
1846 break;
1847 case FRV_OPERAND_GRDOUBLEK :
1848 fields->f_GRk = value;
1849 break;
1850 case FRV_OPERAND_GRI :
1851 fields->f_GRi = value;
1852 break;
1853 case FRV_OPERAND_GRJ :
1854 fields->f_GRj = value;
1855 break;
1856 case FRV_OPERAND_GRK :
1857 fields->f_GRk = value;
1858 break;
1859 case FRV_OPERAND_GRKHI :
1860 fields->f_GRk = value;
1861 break;
1862 case FRV_OPERAND_GRKLO :
1863 fields->f_GRk = value;
1864 break;
1865 case FRV_OPERAND_ICCI_1 :
1866 fields->f_ICCi_1 = value;
1867 break;
1868 case FRV_OPERAND_ICCI_2 :
1869 fields->f_ICCi_2 = value;
1870 break;
1871 case FRV_OPERAND_ICCI_3 :
1872 fields->f_ICCi_3 = value;
1873 break;
1874 case FRV_OPERAND_LI :
1875 fields->f_LI = value;
1876 break;
1877 case FRV_OPERAND_LRAD :
1878 fields->f_LRAD = value;
1879 break;
1880 case FRV_OPERAND_LRAE :
1881 fields->f_LRAE = value;
1882 break;
1883 case FRV_OPERAND_LRAS :
1884 fields->f_LRAS = value;
1885 break;
1886 case FRV_OPERAND_TLBPRL :
1887 fields->f_TLBPRL = value;
1888 break;
1889 case FRV_OPERAND_TLBPROPX :
1890 fields->f_TLBPRopx = value;
1891 break;
1892 case FRV_OPERAND_AE :
1893 fields->f_ae = value;
1894 break;
1895 case FRV_OPERAND_CALLANN :
1896 fields->f_reloc_ann = value;
1897 break;
1898 case FRV_OPERAND_CCOND :
1899 fields->f_ccond = value;
1900 break;
1901 case FRV_OPERAND_COND :
1902 fields->f_cond = value;
1903 break;
1904 case FRV_OPERAND_D12 :
1905 fields->f_d12 = value;
1906 break;
1907 case FRV_OPERAND_DEBUG :
1908 fields->f_debug = value;
1909 break;
1910 case FRV_OPERAND_EIR :
1911 fields->f_eir = value;
1912 break;
1913 case FRV_OPERAND_HINT :
1914 fields->f_hint = value;
1915 break;
1916 case FRV_OPERAND_HINT_NOT_TAKEN :
1917 fields->f_hint = value;
1918 break;
1919 case FRV_OPERAND_HINT_TAKEN :
1920 fields->f_hint = value;
1921 break;
1922 case FRV_OPERAND_LABEL16 :
1923 fields->f_label16 = value;
1924 break;
1925 case FRV_OPERAND_LABEL24 :
1926 fields->f_label24 = value;
1927 break;
1928 case FRV_OPERAND_LDANN :
1929 fields->f_reloc_ann = value;
1930 break;
1931 case FRV_OPERAND_LDDANN :
1932 fields->f_reloc_ann = value;
1933 break;
1934 case FRV_OPERAND_LOCK :
1935 fields->f_lock = value;
1936 break;
1937 case FRV_OPERAND_PACK :
1938 fields->f_pack = value;
1939 break;
1940 case FRV_OPERAND_S10 :
1941 fields->f_s10 = value;
1942 break;
1943 case FRV_OPERAND_S12 :
1944 fields->f_d12 = value;
1945 break;
1946 case FRV_OPERAND_S16 :
1947 fields->f_s16 = value;
1948 break;
1949 case FRV_OPERAND_S5 :
1950 fields->f_s5 = value;
1951 break;
1952 case FRV_OPERAND_S6 :
1953 fields->f_s6 = value;
1954 break;
1955 case FRV_OPERAND_S6_1 :
1956 fields->f_s6_1 = value;
1957 break;
1958 case FRV_OPERAND_SLO16 :
1959 fields->f_s16 = value;
1960 break;
1961 case FRV_OPERAND_SPR :
1962 fields->f_spr = value;
1963 break;
1964 case FRV_OPERAND_U12 :
1965 fields->f_u12 = value;
1966 break;
1967 case FRV_OPERAND_U16 :
1968 fields->f_u16 = value;
1969 break;
1970 case FRV_OPERAND_U6 :
1971 fields->f_u6 = value;
1972 break;
1973 case FRV_OPERAND_UHI16 :
1974 fields->f_u16 = value;
1975 break;
1976 case FRV_OPERAND_ULO16 :
1977 fields->f_u16 = value;
1978 break;
1979
1980 default :
1981 /* xgettext:c-format */
1982 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
1983 opindex);
1984 abort ();
1985 }
1986 }
1987
1988 void
1989 frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
1990 int opindex,
1991 CGEN_FIELDS * fields,
1992 bfd_vma value)
1993 {
1994 switch (opindex)
1995 {
1996 case FRV_OPERAND_A0 :
1997 fields->f_A = value;
1998 break;
1999 case FRV_OPERAND_A1 :
2000 fields->f_A = value;
2001 break;
2002 case FRV_OPERAND_ACC40SI :
2003 fields->f_ACC40Si = value;
2004 break;
2005 case FRV_OPERAND_ACC40SK :
2006 fields->f_ACC40Sk = value;
2007 break;
2008 case FRV_OPERAND_ACC40UI :
2009 fields->f_ACC40Ui = value;
2010 break;
2011 case FRV_OPERAND_ACC40UK :
2012 fields->f_ACC40Uk = value;
2013 break;
2014 case FRV_OPERAND_ACCGI :
2015 fields->f_ACCGi = value;
2016 break;
2017 case FRV_OPERAND_ACCGK :
2018 fields->f_ACCGk = value;
2019 break;
2020 case FRV_OPERAND_CCI :
2021 fields->f_CCi = value;
2022 break;
2023 case FRV_OPERAND_CPRDOUBLEK :
2024 fields->f_CPRk = value;
2025 break;
2026 case FRV_OPERAND_CPRI :
2027 fields->f_CPRi = value;
2028 break;
2029 case FRV_OPERAND_CPRJ :
2030 fields->f_CPRj = value;
2031 break;
2032 case FRV_OPERAND_CPRK :
2033 fields->f_CPRk = value;
2034 break;
2035 case FRV_OPERAND_CRI :
2036 fields->f_CRi = value;
2037 break;
2038 case FRV_OPERAND_CRJ :
2039 fields->f_CRj = value;
2040 break;
2041 case FRV_OPERAND_CRJ_FLOAT :
2042 fields->f_CRj_float = value;
2043 break;
2044 case FRV_OPERAND_CRJ_INT :
2045 fields->f_CRj_int = value;
2046 break;
2047 case FRV_OPERAND_CRK :
2048 fields->f_CRk = value;
2049 break;
2050 case FRV_OPERAND_FCCI_1 :
2051 fields->f_FCCi_1 = value;
2052 break;
2053 case FRV_OPERAND_FCCI_2 :
2054 fields->f_FCCi_2 = value;
2055 break;
2056 case FRV_OPERAND_FCCI_3 :
2057 fields->f_FCCi_3 = value;
2058 break;
2059 case FRV_OPERAND_FCCK :
2060 fields->f_FCCk = value;
2061 break;
2062 case FRV_OPERAND_FRDOUBLEI :
2063 fields->f_FRi = value;
2064 break;
2065 case FRV_OPERAND_FRDOUBLEJ :
2066 fields->f_FRj = value;
2067 break;
2068 case FRV_OPERAND_FRDOUBLEK :
2069 fields->f_FRk = value;
2070 break;
2071 case FRV_OPERAND_FRI :
2072 fields->f_FRi = value;
2073 break;
2074 case FRV_OPERAND_FRINTI :
2075 fields->f_FRi = value;
2076 break;
2077 case FRV_OPERAND_FRINTIEVEN :
2078 fields->f_FRi = value;
2079 break;
2080 case FRV_OPERAND_FRINTJ :
2081 fields->f_FRj = value;
2082 break;
2083 case FRV_OPERAND_FRINTJEVEN :
2084 fields->f_FRj = value;
2085 break;
2086 case FRV_OPERAND_FRINTK :
2087 fields->f_FRk = value;
2088 break;
2089 case FRV_OPERAND_FRINTKEVEN :
2090 fields->f_FRk = value;
2091 break;
2092 case FRV_OPERAND_FRJ :
2093 fields->f_FRj = value;
2094 break;
2095 case FRV_OPERAND_FRK :
2096 fields->f_FRk = value;
2097 break;
2098 case FRV_OPERAND_FRKHI :
2099 fields->f_FRk = value;
2100 break;
2101 case FRV_OPERAND_FRKLO :
2102 fields->f_FRk = value;
2103 break;
2104 case FRV_OPERAND_GRDOUBLEK :
2105 fields->f_GRk = value;
2106 break;
2107 case FRV_OPERAND_GRI :
2108 fields->f_GRi = value;
2109 break;
2110 case FRV_OPERAND_GRJ :
2111 fields->f_GRj = value;
2112 break;
2113 case FRV_OPERAND_GRK :
2114 fields->f_GRk = value;
2115 break;
2116 case FRV_OPERAND_GRKHI :
2117 fields->f_GRk = value;
2118 break;
2119 case FRV_OPERAND_GRKLO :
2120 fields->f_GRk = value;
2121 break;
2122 case FRV_OPERAND_ICCI_1 :
2123 fields->f_ICCi_1 = value;
2124 break;
2125 case FRV_OPERAND_ICCI_2 :
2126 fields->f_ICCi_2 = value;
2127 break;
2128 case FRV_OPERAND_ICCI_3 :
2129 fields->f_ICCi_3 = value;
2130 break;
2131 case FRV_OPERAND_LI :
2132 fields->f_LI = value;
2133 break;
2134 case FRV_OPERAND_LRAD :
2135 fields->f_LRAD = value;
2136 break;
2137 case FRV_OPERAND_LRAE :
2138 fields->f_LRAE = value;
2139 break;
2140 case FRV_OPERAND_LRAS :
2141 fields->f_LRAS = value;
2142 break;
2143 case FRV_OPERAND_TLBPRL :
2144 fields->f_TLBPRL = value;
2145 break;
2146 case FRV_OPERAND_TLBPROPX :
2147 fields->f_TLBPRopx = value;
2148 break;
2149 case FRV_OPERAND_AE :
2150 fields->f_ae = value;
2151 break;
2152 case FRV_OPERAND_CALLANN :
2153 fields->f_reloc_ann = value;
2154 break;
2155 case FRV_OPERAND_CCOND :
2156 fields->f_ccond = value;
2157 break;
2158 case FRV_OPERAND_COND :
2159 fields->f_cond = value;
2160 break;
2161 case FRV_OPERAND_D12 :
2162 fields->f_d12 = value;
2163 break;
2164 case FRV_OPERAND_DEBUG :
2165 fields->f_debug = value;
2166 break;
2167 case FRV_OPERAND_EIR :
2168 fields->f_eir = value;
2169 break;
2170 case FRV_OPERAND_HINT :
2171 fields->f_hint = value;
2172 break;
2173 case FRV_OPERAND_HINT_NOT_TAKEN :
2174 fields->f_hint = value;
2175 break;
2176 case FRV_OPERAND_HINT_TAKEN :
2177 fields->f_hint = value;
2178 break;
2179 case FRV_OPERAND_LABEL16 :
2180 fields->f_label16 = value;
2181 break;
2182 case FRV_OPERAND_LABEL24 :
2183 fields->f_label24 = value;
2184 break;
2185 case FRV_OPERAND_LDANN :
2186 fields->f_reloc_ann = value;
2187 break;
2188 case FRV_OPERAND_LDDANN :
2189 fields->f_reloc_ann = value;
2190 break;
2191 case FRV_OPERAND_LOCK :
2192 fields->f_lock = value;
2193 break;
2194 case FRV_OPERAND_PACK :
2195 fields->f_pack = value;
2196 break;
2197 case FRV_OPERAND_S10 :
2198 fields->f_s10 = value;
2199 break;
2200 case FRV_OPERAND_S12 :
2201 fields->f_d12 = value;
2202 break;
2203 case FRV_OPERAND_S16 :
2204 fields->f_s16 = value;
2205 break;
2206 case FRV_OPERAND_S5 :
2207 fields->f_s5 = value;
2208 break;
2209 case FRV_OPERAND_S6 :
2210 fields->f_s6 = value;
2211 break;
2212 case FRV_OPERAND_S6_1 :
2213 fields->f_s6_1 = value;
2214 break;
2215 case FRV_OPERAND_SLO16 :
2216 fields->f_s16 = value;
2217 break;
2218 case FRV_OPERAND_SPR :
2219 fields->f_spr = value;
2220 break;
2221 case FRV_OPERAND_U12 :
2222 fields->f_u12 = value;
2223 break;
2224 case FRV_OPERAND_U16 :
2225 fields->f_u16 = value;
2226 break;
2227 case FRV_OPERAND_U6 :
2228 fields->f_u6 = value;
2229 break;
2230 case FRV_OPERAND_UHI16 :
2231 fields->f_u16 = value;
2232 break;
2233 case FRV_OPERAND_ULO16 :
2234 fields->f_u16 = value;
2235 break;
2236
2237 default :
2238 /* xgettext:c-format */
2239 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
2240 opindex);
2241 abort ();
2242 }
2243 }
2244
2245 /* Function to call before using the instruction builder tables. */
2246
2247 void
2248 frv_cgen_init_ibld_table (CGEN_CPU_DESC cd)
2249 {
2250 cd->insert_handlers = & frv_cgen_insert_handlers[0];
2251 cd->extract_handlers = & frv_cgen_extract_handlers[0];
2252
2253 cd->insert_operand = frv_cgen_insert_operand;
2254 cd->extract_operand = frv_cgen_extract_operand;
2255
2256 cd->get_int_operand = frv_cgen_get_int_operand;
2257 cd->set_int_operand = frv_cgen_set_int_operand;
2258 cd->get_vma_operand = frv_cgen_get_vma_operand;
2259 cd->set_vma_operand = frv_cgen_set_vma_operand;
2260 }
This page took 0.108872 seconds and 3 git commands to generate.