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-2025 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 74 /* Operand insertion. */ 76 77 #if ! CGEN_INT_INSN_P 78 79 /* Subroutine of insert_normal. */ 80 81 static CGEN_INLINE void 82 insert_1 (CGEN_CPU_DESC cd, 83 unsigned long value, 84 int start, 85 int length, 86 int word_length, 87 unsigned char *bufp) 88 { 89 unsigned long x, mask; 90 int shift; 91 92 x = cgen_get_insn_value (cd, bufp, word_length, cd->endian); 93 94 /* Written this way to avoid undefined behaviour. */ 95 mask = (1UL << (length - 1) << 1) - 1; 96 if (CGEN_INSN_LSB0_P) 97 shift = (start + 1) - length; 98 else 99 shift = (word_length - (start + length)); 100 x = (x & ~(mask << shift)) | ((value & mask) << shift); 101 102 cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x, cd->endian); 103 } 104 105 #endif /* ! CGEN_INT_INSN_P */ 106 107 /* Default insertion routine. 108 109 ATTRS is a mask of the boolean attributes. 110 WORD_OFFSET is the offset in bits from the start of the insn of the value. 111 WORD_LENGTH is the length of the word in bits in which the value resides. 112 START is the starting bit number in the word, architecture origin. 113 LENGTH is the length of VALUE in bits. 114 TOTAL_LENGTH is the total length of the insn in bits. 115 116 The result is an error message or NULL if success. */ 117 118 /* ??? This duplicates functionality with bfd's howto table and 119 bfd_install_relocation. */ 120 /* ??? This doesn't handle bfd_vma's. Create another function when 121 necessary. */ 122 123 static const char * 124 insert_normal (CGEN_CPU_DESC cd, 125 long value, 126 unsigned int attrs, 127 unsigned int word_offset, 128 unsigned int start, 129 unsigned int length, 130 unsigned int word_length, 131 unsigned int total_length, 132 CGEN_INSN_BYTES_PTR buffer) 133 { 134 static char errbuf[100]; 135 unsigned long mask; 136 137 /* If LENGTH is zero, this operand doesn't contribute to the value. */ 138 if (length == 0) 139 return NULL; 140 141 /* Written this way to avoid undefined behaviour. */ 142 mask = (1UL << (length - 1) << 1) - 1; 143 144 if (word_length > 8 * sizeof (CGEN_INSN_INT)) 145 abort (); 146 147 /* For architectures with insns smaller than the base-insn-bitsize, 148 word_length may be too big. */ 149 if (cd->min_insn_bitsize < cd->base_insn_bitsize) 150 { 151 if (word_offset == 0 152 && word_length > total_length) 153 word_length = total_length; 154 } 155 156 /* Ensure VALUE will fit. */ 157 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT)) 158 { 159 long minval = - (1UL << (length - 1)); 160 unsigned long maxval = mask; 161 162 if ((value > 0 && (unsigned long) value > maxval) 163 || value < minval) 164 { 165 /* xgettext:c-format */ 166 sprintf (errbuf, 167 _("operand out of range (%ld not between %ld and %lu)"), 168 value, minval, maxval); 169 return errbuf; 170 } 171 } 172 else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)) 173 { 174 unsigned long maxval = mask; 175 unsigned long val = (unsigned long) value; 176 177 /* For hosts with a word size > 32 check to see if value has been sign 178 extended beyond 32 bits. If so then ignore these higher sign bits 179 as the user is attempting to store a 32-bit signed value into an 180 unsigned 32-bit field which is allowed. */ 181 if (sizeof (unsigned long) > 4 && ((value >> 32) == -1)) 182 val &= 0xFFFFFFFF; 183 184 if (val > maxval) 185 { 186 /* xgettext:c-format */ 187 sprintf (errbuf, 188 _("operand out of range (0x%lx not between 0 and 0x%lx)"), 189 val, maxval); 190 return errbuf; 191 } 192 } 193 else 194 { 195 if (! cgen_signed_overflow_ok_p (cd)) 196 { 197 long minval = - (1UL << (length - 1)); 198 long maxval = (1UL << (length - 1)) - 1; 199 200 if (value < minval || value > maxval) 201 { 202 sprintf 203 /* xgettext:c-format */ 204 (errbuf, _("operand out of range (%ld not between %ld and %ld)"), 205 value, minval, maxval); 206 return errbuf; 207 } 208 } 209 } 210 211 #if CGEN_INT_INSN_P 212 213 { 214 int shift_within_word, shift_to_word, shift; 215 216 /* How to shift the value to BIT0 of the word. */ 217 shift_to_word = total_length - (word_offset + word_length); 218 219 /* How to shift the value to the field within the word. */ 220 if (CGEN_INSN_LSB0_P) 221 shift_within_word = start + 1 - length; 222 else 223 shift_within_word = word_length - start - length; 224 225 /* The total SHIFT, then mask in the value. */ 226 shift = shift_to_word + shift_within_word; 227 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift); 228 } 229 230 #else /* ! CGEN_INT_INSN_P */ 231 232 { 233 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8; 234 235 insert_1 (cd, value, start, length, word_length, bufp); 236 } 237 238 #endif /* ! CGEN_INT_INSN_P */ 239 240 return NULL; 241 } 242 243 /* Default insn builder (insert handler). 244 The instruction is recorded in CGEN_INT_INSN_P byte order (meaning 245 that if CGEN_INSN_BYTES_PTR is an int * and thus, the value is 246 recorded in host byte order, otherwise BUFFER is an array of bytes 247 and the value is recorded in target byte order). 248 The result is an error message or NULL if success. */ 249 250 static const char * 251 insert_insn_normal (CGEN_CPU_DESC cd, 252 const CGEN_INSN * insn, 253 CGEN_FIELDS * fields, 254 CGEN_INSN_BYTES_PTR buffer, 255 bfd_vma pc) 256 { 257 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 258 unsigned long value; 259 const CGEN_SYNTAX_CHAR_TYPE * syn; 260 261 CGEN_INIT_INSERT (cd); 262 value = CGEN_INSN_BASE_VALUE (insn); 263 264 /* If we're recording insns as numbers (rather than a string of bytes), 265 target byte order handling is deferred until later. */ 266 267 #if CGEN_INT_INSN_P 268 269 put_insn_int_value (cd, buffer, cd->base_insn_bitsize, 270 CGEN_FIELDS_BITSIZE (fields), value); 271 272 #else 273 274 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize, 275 (unsigned) CGEN_FIELDS_BITSIZE (fields)), 276 value, cd->insn_endian); 277 278 #endif /* ! CGEN_INT_INSN_P */ 279 280 /* ??? It would be better to scan the format's fields. 281 Still need to be able to insert a value based on the operand though; 282 e.g. storing a branch displacement that got resolved later. 283 Needs more thought first. */ 284 285 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn) 286 { 287 const char *errmsg; 288 289 if (CGEN_SYNTAX_CHAR_P (* syn)) 290 continue; 291 292 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 293 fields, buffer, pc); 294 if (errmsg) 295 return errmsg; 296 } 297 298 return NULL; 299 } 300 301 #if CGEN_INT_INSN_P 302 /* Cover function to store an insn value into an integral insn. Must go here 303 because it needs <prefix>-desc.h for CGEN_INT_INSN_P. */ 304 305 static void 306 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 307 CGEN_INSN_BYTES_PTR buf, 308 int length, 309 int insn_length, 310 CGEN_INSN_INT value) 311 { 312 /* For architectures with insns smaller than the base-insn-bitsize, 313 length may be too big. */ 314 if (length > insn_length) 315 *buf = value; 316 else 317 { 318 int shift = insn_length - length; 319 /* Written this way to avoid undefined behaviour. */ 320 CGEN_INSN_INT mask = length == 0 ? 0 : (1UL << (length - 1) << 1) - 1; 321 322 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift); 323 } 324 } 325 #endif 326 327 /* Operand extraction. */ 329 330 #if ! CGEN_INT_INSN_P 331 332 /* Subroutine of extract_normal. 333 Ensure sufficient bytes are cached in EX_INFO. 334 OFFSET is the offset in bytes from the start of the insn of the value. 335 BYTES is the length of the needed value. 336 Returns 1 for success, 0 for failure. */ 337 338 static CGEN_INLINE int 339 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 340 CGEN_EXTRACT_INFO *ex_info, 341 int offset, 342 int bytes, 343 bfd_vma pc) 344 { 345 /* It's doubtful that the middle part has already been fetched so 346 we don't optimize that case. kiss. */ 347 unsigned int mask; 348 disassemble_info *info = (disassemble_info *) ex_info->dis_info; 349 350 /* First do a quick check. */ 351 mask = (1 << bytes) - 1; 352 if (((ex_info->valid >> offset) & mask) == mask) 353 return 1; 354 355 /* Search for the first byte we need to read. */ 356 for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1) 357 if (! (mask & ex_info->valid)) 358 break; 359 360 if (bytes) 361 { 362 int status; 363 364 pc += offset; 365 status = (*info->read_memory_func) 366 (pc, ex_info->insn_bytes + offset, bytes, info); 367 368 if (status != 0) 369 { 370 (*info->memory_error_func) (status, pc, info); 371 return 0; 372 } 373 374 ex_info->valid |= ((1 << bytes) - 1) << offset; 375 } 376 377 return 1; 378 } 379 380 /* Subroutine of extract_normal. */ 381 382 static CGEN_INLINE long 383 extract_1 (CGEN_CPU_DESC cd, 384 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 385 int start, 386 int length, 387 int word_length, 388 unsigned char *bufp, 389 bfd_vma pc ATTRIBUTE_UNUSED) 390 { 391 unsigned long x; 392 int shift; 393 394 x = cgen_get_insn_value (cd, bufp, word_length, cd->endian); 395 396 if (CGEN_INSN_LSB0_P) 397 shift = (start + 1) - length; 398 else 399 shift = (word_length - (start + length)); 400 return x >> shift; 401 } 402 403 #endif /* ! CGEN_INT_INSN_P */ 404 405 /* Default extraction routine. 406 407 INSN_VALUE is the first base_insn_bitsize bits of the insn in host order, 408 or sometimes less for cases like the m32r where the base insn size is 32 409 but some insns are 16 bits. 410 ATTRS is a mask of the boolean attributes. We only need `SIGNED', 411 but for generality we take a bitmask of all of them. 412 WORD_OFFSET is the offset in bits from the start of the insn of the value. 413 WORD_LENGTH is the length of the word in bits in which the value resides. 414 START is the starting bit number in the word, architecture origin. 415 LENGTH is the length of VALUE in bits. 416 TOTAL_LENGTH is the total length of the insn in bits. 417 418 Returns 1 for success, 0 for failure. */ 419 420 /* ??? The return code isn't properly used. wip. */ 421 422 /* ??? This doesn't handle bfd_vma's. Create another function when 423 necessary. */ 424 425 static int 426 extract_normal (CGEN_CPU_DESC cd, 427 #if ! CGEN_INT_INSN_P 428 CGEN_EXTRACT_INFO *ex_info, 429 #else 430 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED, 431 #endif 432 CGEN_INSN_INT insn_value, 433 unsigned int attrs, 434 unsigned int word_offset, 435 unsigned int start, 436 unsigned int length, 437 unsigned int word_length, 438 unsigned int total_length, 439 #if ! CGEN_INT_INSN_P 440 bfd_vma pc, 441 #else 442 bfd_vma pc ATTRIBUTE_UNUSED, 443 #endif 444 long *valuep) 445 { 446 long value, mask; 447 448 /* If LENGTH is zero, this operand doesn't contribute to the value 449 so give it a standard value of zero. */ 450 if (length == 0) 451 { 452 *valuep = 0; 453 return 1; 454 } 455 456 if (word_length > 8 * sizeof (CGEN_INSN_INT)) 457 abort (); 458 459 /* For architectures with insns smaller than the insn-base-bitsize, 460 word_length may be too big. */ 461 if (cd->min_insn_bitsize < cd->base_insn_bitsize) 462 { 463 if (word_offset + word_length > total_length) 464 word_length = total_length - word_offset; 465 } 466 467 /* Does the value reside in INSN_VALUE, and at the right alignment? */ 468 469 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length)) 470 { 471 if (CGEN_INSN_LSB0_P) 472 value = insn_value >> ((word_offset + start + 1) - length); 473 else 474 value = insn_value >> (total_length - ( word_offset + start + length)); 475 } 476 477 #if ! CGEN_INT_INSN_P 478 479 else 480 { 481 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8; 482 483 if (word_length > 8 * sizeof (CGEN_INSN_INT)) 484 abort (); 485 486 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0) 487 { 488 *valuep = 0; 489 return 0; 490 } 491 492 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc); 493 } 494 495 #endif /* ! CGEN_INT_INSN_P */ 496 497 /* Written this way to avoid undefined behaviour. */ 498 mask = (1UL << (length - 1) << 1) - 1; 499 500 value &= mask; 501 /* sign extend? */ 502 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED) 503 && (value & (1UL << (length - 1)))) 504 value |= ~mask; 505 506 *valuep = value; 507 508 return 1; 509 } 510 511 /* Default insn extractor. 512 513 INSN_VALUE is the first base_insn_bitsize bits, translated to host order. 514 The extracted fields are stored in FIELDS. 515 EX_INFO is used to handle reading variable length insns. 516 Return the length of the insn in bits, or 0 if no match, 517 or -1 if an error occurs fetching data (memory_error_func will have 518 been called). */ 519 520 static int 521 extract_insn_normal (CGEN_CPU_DESC cd, 522 const CGEN_INSN *insn, 523 CGEN_EXTRACT_INFO *ex_info, 524 CGEN_INSN_INT insn_value, 525 CGEN_FIELDS *fields, 526 bfd_vma pc) 527 { 528 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn); 529 const CGEN_SYNTAX_CHAR_TYPE *syn; 530 531 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn); 532 533 CGEN_INIT_EXTRACT (cd); 534 535 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn) 536 { 537 int length; 538 539 if (CGEN_SYNTAX_CHAR_P (*syn)) 540 continue; 541 542 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn), 543 ex_info, insn_value, fields, pc); 544 if (length <= 0) 545 return length; 546 } 547 548 /* We recognized and successfully extracted this insn. */ 549 return CGEN_INSN_BITSIZE (insn); 550 } 551 552 /* Machine generated code added here. */ 554 555 const char * frv_cgen_insert_operand 556 (CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma); 557 558 /* Main entry point for operand insertion. 559 560 This function is basically just a big switch statement. Earlier versions 561 used tables to look up the function to use, but 562 - if the table contains both assembler and disassembler functions then 563 the disassembler contains much of the assembler and vice-versa, 564 - there's a lot of inlining possibilities as things grow, 565 - using a switch statement avoids the function call overhead. 566 567 This function could be moved into `parse_insn_normal', but keeping it 568 separate makes clear the interface between `parse_insn_normal' and each of 569 the handlers. It's also needed by GAS to insert operands that couldn't be 570 resolved during parsing. */ 571 572 const char * 573 frv_cgen_insert_operand (CGEN_CPU_DESC cd, 574 int opindex, 575 CGEN_FIELDS * fields, 576 CGEN_INSN_BYTES_PTR buffer, 577 bfd_vma pc ATTRIBUTE_UNUSED) 578 { 579 const char * errmsg = NULL; 580 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 581 582 switch (opindex) 583 { 584 case FRV_OPERAND_A0 : 585 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer); 586 break; 587 case FRV_OPERAND_A1 : 588 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer); 589 break; 590 case FRV_OPERAND_ACC40SI : 591 errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer); 592 break; 593 case FRV_OPERAND_ACC40SK : 594 errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer); 595 break; 596 case FRV_OPERAND_ACC40UI : 597 errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer); 598 break; 599 case FRV_OPERAND_ACC40UK : 600 errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer); 601 break; 602 case FRV_OPERAND_ACCGI : 603 errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer); 604 break; 605 case FRV_OPERAND_ACCGK : 606 errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer); 607 break; 608 case FRV_OPERAND_CCI : 609 errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer); 610 break; 611 case FRV_OPERAND_CPRDOUBLEK : 612 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer); 613 break; 614 case FRV_OPERAND_CPRI : 615 errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer); 616 break; 617 case FRV_OPERAND_CPRJ : 618 errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer); 619 break; 620 case FRV_OPERAND_CPRK : 621 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer); 622 break; 623 case FRV_OPERAND_CRI : 624 errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer); 625 break; 626 case FRV_OPERAND_CRJ : 627 errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer); 628 break; 629 case FRV_OPERAND_CRJ_FLOAT : 630 errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer); 631 break; 632 case FRV_OPERAND_CRJ_INT : 633 { 634 long value = fields->f_CRj_int; 635 value = ((value) - (4)); 636 errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer); 637 } 638 break; 639 case FRV_OPERAND_CRK : 640 errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer); 641 break; 642 case FRV_OPERAND_FCCI_1 : 643 errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer); 644 break; 645 case FRV_OPERAND_FCCI_2 : 646 errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer); 647 break; 648 case FRV_OPERAND_FCCI_3 : 649 errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer); 650 break; 651 case FRV_OPERAND_FCCK : 652 errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer); 653 break; 654 case FRV_OPERAND_FRDOUBLEI : 655 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer); 656 break; 657 case FRV_OPERAND_FRDOUBLEJ : 658 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer); 659 break; 660 case FRV_OPERAND_FRDOUBLEK : 661 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 662 break; 663 case FRV_OPERAND_FRI : 664 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer); 665 break; 666 case FRV_OPERAND_FRINTI : 667 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer); 668 break; 669 case FRV_OPERAND_FRINTIEVEN : 670 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer); 671 break; 672 case FRV_OPERAND_FRINTJ : 673 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer); 674 break; 675 case FRV_OPERAND_FRINTJEVEN : 676 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer); 677 break; 678 case FRV_OPERAND_FRINTK : 679 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 680 break; 681 case FRV_OPERAND_FRINTKEVEN : 682 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 683 break; 684 case FRV_OPERAND_FRJ : 685 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer); 686 break; 687 case FRV_OPERAND_FRK : 688 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 689 break; 690 case FRV_OPERAND_FRKHI : 691 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 692 break; 693 case FRV_OPERAND_FRKLO : 694 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer); 695 break; 696 case FRV_OPERAND_GRDOUBLEK : 697 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer); 698 break; 699 case FRV_OPERAND_GRI : 700 errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer); 701 break; 702 case FRV_OPERAND_GRJ : 703 errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer); 704 break; 705 case FRV_OPERAND_GRK : 706 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer); 707 break; 708 case FRV_OPERAND_GRKHI : 709 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer); 710 break; 711 case FRV_OPERAND_GRKLO : 712 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer); 713 break; 714 case FRV_OPERAND_ICCI_1 : 715 errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer); 716 break; 717 case FRV_OPERAND_ICCI_2 : 718 errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer); 719 break; 720 case FRV_OPERAND_ICCI_3 : 721 errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer); 722 break; 723 case FRV_OPERAND_LI : 724 errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer); 725 break; 726 case FRV_OPERAND_LRAD : 727 errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer); 728 break; 729 case FRV_OPERAND_LRAE : 730 errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer); 731 break; 732 case FRV_OPERAND_LRAS : 733 errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer); 734 break; 735 case FRV_OPERAND_TLBPRL : 736 errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer); 737 break; 738 case FRV_OPERAND_TLBPROPX : 739 errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer); 740 break; 741 case FRV_OPERAND_AE : 742 errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer); 743 break; 744 case FRV_OPERAND_CALLANN : 745 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer); 746 break; 747 case FRV_OPERAND_CCOND : 748 errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer); 749 break; 750 case FRV_OPERAND_COND : 751 errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer); 752 break; 753 case FRV_OPERAND_D12 : 754 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer); 755 break; 756 case FRV_OPERAND_DEBUG : 757 errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer); 758 break; 759 case FRV_OPERAND_EIR : 760 errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer); 761 break; 762 case FRV_OPERAND_HINT : 763 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer); 764 break; 765 case FRV_OPERAND_HINT_NOT_TAKEN : 766 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer); 767 break; 768 case FRV_OPERAND_HINT_TAKEN : 769 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer); 770 break; 771 case FRV_OPERAND_LABEL16 : 772 { 773 long value = fields->f_label16; 774 value = ((SI) (((value) - (pc))) >> (2)); 775 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer); 776 } 777 break; 778 case FRV_OPERAND_LABEL24 : 779 { 780 { 781 FLD (f_labelH6) = ((SI) (((FLD (f_label24)) - (pc))) >> (20)); 782 FLD (f_labelL18) = ((((UINT) (((FLD (f_label24)) - (pc))) >> (2))) & (262143)); 783 } 784 errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer); 785 if (errmsg) 786 break; 787 errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer); 788 if (errmsg) 789 break; 790 } 791 break; 792 case FRV_OPERAND_LDANN : 793 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer); 794 break; 795 case FRV_OPERAND_LDDANN : 796 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer); 797 break; 798 case FRV_OPERAND_LOCK : 799 errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer); 800 break; 801 case FRV_OPERAND_PACK : 802 errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer); 803 break; 804 case FRV_OPERAND_S10 : 805 errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer); 806 break; 807 case FRV_OPERAND_S12 : 808 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer); 809 break; 810 case FRV_OPERAND_S16 : 811 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer); 812 break; 813 case FRV_OPERAND_S5 : 814 errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer); 815 break; 816 case FRV_OPERAND_S6 : 817 errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer); 818 break; 819 case FRV_OPERAND_S6_1 : 820 errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer); 821 break; 822 case FRV_OPERAND_SLO16 : 823 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer); 824 break; 825 case FRV_OPERAND_SPR : 826 { 827 { 828 FLD (f_spr_h) = ((UINT) (FLD (f_spr)) >> (6)); 829 FLD (f_spr_l) = ((FLD (f_spr)) & (63)); 830 } 831 errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer); 832 if (errmsg) 833 break; 834 errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer); 835 if (errmsg) 836 break; 837 } 838 break; 839 case FRV_OPERAND_U12 : 840 { 841 { 842 FLD (f_u12_h) = ((SI) (FLD (f_u12)) >> (6)); 843 FLD (f_u12_l) = ((FLD (f_u12)) & (63)); 844 } 845 errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer); 846 if (errmsg) 847 break; 848 errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer); 849 if (errmsg) 850 break; 851 } 852 break; 853 case FRV_OPERAND_U16 : 854 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer); 855 break; 856 case FRV_OPERAND_U6 : 857 errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer); 858 break; 859 case FRV_OPERAND_UHI16 : 860 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer); 861 break; 862 case FRV_OPERAND_ULO16 : 863 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer); 864 break; 865 866 default : 867 /* xgettext:c-format */ 868 opcodes_error_handler 869 (_("internal error: unrecognized field %d while building insn"), 870 opindex); 871 abort (); 872 } 873 874 return errmsg; 875 } 876 877 int frv_cgen_extract_operand 878 (CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma); 879 880 /* Main entry point for operand extraction. 881 The result is <= 0 for error, >0 for success. 882 ??? Actual values aren't well defined right now. 883 884 This function is basically just a big switch statement. Earlier versions 885 used tables to look up the function to use, but 886 - if the table contains both assembler and disassembler functions then 887 the disassembler contains much of the assembler and vice-versa, 888 - there's a lot of inlining possibilities as things grow, 889 - using a switch statement avoids the function call overhead. 890 891 This function could be moved into `print_insn_normal', but keeping it 892 separate makes clear the interface between `print_insn_normal' and each of 893 the handlers. */ 894 895 int 896 frv_cgen_extract_operand (CGEN_CPU_DESC cd, 897 int opindex, 898 CGEN_EXTRACT_INFO *ex_info, 899 CGEN_INSN_INT insn_value, 900 CGEN_FIELDS * fields, 901 bfd_vma pc) 902 { 903 /* Assume success (for those operands that are nops). */ 904 int length = 1; 905 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields); 906 907 switch (opindex) 908 { 909 case FRV_OPERAND_A0 : 910 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A); 911 break; 912 case FRV_OPERAND_A1 : 913 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A); 914 break; 915 case FRV_OPERAND_ACC40SI : 916 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si); 917 break; 918 case FRV_OPERAND_ACC40SK : 919 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk); 920 break; 921 case FRV_OPERAND_ACC40UI : 922 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui); 923 break; 924 case FRV_OPERAND_ACC40UK : 925 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk); 926 break; 927 case FRV_OPERAND_ACCGI : 928 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi); 929 break; 930 case FRV_OPERAND_ACCGK : 931 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk); 932 break; 933 case FRV_OPERAND_CCI : 934 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi); 935 break; 936 case FRV_OPERAND_CPRDOUBLEK : 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_CPRI : 940 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi); 941 break; 942 case FRV_OPERAND_CPRJ : 943 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj); 944 break; 945 case FRV_OPERAND_CPRK : 946 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk); 947 break; 948 case FRV_OPERAND_CRI : 949 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi); 950 break; 951 case FRV_OPERAND_CRJ : 952 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj); 953 break; 954 case FRV_OPERAND_CRJ_FLOAT : 955 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float); 956 break; 957 case FRV_OPERAND_CRJ_INT : 958 { 959 long value; 960 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value); 961 value = ((value) + (4)); 962 fields->f_CRj_int = value; 963 } 964 break; 965 case FRV_OPERAND_CRK : 966 length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk); 967 break; 968 case FRV_OPERAND_FCCI_1 : 969 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1); 970 break; 971 case FRV_OPERAND_FCCI_2 : 972 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2); 973 break; 974 case FRV_OPERAND_FCCI_3 : 975 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3); 976 break; 977 case FRV_OPERAND_FCCK : 978 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk); 979 break; 980 case FRV_OPERAND_FRDOUBLEI : 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_FRDOUBLEJ : 984 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj); 985 break; 986 case FRV_OPERAND_FRDOUBLEK : 987 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk); 988 break; 989 case FRV_OPERAND_FRI : 990 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi); 991 break; 992 case FRV_OPERAND_FRINTI : 993 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi); 994 break; 995 case FRV_OPERAND_FRINTIEVEN : 996 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi); 997 break; 998 case FRV_OPERAND_FRINTJ : 999 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj); 1000 break; 1001 case FRV_OPERAND_FRINTJEVEN : 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_FRINTK : 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_FRINTKEVEN : 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_FRJ : 1011 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj); 1012 break; 1013 case FRV_OPERAND_FRK : 1014 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk); 1015 break; 1016 case FRV_OPERAND_FRKHI : 1017 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk); 1018 break; 1019 case FRV_OPERAND_FRKLO : 1020 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk); 1021 break; 1022 case FRV_OPERAND_GRDOUBLEK : 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_GRI : 1026 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi); 1027 break; 1028 case FRV_OPERAND_GRJ : 1029 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj); 1030 break; 1031 case FRV_OPERAND_GRK : 1032 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk); 1033 break; 1034 case FRV_OPERAND_GRKHI : 1035 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk); 1036 break; 1037 case FRV_OPERAND_GRKLO : 1038 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk); 1039 break; 1040 case FRV_OPERAND_ICCI_1 : 1041 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1); 1042 break; 1043 case FRV_OPERAND_ICCI_2 : 1044 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2); 1045 break; 1046 case FRV_OPERAND_ICCI_3 : 1047 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3); 1048 break; 1049 case FRV_OPERAND_LI : 1050 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI); 1051 break; 1052 case FRV_OPERAND_LRAD : 1053 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD); 1054 break; 1055 case FRV_OPERAND_LRAE : 1056 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE); 1057 break; 1058 case FRV_OPERAND_LRAS : 1059 length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS); 1060 break; 1061 case FRV_OPERAND_TLBPRL : 1062 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL); 1063 break; 1064 case FRV_OPERAND_TLBPROPX : 1065 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx); 1066 break; 1067 case FRV_OPERAND_AE : 1068 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae); 1069 break; 1070 case FRV_OPERAND_CALLANN : 1071 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann); 1072 break; 1073 case FRV_OPERAND_CCOND : 1074 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond); 1075 break; 1076 case FRV_OPERAND_COND : 1077 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond); 1078 break; 1079 case FRV_OPERAND_D12 : 1080 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12); 1081 break; 1082 case FRV_OPERAND_DEBUG : 1083 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug); 1084 break; 1085 case FRV_OPERAND_EIR : 1086 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir); 1087 break; 1088 case FRV_OPERAND_HINT : 1089 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint); 1090 break; 1091 case FRV_OPERAND_HINT_NOT_TAKEN : 1092 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint); 1093 break; 1094 case FRV_OPERAND_HINT_TAKEN : 1095 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint); 1096 break; 1097 case FRV_OPERAND_LABEL16 : 1098 { 1099 long value; 1100 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); 1101 value = ((((value) * (4))) + (pc)); 1102 fields->f_label16 = value; 1103 } 1104 break; 1105 case FRV_OPERAND_LABEL24 : 1106 { 1107 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6); 1108 if (length <= 0) break; 1109 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18); 1110 if (length <= 0) break; 1111 { 1112 FLD (f_label24) = ((((((((FLD (f_labelH6)) * (((1) << (18))))) | (FLD (f_labelL18)))) * (4))) + (pc)); 1113 } 1114 } 1115 break; 1116 case FRV_OPERAND_LDANN : 1117 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann); 1118 break; 1119 case FRV_OPERAND_LDDANN : 1120 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann); 1121 break; 1122 case FRV_OPERAND_LOCK : 1123 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock); 1124 break; 1125 case FRV_OPERAND_PACK : 1126 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack); 1127 break; 1128 case FRV_OPERAND_S10 : 1129 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10); 1130 break; 1131 case FRV_OPERAND_S12 : 1132 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12); 1133 break; 1134 case FRV_OPERAND_S16 : 1135 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16); 1136 break; 1137 case FRV_OPERAND_S5 : 1138 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5); 1139 break; 1140 case FRV_OPERAND_S6 : 1141 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6); 1142 break; 1143 case FRV_OPERAND_S6_1 : 1144 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1); 1145 break; 1146 case FRV_OPERAND_SLO16 : 1147 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16); 1148 break; 1149 case FRV_OPERAND_SPR : 1150 { 1151 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h); 1152 if (length <= 0) break; 1153 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l); 1154 if (length <= 0) break; 1155 { 1156 FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l))); 1157 } 1158 } 1159 break; 1160 case FRV_OPERAND_U12 : 1161 { 1162 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h); 1163 if (length <= 0) break; 1164 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l); 1165 if (length <= 0) break; 1166 { 1167 FLD (f_u12) = ((((FLD (f_u12_h)) * (64))) | (FLD (f_u12_l))); 1168 } 1169 } 1170 break; 1171 case FRV_OPERAND_U16 : 1172 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16); 1173 break; 1174 case FRV_OPERAND_U6 : 1175 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6); 1176 break; 1177 case FRV_OPERAND_UHI16 : 1178 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16); 1179 break; 1180 case FRV_OPERAND_ULO16 : 1181 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16); 1182 break; 1183 1184 default : 1185 /* xgettext:c-format */ 1186 opcodes_error_handler 1187 (_("internal error: unrecognized field %d while decoding insn"), 1188 opindex); 1189 abort (); 1190 } 1191 1192 return length; 1193 } 1194 1195 cgen_insert_fn * const frv_cgen_insert_handlers[] = 1196 { 1197 insert_insn_normal, 1198 }; 1199 1200 cgen_extract_fn * const frv_cgen_extract_handlers[] = 1201 { 1202 extract_insn_normal, 1203 }; 1204 1205 int frv_cgen_get_int_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 1206 bfd_vma frv_cgen_get_vma_operand (CGEN_CPU_DESC, int, const CGEN_FIELDS *); 1207 1208 /* Getting values from cgen_fields is handled by a collection of functions. 1209 They are distinguished by the type of the VALUE argument they return. 1210 TODO: floating point, inlining support, remove cases where result type 1211 not appropriate. */ 1212 1213 int 1214 frv_cgen_get_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1215 int opindex, 1216 const CGEN_FIELDS * fields) 1217 { 1218 int value; 1219 1220 switch (opindex) 1221 { 1222 case FRV_OPERAND_A0 : 1223 value = fields->f_A; 1224 break; 1225 case FRV_OPERAND_A1 : 1226 value = fields->f_A; 1227 break; 1228 case FRV_OPERAND_ACC40SI : 1229 value = fields->f_ACC40Si; 1230 break; 1231 case FRV_OPERAND_ACC40SK : 1232 value = fields->f_ACC40Sk; 1233 break; 1234 case FRV_OPERAND_ACC40UI : 1235 value = fields->f_ACC40Ui; 1236 break; 1237 case FRV_OPERAND_ACC40UK : 1238 value = fields->f_ACC40Uk; 1239 break; 1240 case FRV_OPERAND_ACCGI : 1241 value = fields->f_ACCGi; 1242 break; 1243 case FRV_OPERAND_ACCGK : 1244 value = fields->f_ACCGk; 1245 break; 1246 case FRV_OPERAND_CCI : 1247 value = fields->f_CCi; 1248 break; 1249 case FRV_OPERAND_CPRDOUBLEK : 1250 value = fields->f_CPRk; 1251 break; 1252 case FRV_OPERAND_CPRI : 1253 value = fields->f_CPRi; 1254 break; 1255 case FRV_OPERAND_CPRJ : 1256 value = fields->f_CPRj; 1257 break; 1258 case FRV_OPERAND_CPRK : 1259 value = fields->f_CPRk; 1260 break; 1261 case FRV_OPERAND_CRI : 1262 value = fields->f_CRi; 1263 break; 1264 case FRV_OPERAND_CRJ : 1265 value = fields->f_CRj; 1266 break; 1267 case FRV_OPERAND_CRJ_FLOAT : 1268 value = fields->f_CRj_float; 1269 break; 1270 case FRV_OPERAND_CRJ_INT : 1271 value = fields->f_CRj_int; 1272 break; 1273 case FRV_OPERAND_CRK : 1274 value = fields->f_CRk; 1275 break; 1276 case FRV_OPERAND_FCCI_1 : 1277 value = fields->f_FCCi_1; 1278 break; 1279 case FRV_OPERAND_FCCI_2 : 1280 value = fields->f_FCCi_2; 1281 break; 1282 case FRV_OPERAND_FCCI_3 : 1283 value = fields->f_FCCi_3; 1284 break; 1285 case FRV_OPERAND_FCCK : 1286 value = fields->f_FCCk; 1287 break; 1288 case FRV_OPERAND_FRDOUBLEI : 1289 value = fields->f_FRi; 1290 break; 1291 case FRV_OPERAND_FRDOUBLEJ : 1292 value = fields->f_FRj; 1293 break; 1294 case FRV_OPERAND_FRDOUBLEK : 1295 value = fields->f_FRk; 1296 break; 1297 case FRV_OPERAND_FRI : 1298 value = fields->f_FRi; 1299 break; 1300 case FRV_OPERAND_FRINTI : 1301 value = fields->f_FRi; 1302 break; 1303 case FRV_OPERAND_FRINTIEVEN : 1304 value = fields->f_FRi; 1305 break; 1306 case FRV_OPERAND_FRINTJ : 1307 value = fields->f_FRj; 1308 break; 1309 case FRV_OPERAND_FRINTJEVEN : 1310 value = fields->f_FRj; 1311 break; 1312 case FRV_OPERAND_FRINTK : 1313 value = fields->f_FRk; 1314 break; 1315 case FRV_OPERAND_FRINTKEVEN : 1316 value = fields->f_FRk; 1317 break; 1318 case FRV_OPERAND_FRJ : 1319 value = fields->f_FRj; 1320 break; 1321 case FRV_OPERAND_FRK : 1322 value = fields->f_FRk; 1323 break; 1324 case FRV_OPERAND_FRKHI : 1325 value = fields->f_FRk; 1326 break; 1327 case FRV_OPERAND_FRKLO : 1328 value = fields->f_FRk; 1329 break; 1330 case FRV_OPERAND_GRDOUBLEK : 1331 value = fields->f_GRk; 1332 break; 1333 case FRV_OPERAND_GRI : 1334 value = fields->f_GRi; 1335 break; 1336 case FRV_OPERAND_GRJ : 1337 value = fields->f_GRj; 1338 break; 1339 case FRV_OPERAND_GRK : 1340 value = fields->f_GRk; 1341 break; 1342 case FRV_OPERAND_GRKHI : 1343 value = fields->f_GRk; 1344 break; 1345 case FRV_OPERAND_GRKLO : 1346 value = fields->f_GRk; 1347 break; 1348 case FRV_OPERAND_ICCI_1 : 1349 value = fields->f_ICCi_1; 1350 break; 1351 case FRV_OPERAND_ICCI_2 : 1352 value = fields->f_ICCi_2; 1353 break; 1354 case FRV_OPERAND_ICCI_3 : 1355 value = fields->f_ICCi_3; 1356 break; 1357 case FRV_OPERAND_LI : 1358 value = fields->f_LI; 1359 break; 1360 case FRV_OPERAND_LRAD : 1361 value = fields->f_LRAD; 1362 break; 1363 case FRV_OPERAND_LRAE : 1364 value = fields->f_LRAE; 1365 break; 1366 case FRV_OPERAND_LRAS : 1367 value = fields->f_LRAS; 1368 break; 1369 case FRV_OPERAND_TLBPRL : 1370 value = fields->f_TLBPRL; 1371 break; 1372 case FRV_OPERAND_TLBPROPX : 1373 value = fields->f_TLBPRopx; 1374 break; 1375 case FRV_OPERAND_AE : 1376 value = fields->f_ae; 1377 break; 1378 case FRV_OPERAND_CALLANN : 1379 value = fields->f_reloc_ann; 1380 break; 1381 case FRV_OPERAND_CCOND : 1382 value = fields->f_ccond; 1383 break; 1384 case FRV_OPERAND_COND : 1385 value = fields->f_cond; 1386 break; 1387 case FRV_OPERAND_D12 : 1388 value = fields->f_d12; 1389 break; 1390 case FRV_OPERAND_DEBUG : 1391 value = fields->f_debug; 1392 break; 1393 case FRV_OPERAND_EIR : 1394 value = fields->f_eir; 1395 break; 1396 case FRV_OPERAND_HINT : 1397 value = fields->f_hint; 1398 break; 1399 case FRV_OPERAND_HINT_NOT_TAKEN : 1400 value = fields->f_hint; 1401 break; 1402 case FRV_OPERAND_HINT_TAKEN : 1403 value = fields->f_hint; 1404 break; 1405 case FRV_OPERAND_LABEL16 : 1406 value = fields->f_label16; 1407 break; 1408 case FRV_OPERAND_LABEL24 : 1409 value = fields->f_label24; 1410 break; 1411 case FRV_OPERAND_LDANN : 1412 value = fields->f_reloc_ann; 1413 break; 1414 case FRV_OPERAND_LDDANN : 1415 value = fields->f_reloc_ann; 1416 break; 1417 case FRV_OPERAND_LOCK : 1418 value = fields->f_lock; 1419 break; 1420 case FRV_OPERAND_PACK : 1421 value = fields->f_pack; 1422 break; 1423 case FRV_OPERAND_S10 : 1424 value = fields->f_s10; 1425 break; 1426 case FRV_OPERAND_S12 : 1427 value = fields->f_d12; 1428 break; 1429 case FRV_OPERAND_S16 : 1430 value = fields->f_s16; 1431 break; 1432 case FRV_OPERAND_S5 : 1433 value = fields->f_s5; 1434 break; 1435 case FRV_OPERAND_S6 : 1436 value = fields->f_s6; 1437 break; 1438 case FRV_OPERAND_S6_1 : 1439 value = fields->f_s6_1; 1440 break; 1441 case FRV_OPERAND_SLO16 : 1442 value = fields->f_s16; 1443 break; 1444 case FRV_OPERAND_SPR : 1445 value = fields->f_spr; 1446 break; 1447 case FRV_OPERAND_U12 : 1448 value = fields->f_u12; 1449 break; 1450 case FRV_OPERAND_U16 : 1451 value = fields->f_u16; 1452 break; 1453 case FRV_OPERAND_U6 : 1454 value = fields->f_u6; 1455 break; 1456 case FRV_OPERAND_UHI16 : 1457 value = fields->f_u16; 1458 break; 1459 case FRV_OPERAND_ULO16 : 1460 value = fields->f_u16; 1461 break; 1462 1463 default : 1464 /* xgettext:c-format */ 1465 opcodes_error_handler 1466 (_("internal error: unrecognized field %d while getting int operand"), 1467 opindex); 1468 abort (); 1469 } 1470 1471 return value; 1472 } 1473 1474 bfd_vma 1475 frv_cgen_get_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1476 int opindex, 1477 const CGEN_FIELDS * fields) 1478 { 1479 bfd_vma value; 1480 1481 switch (opindex) 1482 { 1483 case FRV_OPERAND_A0 : 1484 value = fields->f_A; 1485 break; 1486 case FRV_OPERAND_A1 : 1487 value = fields->f_A; 1488 break; 1489 case FRV_OPERAND_ACC40SI : 1490 value = fields->f_ACC40Si; 1491 break; 1492 case FRV_OPERAND_ACC40SK : 1493 value = fields->f_ACC40Sk; 1494 break; 1495 case FRV_OPERAND_ACC40UI : 1496 value = fields->f_ACC40Ui; 1497 break; 1498 case FRV_OPERAND_ACC40UK : 1499 value = fields->f_ACC40Uk; 1500 break; 1501 case FRV_OPERAND_ACCGI : 1502 value = fields->f_ACCGi; 1503 break; 1504 case FRV_OPERAND_ACCGK : 1505 value = fields->f_ACCGk; 1506 break; 1507 case FRV_OPERAND_CCI : 1508 value = fields->f_CCi; 1509 break; 1510 case FRV_OPERAND_CPRDOUBLEK : 1511 value = fields->f_CPRk; 1512 break; 1513 case FRV_OPERAND_CPRI : 1514 value = fields->f_CPRi; 1515 break; 1516 case FRV_OPERAND_CPRJ : 1517 value = fields->f_CPRj; 1518 break; 1519 case FRV_OPERAND_CPRK : 1520 value = fields->f_CPRk; 1521 break; 1522 case FRV_OPERAND_CRI : 1523 value = fields->f_CRi; 1524 break; 1525 case FRV_OPERAND_CRJ : 1526 value = fields->f_CRj; 1527 break; 1528 case FRV_OPERAND_CRJ_FLOAT : 1529 value = fields->f_CRj_float; 1530 break; 1531 case FRV_OPERAND_CRJ_INT : 1532 value = fields->f_CRj_int; 1533 break; 1534 case FRV_OPERAND_CRK : 1535 value = fields->f_CRk; 1536 break; 1537 case FRV_OPERAND_FCCI_1 : 1538 value = fields->f_FCCi_1; 1539 break; 1540 case FRV_OPERAND_FCCI_2 : 1541 value = fields->f_FCCi_2; 1542 break; 1543 case FRV_OPERAND_FCCI_3 : 1544 value = fields->f_FCCi_3; 1545 break; 1546 case FRV_OPERAND_FCCK : 1547 value = fields->f_FCCk; 1548 break; 1549 case FRV_OPERAND_FRDOUBLEI : 1550 value = fields->f_FRi; 1551 break; 1552 case FRV_OPERAND_FRDOUBLEJ : 1553 value = fields->f_FRj; 1554 break; 1555 case FRV_OPERAND_FRDOUBLEK : 1556 value = fields->f_FRk; 1557 break; 1558 case FRV_OPERAND_FRI : 1559 value = fields->f_FRi; 1560 break; 1561 case FRV_OPERAND_FRINTI : 1562 value = fields->f_FRi; 1563 break; 1564 case FRV_OPERAND_FRINTIEVEN : 1565 value = fields->f_FRi; 1566 break; 1567 case FRV_OPERAND_FRINTJ : 1568 value = fields->f_FRj; 1569 break; 1570 case FRV_OPERAND_FRINTJEVEN : 1571 value = fields->f_FRj; 1572 break; 1573 case FRV_OPERAND_FRINTK : 1574 value = fields->f_FRk; 1575 break; 1576 case FRV_OPERAND_FRINTKEVEN : 1577 value = fields->f_FRk; 1578 break; 1579 case FRV_OPERAND_FRJ : 1580 value = fields->f_FRj; 1581 break; 1582 case FRV_OPERAND_FRK : 1583 value = fields->f_FRk; 1584 break; 1585 case FRV_OPERAND_FRKHI : 1586 value = fields->f_FRk; 1587 break; 1588 case FRV_OPERAND_FRKLO : 1589 value = fields->f_FRk; 1590 break; 1591 case FRV_OPERAND_GRDOUBLEK : 1592 value = fields->f_GRk; 1593 break; 1594 case FRV_OPERAND_GRI : 1595 value = fields->f_GRi; 1596 break; 1597 case FRV_OPERAND_GRJ : 1598 value = fields->f_GRj; 1599 break; 1600 case FRV_OPERAND_GRK : 1601 value = fields->f_GRk; 1602 break; 1603 case FRV_OPERAND_GRKHI : 1604 value = fields->f_GRk; 1605 break; 1606 case FRV_OPERAND_GRKLO : 1607 value = fields->f_GRk; 1608 break; 1609 case FRV_OPERAND_ICCI_1 : 1610 value = fields->f_ICCi_1; 1611 break; 1612 case FRV_OPERAND_ICCI_2 : 1613 value = fields->f_ICCi_2; 1614 break; 1615 case FRV_OPERAND_ICCI_3 : 1616 value = fields->f_ICCi_3; 1617 break; 1618 case FRV_OPERAND_LI : 1619 value = fields->f_LI; 1620 break; 1621 case FRV_OPERAND_LRAD : 1622 value = fields->f_LRAD; 1623 break; 1624 case FRV_OPERAND_LRAE : 1625 value = fields->f_LRAE; 1626 break; 1627 case FRV_OPERAND_LRAS : 1628 value = fields->f_LRAS; 1629 break; 1630 case FRV_OPERAND_TLBPRL : 1631 value = fields->f_TLBPRL; 1632 break; 1633 case FRV_OPERAND_TLBPROPX : 1634 value = fields->f_TLBPRopx; 1635 break; 1636 case FRV_OPERAND_AE : 1637 value = fields->f_ae; 1638 break; 1639 case FRV_OPERAND_CALLANN : 1640 value = fields->f_reloc_ann; 1641 break; 1642 case FRV_OPERAND_CCOND : 1643 value = fields->f_ccond; 1644 break; 1645 case FRV_OPERAND_COND : 1646 value = fields->f_cond; 1647 break; 1648 case FRV_OPERAND_D12 : 1649 value = fields->f_d12; 1650 break; 1651 case FRV_OPERAND_DEBUG : 1652 value = fields->f_debug; 1653 break; 1654 case FRV_OPERAND_EIR : 1655 value = fields->f_eir; 1656 break; 1657 case FRV_OPERAND_HINT : 1658 value = fields->f_hint; 1659 break; 1660 case FRV_OPERAND_HINT_NOT_TAKEN : 1661 value = fields->f_hint; 1662 break; 1663 case FRV_OPERAND_HINT_TAKEN : 1664 value = fields->f_hint; 1665 break; 1666 case FRV_OPERAND_LABEL16 : 1667 value = fields->f_label16; 1668 break; 1669 case FRV_OPERAND_LABEL24 : 1670 value = fields->f_label24; 1671 break; 1672 case FRV_OPERAND_LDANN : 1673 value = fields->f_reloc_ann; 1674 break; 1675 case FRV_OPERAND_LDDANN : 1676 value = fields->f_reloc_ann; 1677 break; 1678 case FRV_OPERAND_LOCK : 1679 value = fields->f_lock; 1680 break; 1681 case FRV_OPERAND_PACK : 1682 value = fields->f_pack; 1683 break; 1684 case FRV_OPERAND_S10 : 1685 value = fields->f_s10; 1686 break; 1687 case FRV_OPERAND_S12 : 1688 value = fields->f_d12; 1689 break; 1690 case FRV_OPERAND_S16 : 1691 value = fields->f_s16; 1692 break; 1693 case FRV_OPERAND_S5 : 1694 value = fields->f_s5; 1695 break; 1696 case FRV_OPERAND_S6 : 1697 value = fields->f_s6; 1698 break; 1699 case FRV_OPERAND_S6_1 : 1700 value = fields->f_s6_1; 1701 break; 1702 case FRV_OPERAND_SLO16 : 1703 value = fields->f_s16; 1704 break; 1705 case FRV_OPERAND_SPR : 1706 value = fields->f_spr; 1707 break; 1708 case FRV_OPERAND_U12 : 1709 value = fields->f_u12; 1710 break; 1711 case FRV_OPERAND_U16 : 1712 value = fields->f_u16; 1713 break; 1714 case FRV_OPERAND_U6 : 1715 value = fields->f_u6; 1716 break; 1717 case FRV_OPERAND_UHI16 : 1718 value = fields->f_u16; 1719 break; 1720 case FRV_OPERAND_ULO16 : 1721 value = fields->f_u16; 1722 break; 1723 1724 default : 1725 /* xgettext:c-format */ 1726 opcodes_error_handler 1727 (_("internal error: unrecognized field %d while getting vma operand"), 1728 opindex); 1729 abort (); 1730 } 1731 1732 return value; 1733 } 1734 1735 void frv_cgen_set_int_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, int); 1736 void frv_cgen_set_vma_operand (CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma); 1737 1738 /* Stuffing values in cgen_fields is handled by a collection of functions. 1739 They are distinguished by the type of the VALUE argument they accept. 1740 TODO: floating point, inlining support, remove cases where argument type 1741 not appropriate. */ 1742 1743 void 1744 frv_cgen_set_int_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 1745 int opindex, 1746 CGEN_FIELDS * fields, 1747 int value) 1748 { 1749 switch (opindex) 1750 { 1751 case FRV_OPERAND_A0 : 1752 fields->f_A = value; 1753 break; 1754 case FRV_OPERAND_A1 : 1755 fields->f_A = value; 1756 break; 1757 case FRV_OPERAND_ACC40SI : 1758 fields->f_ACC40Si = value; 1759 break; 1760 case FRV_OPERAND_ACC40SK : 1761 fields->f_ACC40Sk = value; 1762 break; 1763 case FRV_OPERAND_ACC40UI : 1764 fields->f_ACC40Ui = value; 1765 break; 1766 case FRV_OPERAND_ACC40UK : 1767 fields->f_ACC40Uk = value; 1768 break; 1769 case FRV_OPERAND_ACCGI : 1770 fields->f_ACCGi = value; 1771 break; 1772 case FRV_OPERAND_ACCGK : 1773 fields->f_ACCGk = value; 1774 break; 1775 case FRV_OPERAND_CCI : 1776 fields->f_CCi = value; 1777 break; 1778 case FRV_OPERAND_CPRDOUBLEK : 1779 fields->f_CPRk = value; 1780 break; 1781 case FRV_OPERAND_CPRI : 1782 fields->f_CPRi = value; 1783 break; 1784 case FRV_OPERAND_CPRJ : 1785 fields->f_CPRj = value; 1786 break; 1787 case FRV_OPERAND_CPRK : 1788 fields->f_CPRk = value; 1789 break; 1790 case FRV_OPERAND_CRI : 1791 fields->f_CRi = value; 1792 break; 1793 case FRV_OPERAND_CRJ : 1794 fields->f_CRj = value; 1795 break; 1796 case FRV_OPERAND_CRJ_FLOAT : 1797 fields->f_CRj_float = value; 1798 break; 1799 case FRV_OPERAND_CRJ_INT : 1800 fields->f_CRj_int = value; 1801 break; 1802 case FRV_OPERAND_CRK : 1803 fields->f_CRk = value; 1804 break; 1805 case FRV_OPERAND_FCCI_1 : 1806 fields->f_FCCi_1 = value; 1807 break; 1808 case FRV_OPERAND_FCCI_2 : 1809 fields->f_FCCi_2 = value; 1810 break; 1811 case FRV_OPERAND_FCCI_3 : 1812 fields->f_FCCi_3 = value; 1813 break; 1814 case FRV_OPERAND_FCCK : 1815 fields->f_FCCk = value; 1816 break; 1817 case FRV_OPERAND_FRDOUBLEI : 1818 fields->f_FRi = value; 1819 break; 1820 case FRV_OPERAND_FRDOUBLEJ : 1821 fields->f_FRj = value; 1822 break; 1823 case FRV_OPERAND_FRDOUBLEK : 1824 fields->f_FRk = value; 1825 break; 1826 case FRV_OPERAND_FRI : 1827 fields->f_FRi = value; 1828 break; 1829 case FRV_OPERAND_FRINTI : 1830 fields->f_FRi = value; 1831 break; 1832 case FRV_OPERAND_FRINTIEVEN : 1833 fields->f_FRi = value; 1834 break; 1835 case FRV_OPERAND_FRINTJ : 1836 fields->f_FRj = value; 1837 break; 1838 case FRV_OPERAND_FRINTJEVEN : 1839 fields->f_FRj = value; 1840 break; 1841 case FRV_OPERAND_FRINTK : 1842 fields->f_FRk = value; 1843 break; 1844 case FRV_OPERAND_FRINTKEVEN : 1845 fields->f_FRk = value; 1846 break; 1847 case FRV_OPERAND_FRJ : 1848 fields->f_FRj = value; 1849 break; 1850 case FRV_OPERAND_FRK : 1851 fields->f_FRk = value; 1852 break; 1853 case FRV_OPERAND_FRKHI : 1854 fields->f_FRk = value; 1855 break; 1856 case FRV_OPERAND_FRKLO : 1857 fields->f_FRk = value; 1858 break; 1859 case FRV_OPERAND_GRDOUBLEK : 1860 fields->f_GRk = value; 1861 break; 1862 case FRV_OPERAND_GRI : 1863 fields->f_GRi = value; 1864 break; 1865 case FRV_OPERAND_GRJ : 1866 fields->f_GRj = value; 1867 break; 1868 case FRV_OPERAND_GRK : 1869 fields->f_GRk = value; 1870 break; 1871 case FRV_OPERAND_GRKHI : 1872 fields->f_GRk = value; 1873 break; 1874 case FRV_OPERAND_GRKLO : 1875 fields->f_GRk = value; 1876 break; 1877 case FRV_OPERAND_ICCI_1 : 1878 fields->f_ICCi_1 = value; 1879 break; 1880 case FRV_OPERAND_ICCI_2 : 1881 fields->f_ICCi_2 = value; 1882 break; 1883 case FRV_OPERAND_ICCI_3 : 1884 fields->f_ICCi_3 = value; 1885 break; 1886 case FRV_OPERAND_LI : 1887 fields->f_LI = value; 1888 break; 1889 case FRV_OPERAND_LRAD : 1890 fields->f_LRAD = value; 1891 break; 1892 case FRV_OPERAND_LRAE : 1893 fields->f_LRAE = value; 1894 break; 1895 case FRV_OPERAND_LRAS : 1896 fields->f_LRAS = value; 1897 break; 1898 case FRV_OPERAND_TLBPRL : 1899 fields->f_TLBPRL = value; 1900 break; 1901 case FRV_OPERAND_TLBPROPX : 1902 fields->f_TLBPRopx = value; 1903 break; 1904 case FRV_OPERAND_AE : 1905 fields->f_ae = value; 1906 break; 1907 case FRV_OPERAND_CALLANN : 1908 fields->f_reloc_ann = value; 1909 break; 1910 case FRV_OPERAND_CCOND : 1911 fields->f_ccond = value; 1912 break; 1913 case FRV_OPERAND_COND : 1914 fields->f_cond = value; 1915 break; 1916 case FRV_OPERAND_D12 : 1917 fields->f_d12 = value; 1918 break; 1919 case FRV_OPERAND_DEBUG : 1920 fields->f_debug = value; 1921 break; 1922 case FRV_OPERAND_EIR : 1923 fields->f_eir = value; 1924 break; 1925 case FRV_OPERAND_HINT : 1926 fields->f_hint = value; 1927 break; 1928 case FRV_OPERAND_HINT_NOT_TAKEN : 1929 fields->f_hint = value; 1930 break; 1931 case FRV_OPERAND_HINT_TAKEN : 1932 fields->f_hint = value; 1933 break; 1934 case FRV_OPERAND_LABEL16 : 1935 fields->f_label16 = value; 1936 break; 1937 case FRV_OPERAND_LABEL24 : 1938 fields->f_label24 = value; 1939 break; 1940 case FRV_OPERAND_LDANN : 1941 fields->f_reloc_ann = value; 1942 break; 1943 case FRV_OPERAND_LDDANN : 1944 fields->f_reloc_ann = value; 1945 break; 1946 case FRV_OPERAND_LOCK : 1947 fields->f_lock = value; 1948 break; 1949 case FRV_OPERAND_PACK : 1950 fields->f_pack = value; 1951 break; 1952 case FRV_OPERAND_S10 : 1953 fields->f_s10 = value; 1954 break; 1955 case FRV_OPERAND_S12 : 1956 fields->f_d12 = value; 1957 break; 1958 case FRV_OPERAND_S16 : 1959 fields->f_s16 = value; 1960 break; 1961 case FRV_OPERAND_S5 : 1962 fields->f_s5 = value; 1963 break; 1964 case FRV_OPERAND_S6 : 1965 fields->f_s6 = value; 1966 break; 1967 case FRV_OPERAND_S6_1 : 1968 fields->f_s6_1 = value; 1969 break; 1970 case FRV_OPERAND_SLO16 : 1971 fields->f_s16 = value; 1972 break; 1973 case FRV_OPERAND_SPR : 1974 fields->f_spr = value; 1975 break; 1976 case FRV_OPERAND_U12 : 1977 fields->f_u12 = value; 1978 break; 1979 case FRV_OPERAND_U16 : 1980 fields->f_u16 = value; 1981 break; 1982 case FRV_OPERAND_U6 : 1983 fields->f_u6 = value; 1984 break; 1985 case FRV_OPERAND_UHI16 : 1986 fields->f_u16 = value; 1987 break; 1988 case FRV_OPERAND_ULO16 : 1989 fields->f_u16 = value; 1990 break; 1991 1992 default : 1993 /* xgettext:c-format */ 1994 opcodes_error_handler 1995 (_("internal error: unrecognized field %d while setting int operand"), 1996 opindex); 1997 abort (); 1998 } 1999 } 2000 2001 void 2002 frv_cgen_set_vma_operand (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED, 2003 int opindex, 2004 CGEN_FIELDS * fields, 2005 bfd_vma value) 2006 { 2007 switch (opindex) 2008 { 2009 case FRV_OPERAND_A0 : 2010 fields->f_A = value; 2011 break; 2012 case FRV_OPERAND_A1 : 2013 fields->f_A = value; 2014 break; 2015 case FRV_OPERAND_ACC40SI : 2016 fields->f_ACC40Si = value; 2017 break; 2018 case FRV_OPERAND_ACC40SK : 2019 fields->f_ACC40Sk = value; 2020 break; 2021 case FRV_OPERAND_ACC40UI : 2022 fields->f_ACC40Ui = value; 2023 break; 2024 case FRV_OPERAND_ACC40UK : 2025 fields->f_ACC40Uk = value; 2026 break; 2027 case FRV_OPERAND_ACCGI : 2028 fields->f_ACCGi = value; 2029 break; 2030 case FRV_OPERAND_ACCGK : 2031 fields->f_ACCGk = value; 2032 break; 2033 case FRV_OPERAND_CCI : 2034 fields->f_CCi = value; 2035 break; 2036 case FRV_OPERAND_CPRDOUBLEK : 2037 fields->f_CPRk = value; 2038 break; 2039 case FRV_OPERAND_CPRI : 2040 fields->f_CPRi = value; 2041 break; 2042 case FRV_OPERAND_CPRJ : 2043 fields->f_CPRj = value; 2044 break; 2045 case FRV_OPERAND_CPRK : 2046 fields->f_CPRk = value; 2047 break; 2048 case FRV_OPERAND_CRI : 2049 fields->f_CRi = value; 2050 break; 2051 case FRV_OPERAND_CRJ : 2052 fields->f_CRj = value; 2053 break; 2054 case FRV_OPERAND_CRJ_FLOAT : 2055 fields->f_CRj_float = value; 2056 break; 2057 case FRV_OPERAND_CRJ_INT : 2058 fields->f_CRj_int = value; 2059 break; 2060 case FRV_OPERAND_CRK : 2061 fields->f_CRk = value; 2062 break; 2063 case FRV_OPERAND_FCCI_1 : 2064 fields->f_FCCi_1 = value; 2065 break; 2066 case FRV_OPERAND_FCCI_2 : 2067 fields->f_FCCi_2 = value; 2068 break; 2069 case FRV_OPERAND_FCCI_3 : 2070 fields->f_FCCi_3 = value; 2071 break; 2072 case FRV_OPERAND_FCCK : 2073 fields->f_FCCk = value; 2074 break; 2075 case FRV_OPERAND_FRDOUBLEI : 2076 fields->f_FRi = value; 2077 break; 2078 case FRV_OPERAND_FRDOUBLEJ : 2079 fields->f_FRj = value; 2080 break; 2081 case FRV_OPERAND_FRDOUBLEK : 2082 fields->f_FRk = value; 2083 break; 2084 case FRV_OPERAND_FRI : 2085 fields->f_FRi = value; 2086 break; 2087 case FRV_OPERAND_FRINTI : 2088 fields->f_FRi = value; 2089 break; 2090 case FRV_OPERAND_FRINTIEVEN : 2091 fields->f_FRi = value; 2092 break; 2093 case FRV_OPERAND_FRINTJ : 2094 fields->f_FRj = value; 2095 break; 2096 case FRV_OPERAND_FRINTJEVEN : 2097 fields->f_FRj = value; 2098 break; 2099 case FRV_OPERAND_FRINTK : 2100 fields->f_FRk = value; 2101 break; 2102 case FRV_OPERAND_FRINTKEVEN : 2103 fields->f_FRk = value; 2104 break; 2105 case FRV_OPERAND_FRJ : 2106 fields->f_FRj = value; 2107 break; 2108 case FRV_OPERAND_FRK : 2109 fields->f_FRk = value; 2110 break; 2111 case FRV_OPERAND_FRKHI : 2112 fields->f_FRk = value; 2113 break; 2114 case FRV_OPERAND_FRKLO : 2115 fields->f_FRk = value; 2116 break; 2117 case FRV_OPERAND_GRDOUBLEK : 2118 fields->f_GRk = value; 2119 break; 2120 case FRV_OPERAND_GRI : 2121 fields->f_GRi = value; 2122 break; 2123 case FRV_OPERAND_GRJ : 2124 fields->f_GRj = value; 2125 break; 2126 case FRV_OPERAND_GRK : 2127 fields->f_GRk = value; 2128 break; 2129 case FRV_OPERAND_GRKHI : 2130 fields->f_GRk = value; 2131 break; 2132 case FRV_OPERAND_GRKLO : 2133 fields->f_GRk = value; 2134 break; 2135 case FRV_OPERAND_ICCI_1 : 2136 fields->f_ICCi_1 = value; 2137 break; 2138 case FRV_OPERAND_ICCI_2 : 2139 fields->f_ICCi_2 = value; 2140 break; 2141 case FRV_OPERAND_ICCI_3 : 2142 fields->f_ICCi_3 = value; 2143 break; 2144 case FRV_OPERAND_LI : 2145 fields->f_LI = value; 2146 break; 2147 case FRV_OPERAND_LRAD : 2148 fields->f_LRAD = value; 2149 break; 2150 case FRV_OPERAND_LRAE : 2151 fields->f_LRAE = value; 2152 break; 2153 case FRV_OPERAND_LRAS : 2154 fields->f_LRAS = value; 2155 break; 2156 case FRV_OPERAND_TLBPRL : 2157 fields->f_TLBPRL = value; 2158 break; 2159 case FRV_OPERAND_TLBPROPX : 2160 fields->f_TLBPRopx = value; 2161 break; 2162 case FRV_OPERAND_AE : 2163 fields->f_ae = value; 2164 break; 2165 case FRV_OPERAND_CALLANN : 2166 fields->f_reloc_ann = value; 2167 break; 2168 case FRV_OPERAND_CCOND : 2169 fields->f_ccond = value; 2170 break; 2171 case FRV_OPERAND_COND : 2172 fields->f_cond = value; 2173 break; 2174 case FRV_OPERAND_D12 : 2175 fields->f_d12 = value; 2176 break; 2177 case FRV_OPERAND_DEBUG : 2178 fields->f_debug = value; 2179 break; 2180 case FRV_OPERAND_EIR : 2181 fields->f_eir = value; 2182 break; 2183 case FRV_OPERAND_HINT : 2184 fields->f_hint = value; 2185 break; 2186 case FRV_OPERAND_HINT_NOT_TAKEN : 2187 fields->f_hint = value; 2188 break; 2189 case FRV_OPERAND_HINT_TAKEN : 2190 fields->f_hint = value; 2191 break; 2192 case FRV_OPERAND_LABEL16 : 2193 fields->f_label16 = value; 2194 break; 2195 case FRV_OPERAND_LABEL24 : 2196 fields->f_label24 = value; 2197 break; 2198 case FRV_OPERAND_LDANN : 2199 fields->f_reloc_ann = value; 2200 break; 2201 case FRV_OPERAND_LDDANN : 2202 fields->f_reloc_ann = value; 2203 break; 2204 case FRV_OPERAND_LOCK : 2205 fields->f_lock = value; 2206 break; 2207 case FRV_OPERAND_PACK : 2208 fields->f_pack = value; 2209 break; 2210 case FRV_OPERAND_S10 : 2211 fields->f_s10 = value; 2212 break; 2213 case FRV_OPERAND_S12 : 2214 fields->f_d12 = value; 2215 break; 2216 case FRV_OPERAND_S16 : 2217 fields->f_s16 = value; 2218 break; 2219 case FRV_OPERAND_S5 : 2220 fields->f_s5 = value; 2221 break; 2222 case FRV_OPERAND_S6 : 2223 fields->f_s6 = value; 2224 break; 2225 case FRV_OPERAND_S6_1 : 2226 fields->f_s6_1 = value; 2227 break; 2228 case FRV_OPERAND_SLO16 : 2229 fields->f_s16 = value; 2230 break; 2231 case FRV_OPERAND_SPR : 2232 fields->f_spr = value; 2233 break; 2234 case FRV_OPERAND_U12 : 2235 fields->f_u12 = value; 2236 break; 2237 case FRV_OPERAND_U16 : 2238 fields->f_u16 = value; 2239 break; 2240 case FRV_OPERAND_U6 : 2241 fields->f_u6 = value; 2242 break; 2243 case FRV_OPERAND_UHI16 : 2244 fields->f_u16 = value; 2245 break; 2246 case FRV_OPERAND_ULO16 : 2247 fields->f_u16 = value; 2248 break; 2249 2250 default : 2251 /* xgettext:c-format */ 2252 opcodes_error_handler 2253 (_("internal error: unrecognized field %d while setting vma operand"), 2254 opindex); 2255 abort (); 2256 } 2257 } 2258 2259 /* Function to call before using the instruction builder tables. */ 2260 2261 void 2262 frv_cgen_init_ibld_table (CGEN_CPU_DESC cd) 2263 { 2264 cd->insert_handlers = & frv_cgen_insert_handlers[0]; 2265 cd->extract_handlers = & frv_cgen_extract_handlers[0]; 2266 2267 cd->insert_operand = frv_cgen_insert_operand; 2268 cd->extract_operand = frv_cgen_extract_operand; 2269 2270 cd->get_int_operand = frv_cgen_get_int_operand; 2271 cd->set_int_operand = frv_cgen_set_int_operand; 2272 cd->get_vma_operand = frv_cgen_get_vma_operand; 2273 cd->set_vma_operand = frv_cgen_set_vma_operand; 2274 } 2275