00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #include "sysdep.h"
00034 #include <stdio.h>
00035 #include "ansidecl.h"
00036 #include "dis-asm.h"
00037 #include "bfd.h"
00038 #include "symcat.h"
00039 #include "frv-desc.h"
00040 #include "frv-opc.h"
00041 #include "opintl.h"
00042 #include "safe-ctype.h"
00043
00044 #undef min
00045 #define min(a,b) ((a) < (b) ? (a) : (b))
00046 #undef max
00047 #define max(a,b) ((a) > (b) ? (a) : (b))
00048
00049
00050 #define FLD(f) (fields->f)
00051
00052 static const char * insert_normal
00053 (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
00054 unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
00055 static const char * insert_insn_normal
00056 (CGEN_CPU_DESC, const CGEN_INSN *,
00057 CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
00058 static int extract_normal
00059 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00060 unsigned int, unsigned int, unsigned int, unsigned int,
00061 unsigned int, unsigned int, bfd_vma, long *);
00062 static int extract_insn_normal
00063 (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
00064 CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
00065 #if CGEN_INT_INSN_P
00066 static void put_insn_int_value
00067 (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
00068 #endif
00069 #if ! CGEN_INT_INSN_P
00070 static CGEN_INLINE void insert_1
00071 (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
00072 static CGEN_INLINE int fill_cache
00073 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma);
00074 static CGEN_INLINE long extract_1
00075 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
00076 #endif
00077
00078
00079
00080 #if ! CGEN_INT_INSN_P
00081
00082
00083
00084 static CGEN_INLINE void
00085 insert_1 (CGEN_CPU_DESC cd,
00086 unsigned long value,
00087 int start,
00088 int length,
00089 int word_length,
00090 unsigned char *bufp)
00091 {
00092 unsigned long x,mask;
00093 int shift;
00094
00095 x = cgen_get_insn_value (cd, bufp, word_length);
00096
00097
00098 mask = (((1L << (length - 1)) - 1) << 1) | 1;
00099 if (CGEN_INSN_LSB0_P)
00100 shift = (start + 1) - length;
00101 else
00102 shift = (word_length - (start + length));
00103 x = (x & ~(mask << shift)) | ((value & mask) << shift);
00104
00105 cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
00106 }
00107
00108 #endif
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126 static const char *
00127 insert_normal (CGEN_CPU_DESC cd,
00128 long value,
00129 unsigned int attrs,
00130 unsigned int word_offset,
00131 unsigned int start,
00132 unsigned int length,
00133 unsigned int word_length,
00134 unsigned int total_length,
00135 CGEN_INSN_BYTES_PTR buffer)
00136 {
00137 static char errbuf[100];
00138
00139 unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
00140
00141
00142 if (length == 0)
00143 return NULL;
00144
00145 #if 0
00146 if (CGEN_INT_INSN_P
00147 && word_offset != 0)
00148 abort ();
00149 #endif
00150
00151 if (word_length > 32)
00152 abort ();
00153
00154
00155
00156 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
00157 {
00158 if (word_offset == 0
00159 && word_length > total_length)
00160 word_length = total_length;
00161 }
00162
00163
00164 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
00165 {
00166 long minval = - (1L << (length - 1));
00167 unsigned long maxval = mask;
00168
00169 if ((value > 0 && (unsigned long) value > maxval)
00170 || value < minval)
00171 {
00172
00173 sprintf (errbuf,
00174 _("operand out of range (%ld not between %ld and %lu)"),
00175 value, minval, maxval);
00176 return errbuf;
00177 }
00178 }
00179 else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
00180 {
00181 unsigned long maxval = mask;
00182
00183 if ((unsigned long) value > maxval)
00184 {
00185
00186 sprintf (errbuf,
00187 _("operand out of range (%lu not between 0 and %lu)"),
00188 value, maxval);
00189 return errbuf;
00190 }
00191 }
00192 else
00193 {
00194 if (! cgen_signed_overflow_ok_p (cd))
00195 {
00196 long minval = - (1L << (length - 1));
00197 long maxval = (1L << (length - 1)) - 1;
00198
00199 if (value < minval || value > maxval)
00200 {
00201 sprintf
00202
00203 (errbuf, _("operand out of range (%ld not between %ld and %ld)"),
00204 value, minval, maxval);
00205 return errbuf;
00206 }
00207 }
00208 }
00209
00210 #if CGEN_INT_INSN_P
00211
00212 {
00213 int shift;
00214
00215 if (CGEN_INSN_LSB0_P)
00216 shift = (word_offset + start + 1) - length;
00217 else
00218 shift = total_length - (word_offset + start + length);
00219 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
00220 }
00221
00222 #else
00223
00224 {
00225 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
00226
00227 insert_1 (cd, value, start, length, word_length, bufp);
00228 }
00229
00230 #endif
00231
00232 return NULL;
00233 }
00234
00235
00236
00237
00238
00239
00240
00241
00242 static const char *
00243 insert_insn_normal (CGEN_CPU_DESC cd,
00244 const CGEN_INSN * insn,
00245 CGEN_FIELDS * fields,
00246 CGEN_INSN_BYTES_PTR buffer,
00247 bfd_vma pc)
00248 {
00249 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
00250 unsigned long value;
00251 const CGEN_SYNTAX_CHAR_TYPE * syn;
00252
00253 CGEN_INIT_INSERT (cd);
00254 value = CGEN_INSN_BASE_VALUE (insn);
00255
00256
00257
00258
00259 #if CGEN_INT_INSN_P
00260
00261 put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
00262 CGEN_FIELDS_BITSIZE (fields), value);
00263
00264 #else
00265
00266 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
00267 (unsigned) CGEN_FIELDS_BITSIZE (fields)),
00268 value);
00269
00270 #endif
00271
00272
00273
00274
00275
00276
00277 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
00278 {
00279 const char *errmsg;
00280
00281 if (CGEN_SYNTAX_CHAR_P (* syn))
00282 continue;
00283
00284 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
00285 fields, buffer, pc);
00286 if (errmsg)
00287 return errmsg;
00288 }
00289
00290 return NULL;
00291 }
00292
00293 #if CGEN_INT_INSN_P
00294
00295
00296
00297 static void
00298 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
00299 CGEN_INSN_BYTES_PTR buf,
00300 int length,
00301 int insn_length,
00302 CGEN_INSN_INT value)
00303 {
00304
00305
00306 if (length > insn_length)
00307 *buf = value;
00308 else
00309 {
00310 int shift = insn_length - length;
00311
00312 CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
00313 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
00314 }
00315 }
00316 #endif
00317
00318
00319
00320 #if ! CGEN_INT_INSN_P
00321
00322
00323
00324
00325
00326
00327
00328 static CGEN_INLINE int
00329 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
00330 CGEN_EXTRACT_INFO *ex_info,
00331 int offset,
00332 int bytes,
00333 bfd_vma pc)
00334 {
00335
00336
00337 unsigned int mask;
00338 disassemble_info *info = (disassemble_info *) ex_info->dis_info;
00339
00340
00341 mask = (1 << bytes) - 1;
00342 if (((ex_info->valid >> offset) & mask) == mask)
00343 return 1;
00344
00345
00346 for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
00347 if (! (mask & ex_info->valid))
00348 break;
00349
00350 if (bytes)
00351 {
00352 int status;
00353
00354 pc += offset;
00355 status = (*info->read_memory_func)
00356 (pc, ex_info->insn_bytes + offset, bytes, info);
00357
00358 if (status != 0)
00359 {
00360 (*info->memory_error_func) (status, pc, info);
00361 return 0;
00362 }
00363
00364 ex_info->valid |= ((1 << bytes) - 1) << offset;
00365 }
00366
00367 return 1;
00368 }
00369
00370
00371
00372 static CGEN_INLINE long
00373 extract_1 (CGEN_CPU_DESC cd,
00374 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
00375 int start,
00376 int length,
00377 int word_length,
00378 unsigned char *bufp,
00379 bfd_vma pc ATTRIBUTE_UNUSED)
00380 {
00381 unsigned long x;
00382 int shift;
00383 #if 0
00384 int big_p = CGEN_CPU_INSN_ENDIAN (cd) == CGEN_ENDIAN_BIG;
00385 #endif
00386 x = cgen_get_insn_value (cd, bufp, word_length);
00387
00388 if (CGEN_INSN_LSB0_P)
00389 shift = (start + 1) - length;
00390 else
00391 shift = (word_length - (start + length));
00392 return x >> shift;
00393 }
00394
00395 #endif
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417 static int
00418 extract_normal (CGEN_CPU_DESC cd,
00419 #if ! CGEN_INT_INSN_P
00420 CGEN_EXTRACT_INFO *ex_info,
00421 #else
00422 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
00423 #endif
00424 CGEN_INSN_INT insn_value,
00425 unsigned int attrs,
00426 unsigned int word_offset,
00427 unsigned int start,
00428 unsigned int length,
00429 unsigned int word_length,
00430 unsigned int total_length,
00431 #if ! CGEN_INT_INSN_P
00432 bfd_vma pc,
00433 #else
00434 bfd_vma pc ATTRIBUTE_UNUSED,
00435 #endif
00436 long *valuep)
00437 {
00438 long value, mask;
00439
00440
00441
00442 if (length == 0)
00443 {
00444 *valuep = 0;
00445 return 1;
00446 }
00447
00448 #if 0
00449 if (CGEN_INT_INSN_P
00450 && word_offset != 0)
00451 abort ();
00452 #endif
00453
00454 if (word_length > 32)
00455 abort ();
00456
00457
00458
00459 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
00460 {
00461 if (word_offset == 0
00462 && word_length > total_length)
00463 word_length = total_length;
00464 }
00465
00466
00467
00468 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
00469 {
00470 if (CGEN_INSN_LSB0_P)
00471 value = insn_value >> ((word_offset + start + 1) - length);
00472 else
00473 value = insn_value >> (total_length - ( word_offset + start + length));
00474 }
00475
00476 #if ! CGEN_INT_INSN_P
00477
00478 else
00479 {
00480 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
00481
00482 if (word_length > 32)
00483 abort ();
00484
00485 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
00486 return 0;
00487
00488 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
00489 }
00490
00491 #endif
00492
00493
00494 mask = (((1L << (length - 1)) - 1) << 1) | 1;
00495
00496 value &= mask;
00497
00498 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
00499 && (value & (1L << (length - 1))))
00500 value |= ~mask;
00501
00502 *valuep = value;
00503
00504 return 1;
00505 }
00506
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516 static int
00517 extract_insn_normal (CGEN_CPU_DESC cd,
00518 const CGEN_INSN *insn,
00519 CGEN_EXTRACT_INFO *ex_info,
00520 CGEN_INSN_INT insn_value,
00521 CGEN_FIELDS *fields,
00522 bfd_vma pc)
00523 {
00524 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
00525 const CGEN_SYNTAX_CHAR_TYPE *syn;
00526
00527 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
00528
00529 CGEN_INIT_EXTRACT (cd);
00530
00531 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
00532 {
00533 int length;
00534
00535 if (CGEN_SYNTAX_CHAR_P (*syn))
00536 continue;
00537
00538 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
00539 ex_info, insn_value, fields, pc);
00540 if (length <= 0)
00541 return length;
00542 }
00543
00544
00545 return CGEN_INSN_BITSIZE (insn);
00546 }
00547
00548
00549
00550 const char * frv_cgen_insert_operand
00551 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma));
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561
00562
00563
00564
00565
00566
00567 const char *
00568 frv_cgen_insert_operand (cd, opindex, fields, buffer, pc)
00569 CGEN_CPU_DESC cd;
00570 int opindex;
00571 CGEN_FIELDS * fields;
00572 CGEN_INSN_BYTES_PTR buffer;
00573 bfd_vma pc ATTRIBUTE_UNUSED;
00574 {
00575 const char * errmsg = NULL;
00576 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00577
00578 switch (opindex)
00579 {
00580 case FRV_OPERAND_A0 :
00581 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
00582 break;
00583 case FRV_OPERAND_A1 :
00584 errmsg = insert_normal (cd, fields->f_A, 0, 0, 17, 1, 32, total_length, buffer);
00585 break;
00586 case FRV_OPERAND_ACC40SI :
00587 errmsg = insert_normal (cd, fields->f_ACC40Si, 0, 0, 17, 6, 32, total_length, buffer);
00588 break;
00589 case FRV_OPERAND_ACC40SK :
00590 errmsg = insert_normal (cd, fields->f_ACC40Sk, 0, 0, 30, 6, 32, total_length, buffer);
00591 break;
00592 case FRV_OPERAND_ACC40UI :
00593 errmsg = insert_normal (cd, fields->f_ACC40Ui, 0, 0, 17, 6, 32, total_length, buffer);
00594 break;
00595 case FRV_OPERAND_ACC40UK :
00596 errmsg = insert_normal (cd, fields->f_ACC40Uk, 0, 0, 30, 6, 32, total_length, buffer);
00597 break;
00598 case FRV_OPERAND_ACCGI :
00599 errmsg = insert_normal (cd, fields->f_ACCGi, 0, 0, 17, 6, 32, total_length, buffer);
00600 break;
00601 case FRV_OPERAND_ACCGK :
00602 errmsg = insert_normal (cd, fields->f_ACCGk, 0, 0, 30, 6, 32, total_length, buffer);
00603 break;
00604 case FRV_OPERAND_CCI :
00605 errmsg = insert_normal (cd, fields->f_CCi, 0, 0, 11, 3, 32, total_length, buffer);
00606 break;
00607 case FRV_OPERAND_CPRDOUBLEK :
00608 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
00609 break;
00610 case FRV_OPERAND_CPRI :
00611 errmsg = insert_normal (cd, fields->f_CPRi, 0, 0, 17, 6, 32, total_length, buffer);
00612 break;
00613 case FRV_OPERAND_CPRJ :
00614 errmsg = insert_normal (cd, fields->f_CPRj, 0, 0, 5, 6, 32, total_length, buffer);
00615 break;
00616 case FRV_OPERAND_CPRK :
00617 errmsg = insert_normal (cd, fields->f_CPRk, 0, 0, 30, 6, 32, total_length, buffer);
00618 break;
00619 case FRV_OPERAND_CRI :
00620 errmsg = insert_normal (cd, fields->f_CRi, 0, 0, 14, 3, 32, total_length, buffer);
00621 break;
00622 case FRV_OPERAND_CRJ :
00623 errmsg = insert_normal (cd, fields->f_CRj, 0, 0, 2, 3, 32, total_length, buffer);
00624 break;
00625 case FRV_OPERAND_CRJ_FLOAT :
00626 errmsg = insert_normal (cd, fields->f_CRj_float, 0, 0, 26, 2, 32, total_length, buffer);
00627 break;
00628 case FRV_OPERAND_CRJ_INT :
00629 {
00630 long value = fields->f_CRj_int;
00631 value = ((value) - (4));
00632 errmsg = insert_normal (cd, value, 0, 0, 26, 2, 32, total_length, buffer);
00633 }
00634 break;
00635 case FRV_OPERAND_CRK :
00636 errmsg = insert_normal (cd, fields->f_CRk, 0, 0, 27, 3, 32, total_length, buffer);
00637 break;
00638 case FRV_OPERAND_FCCI_1 :
00639 errmsg = insert_normal (cd, fields->f_FCCi_1, 0, 0, 11, 2, 32, total_length, buffer);
00640 break;
00641 case FRV_OPERAND_FCCI_2 :
00642 errmsg = insert_normal (cd, fields->f_FCCi_2, 0, 0, 26, 2, 32, total_length, buffer);
00643 break;
00644 case FRV_OPERAND_FCCI_3 :
00645 errmsg = insert_normal (cd, fields->f_FCCi_3, 0, 0, 1, 2, 32, total_length, buffer);
00646 break;
00647 case FRV_OPERAND_FCCK :
00648 errmsg = insert_normal (cd, fields->f_FCCk, 0, 0, 26, 2, 32, total_length, buffer);
00649 break;
00650 case FRV_OPERAND_FRDOUBLEI :
00651 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
00652 break;
00653 case FRV_OPERAND_FRDOUBLEJ :
00654 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
00655 break;
00656 case FRV_OPERAND_FRDOUBLEK :
00657 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00658 break;
00659 case FRV_OPERAND_FRI :
00660 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
00661 break;
00662 case FRV_OPERAND_FRINTI :
00663 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
00664 break;
00665 case FRV_OPERAND_FRINTIEVEN :
00666 errmsg = insert_normal (cd, fields->f_FRi, 0, 0, 17, 6, 32, total_length, buffer);
00667 break;
00668 case FRV_OPERAND_FRINTJ :
00669 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
00670 break;
00671 case FRV_OPERAND_FRINTJEVEN :
00672 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
00673 break;
00674 case FRV_OPERAND_FRINTK :
00675 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00676 break;
00677 case FRV_OPERAND_FRINTKEVEN :
00678 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00679 break;
00680 case FRV_OPERAND_FRJ :
00681 errmsg = insert_normal (cd, fields->f_FRj, 0, 0, 5, 6, 32, total_length, buffer);
00682 break;
00683 case FRV_OPERAND_FRK :
00684 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00685 break;
00686 case FRV_OPERAND_FRKHI :
00687 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00688 break;
00689 case FRV_OPERAND_FRKLO :
00690 errmsg = insert_normal (cd, fields->f_FRk, 0, 0, 30, 6, 32, total_length, buffer);
00691 break;
00692 case FRV_OPERAND_GRDOUBLEK :
00693 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
00694 break;
00695 case FRV_OPERAND_GRI :
00696 errmsg = insert_normal (cd, fields->f_GRi, 0, 0, 17, 6, 32, total_length, buffer);
00697 break;
00698 case FRV_OPERAND_GRJ :
00699 errmsg = insert_normal (cd, fields->f_GRj, 0, 0, 5, 6, 32, total_length, buffer);
00700 break;
00701 case FRV_OPERAND_GRK :
00702 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
00703 break;
00704 case FRV_OPERAND_GRKHI :
00705 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
00706 break;
00707 case FRV_OPERAND_GRKLO :
00708 errmsg = insert_normal (cd, fields->f_GRk, 0, 0, 30, 6, 32, total_length, buffer);
00709 break;
00710 case FRV_OPERAND_ICCI_1 :
00711 errmsg = insert_normal (cd, fields->f_ICCi_1, 0, 0, 11, 2, 32, total_length, buffer);
00712 break;
00713 case FRV_OPERAND_ICCI_2 :
00714 errmsg = insert_normal (cd, fields->f_ICCi_2, 0, 0, 26, 2, 32, total_length, buffer);
00715 break;
00716 case FRV_OPERAND_ICCI_3 :
00717 errmsg = insert_normal (cd, fields->f_ICCi_3, 0, 0, 1, 2, 32, total_length, buffer);
00718 break;
00719 case FRV_OPERAND_LI :
00720 errmsg = insert_normal (cd, fields->f_LI, 0, 0, 25, 1, 32, total_length, buffer);
00721 break;
00722 case FRV_OPERAND_LRAD :
00723 errmsg = insert_normal (cd, fields->f_LRAD, 0, 0, 4, 1, 32, total_length, buffer);
00724 break;
00725 case FRV_OPERAND_LRAE :
00726 errmsg = insert_normal (cd, fields->f_LRAE, 0, 0, 5, 1, 32, total_length, buffer);
00727 break;
00728 case FRV_OPERAND_LRAS :
00729 errmsg = insert_normal (cd, fields->f_LRAS, 0, 0, 3, 1, 32, total_length, buffer);
00730 break;
00731 case FRV_OPERAND_TLBPRL :
00732 errmsg = insert_normal (cd, fields->f_TLBPRL, 0, 0, 25, 1, 32, total_length, buffer);
00733 break;
00734 case FRV_OPERAND_TLBPROPX :
00735 errmsg = insert_normal (cd, fields->f_TLBPRopx, 0, 0, 28, 3, 32, total_length, buffer);
00736 break;
00737 case FRV_OPERAND_AE :
00738 errmsg = insert_normal (cd, fields->f_ae, 0, 0, 25, 1, 32, total_length, buffer);
00739 break;
00740 case FRV_OPERAND_CALLANN :
00741 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
00742 break;
00743 case FRV_OPERAND_CCOND :
00744 errmsg = insert_normal (cd, fields->f_ccond, 0, 0, 12, 1, 32, total_length, buffer);
00745 break;
00746 case FRV_OPERAND_COND :
00747 errmsg = insert_normal (cd, fields->f_cond, 0, 0, 8, 1, 32, total_length, buffer);
00748 break;
00749 case FRV_OPERAND_D12 :
00750 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
00751 break;
00752 case FRV_OPERAND_DEBUG :
00753 errmsg = insert_normal (cd, fields->f_debug, 0, 0, 25, 1, 32, total_length, buffer);
00754 break;
00755 case FRV_OPERAND_EIR :
00756 errmsg = insert_normal (cd, fields->f_eir, 0, 0, 17, 6, 32, total_length, buffer);
00757 break;
00758 case FRV_OPERAND_HINT :
00759 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
00760 break;
00761 case FRV_OPERAND_HINT_NOT_TAKEN :
00762 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
00763 break;
00764 case FRV_OPERAND_HINT_TAKEN :
00765 errmsg = insert_normal (cd, fields->f_hint, 0, 0, 17, 2, 32, total_length, buffer);
00766 break;
00767 case FRV_OPERAND_LABEL16 :
00768 {
00769 long value = fields->f_label16;
00770 value = ((int) (((value) - (pc))) >> (2));
00771 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 15, 16, 32, total_length, buffer);
00772 }
00773 break;
00774 case FRV_OPERAND_LABEL24 :
00775 {
00776 {
00777 FLD (f_labelH6) = ((int) (((FLD (f_label24)) - (pc))) >> (20));
00778 FLD (f_labelL18) = ((((unsigned int) (((FLD (f_label24)) - (pc))) >> (2))) & (262143));
00779 }
00780 errmsg = insert_normal (cd, fields->f_labelH6, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, buffer);
00781 if (errmsg)
00782 break;
00783 errmsg = insert_normal (cd, fields->f_labelL18, 0, 0, 17, 18, 32, total_length, buffer);
00784 if (errmsg)
00785 break;
00786 }
00787 break;
00788 case FRV_OPERAND_LDANN :
00789 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
00790 break;
00791 case FRV_OPERAND_LDDANN :
00792 errmsg = insert_normal (cd, fields->f_reloc_ann, 0, 0, 0, 0, 32, total_length, buffer);
00793 break;
00794 case FRV_OPERAND_LOCK :
00795 errmsg = insert_normal (cd, fields->f_lock, 0, 0, 25, 1, 32, total_length, buffer);
00796 break;
00797 case FRV_OPERAND_PACK :
00798 errmsg = insert_normal (cd, fields->f_pack, 0, 0, 31, 1, 32, total_length, buffer);
00799 break;
00800 case FRV_OPERAND_S10 :
00801 errmsg = insert_normal (cd, fields->f_s10, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, buffer);
00802 break;
00803 case FRV_OPERAND_S12 :
00804 errmsg = insert_normal (cd, fields->f_d12, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, buffer);
00805 break;
00806 case FRV_OPERAND_S16 :
00807 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
00808 break;
00809 case FRV_OPERAND_S5 :
00810 errmsg = insert_normal (cd, fields->f_s5, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, buffer);
00811 break;
00812 case FRV_OPERAND_S6 :
00813 errmsg = insert_normal (cd, fields->f_s6, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, buffer);
00814 break;
00815 case FRV_OPERAND_S6_1 :
00816 errmsg = insert_normal (cd, fields->f_s6_1, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, buffer);
00817 break;
00818 case FRV_OPERAND_SLO16 :
00819 errmsg = insert_normal (cd, fields->f_s16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
00820 break;
00821 case FRV_OPERAND_SPR :
00822 {
00823 {
00824 FLD (f_spr_h) = ((unsigned int) (FLD (f_spr)) >> (6));
00825 FLD (f_spr_l) = ((FLD (f_spr)) & (63));
00826 }
00827 errmsg = insert_normal (cd, fields->f_spr_h, 0, 0, 30, 6, 32, total_length, buffer);
00828 if (errmsg)
00829 break;
00830 errmsg = insert_normal (cd, fields->f_spr_l, 0, 0, 17, 6, 32, total_length, buffer);
00831 if (errmsg)
00832 break;
00833 }
00834 break;
00835 case FRV_OPERAND_U12 :
00836 {
00837 {
00838 FLD (f_u12_h) = ((int) (FLD (f_u12)) >> (6));
00839 FLD (f_u12_l) = ((FLD (f_u12)) & (63));
00840 }
00841 errmsg = insert_normal (cd, fields->f_u12_h, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, buffer);
00842 if (errmsg)
00843 break;
00844 errmsg = insert_normal (cd, fields->f_u12_l, 0, 0, 5, 6, 32, total_length, buffer);
00845 if (errmsg)
00846 break;
00847 }
00848 break;
00849 case FRV_OPERAND_U16 :
00850 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
00851 break;
00852 case FRV_OPERAND_U6 :
00853 errmsg = insert_normal (cd, fields->f_u6, 0, 0, 5, 6, 32, total_length, buffer);
00854 break;
00855 case FRV_OPERAND_UHI16 :
00856 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
00857 break;
00858 case FRV_OPERAND_ULO16 :
00859 errmsg = insert_normal (cd, fields->f_u16, 0, 0, 15, 16, 32, total_length, buffer);
00860 break;
00861
00862 default :
00863
00864 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
00865 opindex);
00866 abort ();
00867 }
00868
00869 return errmsg;
00870 }
00871
00872 int frv_cgen_extract_operand
00873 PARAMS ((CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00874 CGEN_FIELDS *, bfd_vma));
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891 int
00892 frv_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
00893 CGEN_CPU_DESC cd;
00894 int opindex;
00895 CGEN_EXTRACT_INFO *ex_info;
00896 CGEN_INSN_INT insn_value;
00897 CGEN_FIELDS * fields;
00898 bfd_vma pc;
00899 {
00900
00901 int length = 1;
00902 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00903
00904 switch (opindex)
00905 {
00906 case FRV_OPERAND_A0 :
00907 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
00908 break;
00909 case FRV_OPERAND_A1 :
00910 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 1, 32, total_length, pc, & fields->f_A);
00911 break;
00912 case FRV_OPERAND_ACC40SI :
00913 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Si);
00914 break;
00915 case FRV_OPERAND_ACC40SK :
00916 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Sk);
00917 break;
00918 case FRV_OPERAND_ACC40UI :
00919 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACC40Ui);
00920 break;
00921 case FRV_OPERAND_ACC40UK :
00922 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACC40Uk);
00923 break;
00924 case FRV_OPERAND_ACCGI :
00925 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_ACCGi);
00926 break;
00927 case FRV_OPERAND_ACCGK :
00928 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_ACCGk);
00929 break;
00930 case FRV_OPERAND_CCI :
00931 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 32, total_length, pc, & fields->f_CCi);
00932 break;
00933 case FRV_OPERAND_CPRDOUBLEK :
00934 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
00935 break;
00936 case FRV_OPERAND_CPRI :
00937 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_CPRi);
00938 break;
00939 case FRV_OPERAND_CPRJ :
00940 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_CPRj);
00941 break;
00942 case FRV_OPERAND_CPRK :
00943 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_CPRk);
00944 break;
00945 case FRV_OPERAND_CRI :
00946 length = extract_normal (cd, ex_info, insn_value, 0, 0, 14, 3, 32, total_length, pc, & fields->f_CRi);
00947 break;
00948 case FRV_OPERAND_CRJ :
00949 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 32, total_length, pc, & fields->f_CRj);
00950 break;
00951 case FRV_OPERAND_CRJ_FLOAT :
00952 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_CRj_float);
00953 break;
00954 case FRV_OPERAND_CRJ_INT :
00955 {
00956 long value;
00957 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & value);
00958 value = ((value) + (4));
00959 fields->f_CRj_int = value;
00960 }
00961 break;
00962 case FRV_OPERAND_CRK :
00963 length = extract_normal (cd, ex_info, insn_value, 0, 0, 27, 3, 32, total_length, pc, & fields->f_CRk);
00964 break;
00965 case FRV_OPERAND_FCCI_1 :
00966 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_FCCi_1);
00967 break;
00968 case FRV_OPERAND_FCCI_2 :
00969 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCi_2);
00970 break;
00971 case FRV_OPERAND_FCCI_3 :
00972 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_FCCi_3);
00973 break;
00974 case FRV_OPERAND_FCCK :
00975 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_FCCk);
00976 break;
00977 case FRV_OPERAND_FRDOUBLEI :
00978 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
00979 break;
00980 case FRV_OPERAND_FRDOUBLEJ :
00981 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
00982 break;
00983 case FRV_OPERAND_FRDOUBLEK :
00984 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
00985 break;
00986 case FRV_OPERAND_FRI :
00987 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
00988 break;
00989 case FRV_OPERAND_FRINTI :
00990 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
00991 break;
00992 case FRV_OPERAND_FRINTIEVEN :
00993 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_FRi);
00994 break;
00995 case FRV_OPERAND_FRINTJ :
00996 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
00997 break;
00998 case FRV_OPERAND_FRINTJEVEN :
00999 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
01000 break;
01001 case FRV_OPERAND_FRINTK :
01002 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
01003 break;
01004 case FRV_OPERAND_FRINTKEVEN :
01005 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
01006 break;
01007 case FRV_OPERAND_FRJ :
01008 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_FRj);
01009 break;
01010 case FRV_OPERAND_FRK :
01011 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
01012 break;
01013 case FRV_OPERAND_FRKHI :
01014 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
01015 break;
01016 case FRV_OPERAND_FRKLO :
01017 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_FRk);
01018 break;
01019 case FRV_OPERAND_GRDOUBLEK :
01020 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
01021 break;
01022 case FRV_OPERAND_GRI :
01023 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_GRi);
01024 break;
01025 case FRV_OPERAND_GRJ :
01026 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_GRj);
01027 break;
01028 case FRV_OPERAND_GRK :
01029 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
01030 break;
01031 case FRV_OPERAND_GRKHI :
01032 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
01033 break;
01034 case FRV_OPERAND_GRKLO :
01035 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_GRk);
01036 break;
01037 case FRV_OPERAND_ICCI_1 :
01038 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 2, 32, total_length, pc, & fields->f_ICCi_1);
01039 break;
01040 case FRV_OPERAND_ICCI_2 :
01041 length = extract_normal (cd, ex_info, insn_value, 0, 0, 26, 2, 32, total_length, pc, & fields->f_ICCi_2);
01042 break;
01043 case FRV_OPERAND_ICCI_3 :
01044 length = extract_normal (cd, ex_info, insn_value, 0, 0, 1, 2, 32, total_length, pc, & fields->f_ICCi_3);
01045 break;
01046 case FRV_OPERAND_LI :
01047 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_LI);
01048 break;
01049 case FRV_OPERAND_LRAD :
01050 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 1, 32, total_length, pc, & fields->f_LRAD);
01051 break;
01052 case FRV_OPERAND_LRAE :
01053 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 1, 32, total_length, pc, & fields->f_LRAE);
01054 break;
01055 case FRV_OPERAND_LRAS :
01056 length = extract_normal (cd, ex_info, insn_value, 0, 0, 3, 1, 32, total_length, pc, & fields->f_LRAS);
01057 break;
01058 case FRV_OPERAND_TLBPRL :
01059 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_TLBPRL);
01060 break;
01061 case FRV_OPERAND_TLBPROPX :
01062 length = extract_normal (cd, ex_info, insn_value, 0, 0, 28, 3, 32, total_length, pc, & fields->f_TLBPRopx);
01063 break;
01064 case FRV_OPERAND_AE :
01065 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_ae);
01066 break;
01067 case FRV_OPERAND_CALLANN :
01068 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
01069 break;
01070 case FRV_OPERAND_CCOND :
01071 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 1, 32, total_length, pc, & fields->f_ccond);
01072 break;
01073 case FRV_OPERAND_COND :
01074 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_cond);
01075 break;
01076 case FRV_OPERAND_D12 :
01077 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
01078 break;
01079 case FRV_OPERAND_DEBUG :
01080 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_debug);
01081 break;
01082 case FRV_OPERAND_EIR :
01083 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_eir);
01084 break;
01085 case FRV_OPERAND_HINT :
01086 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
01087 break;
01088 case FRV_OPERAND_HINT_NOT_TAKEN :
01089 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
01090 break;
01091 case FRV_OPERAND_HINT_TAKEN :
01092 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 2, 32, total_length, pc, & fields->f_hint);
01093 break;
01094 case FRV_OPERAND_LABEL16 :
01095 {
01096 long value;
01097 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);
01098 value = ((((value) << (2))) + (pc));
01099 fields->f_label16 = value;
01100 }
01101 break;
01102 case FRV_OPERAND_LABEL24 :
01103 {
01104 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 30, 6, 32, total_length, pc, & fields->f_labelH6);
01105 if (length <= 0) break;
01106 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 18, 32, total_length, pc, & fields->f_labelL18);
01107 if (length <= 0) break;
01108 {
01109 FLD (f_label24) = ((((((((FLD (f_labelH6)) << (18))) | (FLD (f_labelL18)))) << (2))) + (pc));
01110 }
01111 }
01112 break;
01113 case FRV_OPERAND_LDANN :
01114 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
01115 break;
01116 case FRV_OPERAND_LDDANN :
01117 length = extract_normal (cd, ex_info, insn_value, 0, 0, 0, 0, 32, total_length, pc, & fields->f_reloc_ann);
01118 break;
01119 case FRV_OPERAND_LOCK :
01120 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 1, 32, total_length, pc, & fields->f_lock);
01121 break;
01122 case FRV_OPERAND_PACK :
01123 length = extract_normal (cd, ex_info, insn_value, 0, 0, 31, 1, 32, total_length, pc, & fields->f_pack);
01124 break;
01125 case FRV_OPERAND_S10 :
01126 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 9, 10, 32, total_length, pc, & fields->f_s10);
01127 break;
01128 case FRV_OPERAND_S12 :
01129 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 12, 32, total_length, pc, & fields->f_d12);
01130 break;
01131 case FRV_OPERAND_S16 :
01132 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
01133 break;
01134 case FRV_OPERAND_S5 :
01135 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 5, 32, total_length, pc, & fields->f_s5);
01136 break;
01137 case FRV_OPERAND_S6 :
01138 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 5, 6, 32, total_length, pc, & fields->f_s6);
01139 break;
01140 case FRV_OPERAND_S6_1 :
01141 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 11, 6, 32, total_length, pc, & fields->f_s6_1);
01142 break;
01143 case FRV_OPERAND_SLO16 :
01144 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_s16);
01145 break;
01146 case FRV_OPERAND_SPR :
01147 {
01148 length = extract_normal (cd, ex_info, insn_value, 0, 0, 30, 6, 32, total_length, pc, & fields->f_spr_h);
01149 if (length <= 0) break;
01150 length = extract_normal (cd, ex_info, insn_value, 0, 0, 17, 6, 32, total_length, pc, & fields->f_spr_l);
01151 if (length <= 0) break;
01152 {
01153 FLD (f_spr) = ((((FLD (f_spr_h)) << (6))) | (FLD (f_spr_l)));
01154 }
01155 }
01156 break;
01157 case FRV_OPERAND_U12 :
01158 {
01159 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 17, 6, 32, total_length, pc, & fields->f_u12_h);
01160 if (length <= 0) break;
01161 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u12_l);
01162 if (length <= 0) break;
01163 {
01164 FLD (f_u12) = ((((FLD (f_u12_h)) << (6))) | (FLD (f_u12_l)));
01165 }
01166 }
01167 break;
01168 case FRV_OPERAND_U16 :
01169 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
01170 break;
01171 case FRV_OPERAND_U6 :
01172 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 6, 32, total_length, pc, & fields->f_u6);
01173 break;
01174 case FRV_OPERAND_UHI16 :
01175 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
01176 break;
01177 case FRV_OPERAND_ULO16 :
01178 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_u16);
01179 break;
01180
01181 default :
01182
01183 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
01184 opindex);
01185 abort ();
01186 }
01187
01188 return length;
01189 }
01190
01191 cgen_insert_fn * const frv_cgen_insert_handlers[] =
01192 {
01193 insert_insn_normal,
01194 };
01195
01196 cgen_extract_fn * const frv_cgen_extract_handlers[] =
01197 {
01198 extract_insn_normal,
01199 };
01200
01201 int frv_cgen_get_int_operand
01202 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
01203 bfd_vma frv_cgen_get_vma_operand
01204 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
01205
01206
01207
01208
01209
01210
01211 int
01212 frv_cgen_get_int_operand (cd, opindex, fields)
01213 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01214 int opindex;
01215 const CGEN_FIELDS * fields;
01216 {
01217 int value;
01218
01219 switch (opindex)
01220 {
01221 case FRV_OPERAND_A0 :
01222 value = fields->f_A;
01223 break;
01224 case FRV_OPERAND_A1 :
01225 value = fields->f_A;
01226 break;
01227 case FRV_OPERAND_ACC40SI :
01228 value = fields->f_ACC40Si;
01229 break;
01230 case FRV_OPERAND_ACC40SK :
01231 value = fields->f_ACC40Sk;
01232 break;
01233 case FRV_OPERAND_ACC40UI :
01234 value = fields->f_ACC40Ui;
01235 break;
01236 case FRV_OPERAND_ACC40UK :
01237 value = fields->f_ACC40Uk;
01238 break;
01239 case FRV_OPERAND_ACCGI :
01240 value = fields->f_ACCGi;
01241 break;
01242 case FRV_OPERAND_ACCGK :
01243 value = fields->f_ACCGk;
01244 break;
01245 case FRV_OPERAND_CCI :
01246 value = fields->f_CCi;
01247 break;
01248 case FRV_OPERAND_CPRDOUBLEK :
01249 value = fields->f_CPRk;
01250 break;
01251 case FRV_OPERAND_CPRI :
01252 value = fields->f_CPRi;
01253 break;
01254 case FRV_OPERAND_CPRJ :
01255 value = fields->f_CPRj;
01256 break;
01257 case FRV_OPERAND_CPRK :
01258 value = fields->f_CPRk;
01259 break;
01260 case FRV_OPERAND_CRI :
01261 value = fields->f_CRi;
01262 break;
01263 case FRV_OPERAND_CRJ :
01264 value = fields->f_CRj;
01265 break;
01266 case FRV_OPERAND_CRJ_FLOAT :
01267 value = fields->f_CRj_float;
01268 break;
01269 case FRV_OPERAND_CRJ_INT :
01270 value = fields->f_CRj_int;
01271 break;
01272 case FRV_OPERAND_CRK :
01273 value = fields->f_CRk;
01274 break;
01275 case FRV_OPERAND_FCCI_1 :
01276 value = fields->f_FCCi_1;
01277 break;
01278 case FRV_OPERAND_FCCI_2 :
01279 value = fields->f_FCCi_2;
01280 break;
01281 case FRV_OPERAND_FCCI_3 :
01282 value = fields->f_FCCi_3;
01283 break;
01284 case FRV_OPERAND_FCCK :
01285 value = fields->f_FCCk;
01286 break;
01287 case FRV_OPERAND_FRDOUBLEI :
01288 value = fields->f_FRi;
01289 break;
01290 case FRV_OPERAND_FRDOUBLEJ :
01291 value = fields->f_FRj;
01292 break;
01293 case FRV_OPERAND_FRDOUBLEK :
01294 value = fields->f_FRk;
01295 break;
01296 case FRV_OPERAND_FRI :
01297 value = fields->f_FRi;
01298 break;
01299 case FRV_OPERAND_FRINTI :
01300 value = fields->f_FRi;
01301 break;
01302 case FRV_OPERAND_FRINTIEVEN :
01303 value = fields->f_FRi;
01304 break;
01305 case FRV_OPERAND_FRINTJ :
01306 value = fields->f_FRj;
01307 break;
01308 case FRV_OPERAND_FRINTJEVEN :
01309 value = fields->f_FRj;
01310 break;
01311 case FRV_OPERAND_FRINTK :
01312 value = fields->f_FRk;
01313 break;
01314 case FRV_OPERAND_FRINTKEVEN :
01315 value = fields->f_FRk;
01316 break;
01317 case FRV_OPERAND_FRJ :
01318 value = fields->f_FRj;
01319 break;
01320 case FRV_OPERAND_FRK :
01321 value = fields->f_FRk;
01322 break;
01323 case FRV_OPERAND_FRKHI :
01324 value = fields->f_FRk;
01325 break;
01326 case FRV_OPERAND_FRKLO :
01327 value = fields->f_FRk;
01328 break;
01329 case FRV_OPERAND_GRDOUBLEK :
01330 value = fields->f_GRk;
01331 break;
01332 case FRV_OPERAND_GRI :
01333 value = fields->f_GRi;
01334 break;
01335 case FRV_OPERAND_GRJ :
01336 value = fields->f_GRj;
01337 break;
01338 case FRV_OPERAND_GRK :
01339 value = fields->f_GRk;
01340 break;
01341 case FRV_OPERAND_GRKHI :
01342 value = fields->f_GRk;
01343 break;
01344 case FRV_OPERAND_GRKLO :
01345 value = fields->f_GRk;
01346 break;
01347 case FRV_OPERAND_ICCI_1 :
01348 value = fields->f_ICCi_1;
01349 break;
01350 case FRV_OPERAND_ICCI_2 :
01351 value = fields->f_ICCi_2;
01352 break;
01353 case FRV_OPERAND_ICCI_3 :
01354 value = fields->f_ICCi_3;
01355 break;
01356 case FRV_OPERAND_LI :
01357 value = fields->f_LI;
01358 break;
01359 case FRV_OPERAND_LRAD :
01360 value = fields->f_LRAD;
01361 break;
01362 case FRV_OPERAND_LRAE :
01363 value = fields->f_LRAE;
01364 break;
01365 case FRV_OPERAND_LRAS :
01366 value = fields->f_LRAS;
01367 break;
01368 case FRV_OPERAND_TLBPRL :
01369 value = fields->f_TLBPRL;
01370 break;
01371 case FRV_OPERAND_TLBPROPX :
01372 value = fields->f_TLBPRopx;
01373 break;
01374 case FRV_OPERAND_AE :
01375 value = fields->f_ae;
01376 break;
01377 case FRV_OPERAND_CALLANN :
01378 value = fields->f_reloc_ann;
01379 break;
01380 case FRV_OPERAND_CCOND :
01381 value = fields->f_ccond;
01382 break;
01383 case FRV_OPERAND_COND :
01384 value = fields->f_cond;
01385 break;
01386 case FRV_OPERAND_D12 :
01387 value = fields->f_d12;
01388 break;
01389 case FRV_OPERAND_DEBUG :
01390 value = fields->f_debug;
01391 break;
01392 case FRV_OPERAND_EIR :
01393 value = fields->f_eir;
01394 break;
01395 case FRV_OPERAND_HINT :
01396 value = fields->f_hint;
01397 break;
01398 case FRV_OPERAND_HINT_NOT_TAKEN :
01399 value = fields->f_hint;
01400 break;
01401 case FRV_OPERAND_HINT_TAKEN :
01402 value = fields->f_hint;
01403 break;
01404 case FRV_OPERAND_LABEL16 :
01405 value = fields->f_label16;
01406 break;
01407 case FRV_OPERAND_LABEL24 :
01408 value = fields->f_label24;
01409 break;
01410 case FRV_OPERAND_LDANN :
01411 value = fields->f_reloc_ann;
01412 break;
01413 case FRV_OPERAND_LDDANN :
01414 value = fields->f_reloc_ann;
01415 break;
01416 case FRV_OPERAND_LOCK :
01417 value = fields->f_lock;
01418 break;
01419 case FRV_OPERAND_PACK :
01420 value = fields->f_pack;
01421 break;
01422 case FRV_OPERAND_S10 :
01423 value = fields->f_s10;
01424 break;
01425 case FRV_OPERAND_S12 :
01426 value = fields->f_d12;
01427 break;
01428 case FRV_OPERAND_S16 :
01429 value = fields->f_s16;
01430 break;
01431 case FRV_OPERAND_S5 :
01432 value = fields->f_s5;
01433 break;
01434 case FRV_OPERAND_S6 :
01435 value = fields->f_s6;
01436 break;
01437 case FRV_OPERAND_S6_1 :
01438 value = fields->f_s6_1;
01439 break;
01440 case FRV_OPERAND_SLO16 :
01441 value = fields->f_s16;
01442 break;
01443 case FRV_OPERAND_SPR :
01444 value = fields->f_spr;
01445 break;
01446 case FRV_OPERAND_U12 :
01447 value = fields->f_u12;
01448 break;
01449 case FRV_OPERAND_U16 :
01450 value = fields->f_u16;
01451 break;
01452 case FRV_OPERAND_U6 :
01453 value = fields->f_u6;
01454 break;
01455 case FRV_OPERAND_UHI16 :
01456 value = fields->f_u16;
01457 break;
01458 case FRV_OPERAND_ULO16 :
01459 value = fields->f_u16;
01460 break;
01461
01462 default :
01463
01464 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
01465 opindex);
01466 abort ();
01467 }
01468
01469 return value;
01470 }
01471
01472 bfd_vma
01473 frv_cgen_get_vma_operand (cd, opindex, fields)
01474 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01475 int opindex;
01476 const CGEN_FIELDS * fields;
01477 {
01478 bfd_vma value;
01479
01480 switch (opindex)
01481 {
01482 case FRV_OPERAND_A0 :
01483 value = fields->f_A;
01484 break;
01485 case FRV_OPERAND_A1 :
01486 value = fields->f_A;
01487 break;
01488 case FRV_OPERAND_ACC40SI :
01489 value = fields->f_ACC40Si;
01490 break;
01491 case FRV_OPERAND_ACC40SK :
01492 value = fields->f_ACC40Sk;
01493 break;
01494 case FRV_OPERAND_ACC40UI :
01495 value = fields->f_ACC40Ui;
01496 break;
01497 case FRV_OPERAND_ACC40UK :
01498 value = fields->f_ACC40Uk;
01499 break;
01500 case FRV_OPERAND_ACCGI :
01501 value = fields->f_ACCGi;
01502 break;
01503 case FRV_OPERAND_ACCGK :
01504 value = fields->f_ACCGk;
01505 break;
01506 case FRV_OPERAND_CCI :
01507 value = fields->f_CCi;
01508 break;
01509 case FRV_OPERAND_CPRDOUBLEK :
01510 value = fields->f_CPRk;
01511 break;
01512 case FRV_OPERAND_CPRI :
01513 value = fields->f_CPRi;
01514 break;
01515 case FRV_OPERAND_CPRJ :
01516 value = fields->f_CPRj;
01517 break;
01518 case FRV_OPERAND_CPRK :
01519 value = fields->f_CPRk;
01520 break;
01521 case FRV_OPERAND_CRI :
01522 value = fields->f_CRi;
01523 break;
01524 case FRV_OPERAND_CRJ :
01525 value = fields->f_CRj;
01526 break;
01527 case FRV_OPERAND_CRJ_FLOAT :
01528 value = fields->f_CRj_float;
01529 break;
01530 case FRV_OPERAND_CRJ_INT :
01531 value = fields->f_CRj_int;
01532 break;
01533 case FRV_OPERAND_CRK :
01534 value = fields->f_CRk;
01535 break;
01536 case FRV_OPERAND_FCCI_1 :
01537 value = fields->f_FCCi_1;
01538 break;
01539 case FRV_OPERAND_FCCI_2 :
01540 value = fields->f_FCCi_2;
01541 break;
01542 case FRV_OPERAND_FCCI_3 :
01543 value = fields->f_FCCi_3;
01544 break;
01545 case FRV_OPERAND_FCCK :
01546 value = fields->f_FCCk;
01547 break;
01548 case FRV_OPERAND_FRDOUBLEI :
01549 value = fields->f_FRi;
01550 break;
01551 case FRV_OPERAND_FRDOUBLEJ :
01552 value = fields->f_FRj;
01553 break;
01554 case FRV_OPERAND_FRDOUBLEK :
01555 value = fields->f_FRk;
01556 break;
01557 case FRV_OPERAND_FRI :
01558 value = fields->f_FRi;
01559 break;
01560 case FRV_OPERAND_FRINTI :
01561 value = fields->f_FRi;
01562 break;
01563 case FRV_OPERAND_FRINTIEVEN :
01564 value = fields->f_FRi;
01565 break;
01566 case FRV_OPERAND_FRINTJ :
01567 value = fields->f_FRj;
01568 break;
01569 case FRV_OPERAND_FRINTJEVEN :
01570 value = fields->f_FRj;
01571 break;
01572 case FRV_OPERAND_FRINTK :
01573 value = fields->f_FRk;
01574 break;
01575 case FRV_OPERAND_FRINTKEVEN :
01576 value = fields->f_FRk;
01577 break;
01578 case FRV_OPERAND_FRJ :
01579 value = fields->f_FRj;
01580 break;
01581 case FRV_OPERAND_FRK :
01582 value = fields->f_FRk;
01583 break;
01584 case FRV_OPERAND_FRKHI :
01585 value = fields->f_FRk;
01586 break;
01587 case FRV_OPERAND_FRKLO :
01588 value = fields->f_FRk;
01589 break;
01590 case FRV_OPERAND_GRDOUBLEK :
01591 value = fields->f_GRk;
01592 break;
01593 case FRV_OPERAND_GRI :
01594 value = fields->f_GRi;
01595 break;
01596 case FRV_OPERAND_GRJ :
01597 value = fields->f_GRj;
01598 break;
01599 case FRV_OPERAND_GRK :
01600 value = fields->f_GRk;
01601 break;
01602 case FRV_OPERAND_GRKHI :
01603 value = fields->f_GRk;
01604 break;
01605 case FRV_OPERAND_GRKLO :
01606 value = fields->f_GRk;
01607 break;
01608 case FRV_OPERAND_ICCI_1 :
01609 value = fields->f_ICCi_1;
01610 break;
01611 case FRV_OPERAND_ICCI_2 :
01612 value = fields->f_ICCi_2;
01613 break;
01614 case FRV_OPERAND_ICCI_3 :
01615 value = fields->f_ICCi_3;
01616 break;
01617 case FRV_OPERAND_LI :
01618 value = fields->f_LI;
01619 break;
01620 case FRV_OPERAND_LRAD :
01621 value = fields->f_LRAD;
01622 break;
01623 case FRV_OPERAND_LRAE :
01624 value = fields->f_LRAE;
01625 break;
01626 case FRV_OPERAND_LRAS :
01627 value = fields->f_LRAS;
01628 break;
01629 case FRV_OPERAND_TLBPRL :
01630 value = fields->f_TLBPRL;
01631 break;
01632 case FRV_OPERAND_TLBPROPX :
01633 value = fields->f_TLBPRopx;
01634 break;
01635 case FRV_OPERAND_AE :
01636 value = fields->f_ae;
01637 break;
01638 case FRV_OPERAND_CALLANN :
01639 value = fields->f_reloc_ann;
01640 break;
01641 case FRV_OPERAND_CCOND :
01642 value = fields->f_ccond;
01643 break;
01644 case FRV_OPERAND_COND :
01645 value = fields->f_cond;
01646 break;
01647 case FRV_OPERAND_D12 :
01648 value = fields->f_d12;
01649 break;
01650 case FRV_OPERAND_DEBUG :
01651 value = fields->f_debug;
01652 break;
01653 case FRV_OPERAND_EIR :
01654 value = fields->f_eir;
01655 break;
01656 case FRV_OPERAND_HINT :
01657 value = fields->f_hint;
01658 break;
01659 case FRV_OPERAND_HINT_NOT_TAKEN :
01660 value = fields->f_hint;
01661 break;
01662 case FRV_OPERAND_HINT_TAKEN :
01663 value = fields->f_hint;
01664 break;
01665 case FRV_OPERAND_LABEL16 :
01666 value = fields->f_label16;
01667 break;
01668 case FRV_OPERAND_LABEL24 :
01669 value = fields->f_label24;
01670 break;
01671 case FRV_OPERAND_LDANN :
01672 value = fields->f_reloc_ann;
01673 break;
01674 case FRV_OPERAND_LDDANN :
01675 value = fields->f_reloc_ann;
01676 break;
01677 case FRV_OPERAND_LOCK :
01678 value = fields->f_lock;
01679 break;
01680 case FRV_OPERAND_PACK :
01681 value = fields->f_pack;
01682 break;
01683 case FRV_OPERAND_S10 :
01684 value = fields->f_s10;
01685 break;
01686 case FRV_OPERAND_S12 :
01687 value = fields->f_d12;
01688 break;
01689 case FRV_OPERAND_S16 :
01690 value = fields->f_s16;
01691 break;
01692 case FRV_OPERAND_S5 :
01693 value = fields->f_s5;
01694 break;
01695 case FRV_OPERAND_S6 :
01696 value = fields->f_s6;
01697 break;
01698 case FRV_OPERAND_S6_1 :
01699 value = fields->f_s6_1;
01700 break;
01701 case FRV_OPERAND_SLO16 :
01702 value = fields->f_s16;
01703 break;
01704 case FRV_OPERAND_SPR :
01705 value = fields->f_spr;
01706 break;
01707 case FRV_OPERAND_U12 :
01708 value = fields->f_u12;
01709 break;
01710 case FRV_OPERAND_U16 :
01711 value = fields->f_u16;
01712 break;
01713 case FRV_OPERAND_U6 :
01714 value = fields->f_u6;
01715 break;
01716 case FRV_OPERAND_UHI16 :
01717 value = fields->f_u16;
01718 break;
01719 case FRV_OPERAND_ULO16 :
01720 value = fields->f_u16;
01721 break;
01722
01723 default :
01724
01725 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
01726 opindex);
01727 abort ();
01728 }
01729
01730 return value;
01731 }
01732
01733 void frv_cgen_set_int_operand
01734 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, int));
01735 void frv_cgen_set_vma_operand
01736 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma));
01737
01738
01739
01740
01741
01742
01743 void
01744 frv_cgen_set_int_operand (cd, opindex, fields, value)
01745 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01746 int opindex;
01747 CGEN_FIELDS * fields;
01748 int value;
01749 {
01750 switch (opindex)
01751 {
01752 case FRV_OPERAND_A0 :
01753 fields->f_A = value;
01754 break;
01755 case FRV_OPERAND_A1 :
01756 fields->f_A = value;
01757 break;
01758 case FRV_OPERAND_ACC40SI :
01759 fields->f_ACC40Si = value;
01760 break;
01761 case FRV_OPERAND_ACC40SK :
01762 fields->f_ACC40Sk = value;
01763 break;
01764 case FRV_OPERAND_ACC40UI :
01765 fields->f_ACC40Ui = value;
01766 break;
01767 case FRV_OPERAND_ACC40UK :
01768 fields->f_ACC40Uk = value;
01769 break;
01770 case FRV_OPERAND_ACCGI :
01771 fields->f_ACCGi = value;
01772 break;
01773 case FRV_OPERAND_ACCGK :
01774 fields->f_ACCGk = value;
01775 break;
01776 case FRV_OPERAND_CCI :
01777 fields->f_CCi = value;
01778 break;
01779 case FRV_OPERAND_CPRDOUBLEK :
01780 fields->f_CPRk = value;
01781 break;
01782 case FRV_OPERAND_CPRI :
01783 fields->f_CPRi = value;
01784 break;
01785 case FRV_OPERAND_CPRJ :
01786 fields->f_CPRj = value;
01787 break;
01788 case FRV_OPERAND_CPRK :
01789 fields->f_CPRk = value;
01790 break;
01791 case FRV_OPERAND_CRI :
01792 fields->f_CRi = value;
01793 break;
01794 case FRV_OPERAND_CRJ :
01795 fields->f_CRj = value;
01796 break;
01797 case FRV_OPERAND_CRJ_FLOAT :
01798 fields->f_CRj_float = value;
01799 break;
01800 case FRV_OPERAND_CRJ_INT :
01801 fields->f_CRj_int = value;
01802 break;
01803 case FRV_OPERAND_CRK :
01804 fields->f_CRk = value;
01805 break;
01806 case FRV_OPERAND_FCCI_1 :
01807 fields->f_FCCi_1 = value;
01808 break;
01809 case FRV_OPERAND_FCCI_2 :
01810 fields->f_FCCi_2 = value;
01811 break;
01812 case FRV_OPERAND_FCCI_3 :
01813 fields->f_FCCi_3 = value;
01814 break;
01815 case FRV_OPERAND_FCCK :
01816 fields->f_FCCk = value;
01817 break;
01818 case FRV_OPERAND_FRDOUBLEI :
01819 fields->f_FRi = value;
01820 break;
01821 case FRV_OPERAND_FRDOUBLEJ :
01822 fields->f_FRj = value;
01823 break;
01824 case FRV_OPERAND_FRDOUBLEK :
01825 fields->f_FRk = value;
01826 break;
01827 case FRV_OPERAND_FRI :
01828 fields->f_FRi = value;
01829 break;
01830 case FRV_OPERAND_FRINTI :
01831 fields->f_FRi = value;
01832 break;
01833 case FRV_OPERAND_FRINTIEVEN :
01834 fields->f_FRi = value;
01835 break;
01836 case FRV_OPERAND_FRINTJ :
01837 fields->f_FRj = value;
01838 break;
01839 case FRV_OPERAND_FRINTJEVEN :
01840 fields->f_FRj = value;
01841 break;
01842 case FRV_OPERAND_FRINTK :
01843 fields->f_FRk = value;
01844 break;
01845 case FRV_OPERAND_FRINTKEVEN :
01846 fields->f_FRk = value;
01847 break;
01848 case FRV_OPERAND_FRJ :
01849 fields->f_FRj = value;
01850 break;
01851 case FRV_OPERAND_FRK :
01852 fields->f_FRk = value;
01853 break;
01854 case FRV_OPERAND_FRKHI :
01855 fields->f_FRk = value;
01856 break;
01857 case FRV_OPERAND_FRKLO :
01858 fields->f_FRk = value;
01859 break;
01860 case FRV_OPERAND_GRDOUBLEK :
01861 fields->f_GRk = value;
01862 break;
01863 case FRV_OPERAND_GRI :
01864 fields->f_GRi = value;
01865 break;
01866 case FRV_OPERAND_GRJ :
01867 fields->f_GRj = value;
01868 break;
01869 case FRV_OPERAND_GRK :
01870 fields->f_GRk = value;
01871 break;
01872 case FRV_OPERAND_GRKHI :
01873 fields->f_GRk = value;
01874 break;
01875 case FRV_OPERAND_GRKLO :
01876 fields->f_GRk = value;
01877 break;
01878 case FRV_OPERAND_ICCI_1 :
01879 fields->f_ICCi_1 = value;
01880 break;
01881 case FRV_OPERAND_ICCI_2 :
01882 fields->f_ICCi_2 = value;
01883 break;
01884 case FRV_OPERAND_ICCI_3 :
01885 fields->f_ICCi_3 = value;
01886 break;
01887 case FRV_OPERAND_LI :
01888 fields->f_LI = value;
01889 break;
01890 case FRV_OPERAND_LRAD :
01891 fields->f_LRAD = value;
01892 break;
01893 case FRV_OPERAND_LRAE :
01894 fields->f_LRAE = value;
01895 break;
01896 case FRV_OPERAND_LRAS :
01897 fields->f_LRAS = value;
01898 break;
01899 case FRV_OPERAND_TLBPRL :
01900 fields->f_TLBPRL = value;
01901 break;
01902 case FRV_OPERAND_TLBPROPX :
01903 fields->f_TLBPRopx = value;
01904 break;
01905 case FRV_OPERAND_AE :
01906 fields->f_ae = value;
01907 break;
01908 case FRV_OPERAND_CALLANN :
01909 fields->f_reloc_ann = value;
01910 break;
01911 case FRV_OPERAND_CCOND :
01912 fields->f_ccond = value;
01913 break;
01914 case FRV_OPERAND_COND :
01915 fields->f_cond = value;
01916 break;
01917 case FRV_OPERAND_D12 :
01918 fields->f_d12 = value;
01919 break;
01920 case FRV_OPERAND_DEBUG :
01921 fields->f_debug = value;
01922 break;
01923 case FRV_OPERAND_EIR :
01924 fields->f_eir = value;
01925 break;
01926 case FRV_OPERAND_HINT :
01927 fields->f_hint = value;
01928 break;
01929 case FRV_OPERAND_HINT_NOT_TAKEN :
01930 fields->f_hint = value;
01931 break;
01932 case FRV_OPERAND_HINT_TAKEN :
01933 fields->f_hint = value;
01934 break;
01935 case FRV_OPERAND_LABEL16 :
01936 fields->f_label16 = value;
01937 break;
01938 case FRV_OPERAND_LABEL24 :
01939 fields->f_label24 = value;
01940 break;
01941 case FRV_OPERAND_LDANN :
01942 fields->f_reloc_ann = value;
01943 break;
01944 case FRV_OPERAND_LDDANN :
01945 fields->f_reloc_ann = value;
01946 break;
01947 case FRV_OPERAND_LOCK :
01948 fields->f_lock = value;
01949 break;
01950 case FRV_OPERAND_PACK :
01951 fields->f_pack = value;
01952 break;
01953 case FRV_OPERAND_S10 :
01954 fields->f_s10 = value;
01955 break;
01956 case FRV_OPERAND_S12 :
01957 fields->f_d12 = value;
01958 break;
01959 case FRV_OPERAND_S16 :
01960 fields->f_s16 = value;
01961 break;
01962 case FRV_OPERAND_S5 :
01963 fields->f_s5 = value;
01964 break;
01965 case FRV_OPERAND_S6 :
01966 fields->f_s6 = value;
01967 break;
01968 case FRV_OPERAND_S6_1 :
01969 fields->f_s6_1 = value;
01970 break;
01971 case FRV_OPERAND_SLO16 :
01972 fields->f_s16 = value;
01973 break;
01974 case FRV_OPERAND_SPR :
01975 fields->f_spr = value;
01976 break;
01977 case FRV_OPERAND_U12 :
01978 fields->f_u12 = value;
01979 break;
01980 case FRV_OPERAND_U16 :
01981 fields->f_u16 = value;
01982 break;
01983 case FRV_OPERAND_U6 :
01984 fields->f_u6 = value;
01985 break;
01986 case FRV_OPERAND_UHI16 :
01987 fields->f_u16 = value;
01988 break;
01989 case FRV_OPERAND_ULO16 :
01990 fields->f_u16 = value;
01991 break;
01992
01993 default :
01994
01995 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
01996 opindex);
01997 abort ();
01998 }
01999 }
02000
02001 void
02002 frv_cgen_set_vma_operand (cd, opindex, fields, value)
02003 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
02004 int opindex;
02005 CGEN_FIELDS * fields;
02006 bfd_vma value;
02007 {
02008 switch (opindex)
02009 {
02010 case FRV_OPERAND_A0 :
02011 fields->f_A = value;
02012 break;
02013 case FRV_OPERAND_A1 :
02014 fields->f_A = value;
02015 break;
02016 case FRV_OPERAND_ACC40SI :
02017 fields->f_ACC40Si = value;
02018 break;
02019 case FRV_OPERAND_ACC40SK :
02020 fields->f_ACC40Sk = value;
02021 break;
02022 case FRV_OPERAND_ACC40UI :
02023 fields->f_ACC40Ui = value;
02024 break;
02025 case FRV_OPERAND_ACC40UK :
02026 fields->f_ACC40Uk = value;
02027 break;
02028 case FRV_OPERAND_ACCGI :
02029 fields->f_ACCGi = value;
02030 break;
02031 case FRV_OPERAND_ACCGK :
02032 fields->f_ACCGk = value;
02033 break;
02034 case FRV_OPERAND_CCI :
02035 fields->f_CCi = value;
02036 break;
02037 case FRV_OPERAND_CPRDOUBLEK :
02038 fields->f_CPRk = value;
02039 break;
02040 case FRV_OPERAND_CPRI :
02041 fields->f_CPRi = value;
02042 break;
02043 case FRV_OPERAND_CPRJ :
02044 fields->f_CPRj = value;
02045 break;
02046 case FRV_OPERAND_CPRK :
02047 fields->f_CPRk = value;
02048 break;
02049 case FRV_OPERAND_CRI :
02050 fields->f_CRi = value;
02051 break;
02052 case FRV_OPERAND_CRJ :
02053 fields->f_CRj = value;
02054 break;
02055 case FRV_OPERAND_CRJ_FLOAT :
02056 fields->f_CRj_float = value;
02057 break;
02058 case FRV_OPERAND_CRJ_INT :
02059 fields->f_CRj_int = value;
02060 break;
02061 case FRV_OPERAND_CRK :
02062 fields->f_CRk = value;
02063 break;
02064 case FRV_OPERAND_FCCI_1 :
02065 fields->f_FCCi_1 = value;
02066 break;
02067 case FRV_OPERAND_FCCI_2 :
02068 fields->f_FCCi_2 = value;
02069 break;
02070 case FRV_OPERAND_FCCI_3 :
02071 fields->f_FCCi_3 = value;
02072 break;
02073 case FRV_OPERAND_FCCK :
02074 fields->f_FCCk = value;
02075 break;
02076 case FRV_OPERAND_FRDOUBLEI :
02077 fields->f_FRi = value;
02078 break;
02079 case FRV_OPERAND_FRDOUBLEJ :
02080 fields->f_FRj = value;
02081 break;
02082 case FRV_OPERAND_FRDOUBLEK :
02083 fields->f_FRk = value;
02084 break;
02085 case FRV_OPERAND_FRI :
02086 fields->f_FRi = value;
02087 break;
02088 case FRV_OPERAND_FRINTI :
02089 fields->f_FRi = value;
02090 break;
02091 case FRV_OPERAND_FRINTIEVEN :
02092 fields->f_FRi = value;
02093 break;
02094 case FRV_OPERAND_FRINTJ :
02095 fields->f_FRj = value;
02096 break;
02097 case FRV_OPERAND_FRINTJEVEN :
02098 fields->f_FRj = value;
02099 break;
02100 case FRV_OPERAND_FRINTK :
02101 fields->f_FRk = value;
02102 break;
02103 case FRV_OPERAND_FRINTKEVEN :
02104 fields->f_FRk = value;
02105 break;
02106 case FRV_OPERAND_FRJ :
02107 fields->f_FRj = value;
02108 break;
02109 case FRV_OPERAND_FRK :
02110 fields->f_FRk = value;
02111 break;
02112 case FRV_OPERAND_FRKHI :
02113 fields->f_FRk = value;
02114 break;
02115 case FRV_OPERAND_FRKLO :
02116 fields->f_FRk = value;
02117 break;
02118 case FRV_OPERAND_GRDOUBLEK :
02119 fields->f_GRk = value;
02120 break;
02121 case FRV_OPERAND_GRI :
02122 fields->f_GRi = value;
02123 break;
02124 case FRV_OPERAND_GRJ :
02125 fields->f_GRj = value;
02126 break;
02127 case FRV_OPERAND_GRK :
02128 fields->f_GRk = value;
02129 break;
02130 case FRV_OPERAND_GRKHI :
02131 fields->f_GRk = value;
02132 break;
02133 case FRV_OPERAND_GRKLO :
02134 fields->f_GRk = value;
02135 break;
02136 case FRV_OPERAND_ICCI_1 :
02137 fields->f_ICCi_1 = value;
02138 break;
02139 case FRV_OPERAND_ICCI_2 :
02140 fields->f_ICCi_2 = value;
02141 break;
02142 case FRV_OPERAND_ICCI_3 :
02143 fields->f_ICCi_3 = value;
02144 break;
02145 case FRV_OPERAND_LI :
02146 fields->f_LI = value;
02147 break;
02148 case FRV_OPERAND_LRAD :
02149 fields->f_LRAD = value;
02150 break;
02151 case FRV_OPERAND_LRAE :
02152 fields->f_LRAE = value;
02153 break;
02154 case FRV_OPERAND_LRAS :
02155 fields->f_LRAS = value;
02156 break;
02157 case FRV_OPERAND_TLBPRL :
02158 fields->f_TLBPRL = value;
02159 break;
02160 case FRV_OPERAND_TLBPROPX :
02161 fields->f_TLBPRopx = value;
02162 break;
02163 case FRV_OPERAND_AE :
02164 fields->f_ae = value;
02165 break;
02166 case FRV_OPERAND_CALLANN :
02167 fields->f_reloc_ann = value;
02168 break;
02169 case FRV_OPERAND_CCOND :
02170 fields->f_ccond = value;
02171 break;
02172 case FRV_OPERAND_COND :
02173 fields->f_cond = value;
02174 break;
02175 case FRV_OPERAND_D12 :
02176 fields->f_d12 = value;
02177 break;
02178 case FRV_OPERAND_DEBUG :
02179 fields->f_debug = value;
02180 break;
02181 case FRV_OPERAND_EIR :
02182 fields->f_eir = value;
02183 break;
02184 case FRV_OPERAND_HINT :
02185 fields->f_hint = value;
02186 break;
02187 case FRV_OPERAND_HINT_NOT_TAKEN :
02188 fields->f_hint = value;
02189 break;
02190 case FRV_OPERAND_HINT_TAKEN :
02191 fields->f_hint = value;
02192 break;
02193 case FRV_OPERAND_LABEL16 :
02194 fields->f_label16 = value;
02195 break;
02196 case FRV_OPERAND_LABEL24 :
02197 fields->f_label24 = value;
02198 break;
02199 case FRV_OPERAND_LDANN :
02200 fields->f_reloc_ann = value;
02201 break;
02202 case FRV_OPERAND_LDDANN :
02203 fields->f_reloc_ann = value;
02204 break;
02205 case FRV_OPERAND_LOCK :
02206 fields->f_lock = value;
02207 break;
02208 case FRV_OPERAND_PACK :
02209 fields->f_pack = value;
02210 break;
02211 case FRV_OPERAND_S10 :
02212 fields->f_s10 = value;
02213 break;
02214 case FRV_OPERAND_S12 :
02215 fields->f_d12 = value;
02216 break;
02217 case FRV_OPERAND_S16 :
02218 fields->f_s16 = value;
02219 break;
02220 case FRV_OPERAND_S5 :
02221 fields->f_s5 = value;
02222 break;
02223 case FRV_OPERAND_S6 :
02224 fields->f_s6 = value;
02225 break;
02226 case FRV_OPERAND_S6_1 :
02227 fields->f_s6_1 = value;
02228 break;
02229 case FRV_OPERAND_SLO16 :
02230 fields->f_s16 = value;
02231 break;
02232 case FRV_OPERAND_SPR :
02233 fields->f_spr = value;
02234 break;
02235 case FRV_OPERAND_U12 :
02236 fields->f_u12 = value;
02237 break;
02238 case FRV_OPERAND_U16 :
02239 fields->f_u16 = value;
02240 break;
02241 case FRV_OPERAND_U6 :
02242 fields->f_u6 = value;
02243 break;
02244 case FRV_OPERAND_UHI16 :
02245 fields->f_u16 = value;
02246 break;
02247 case FRV_OPERAND_ULO16 :
02248 fields->f_u16 = value;
02249 break;
02250
02251 default :
02252
02253 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
02254 opindex);
02255 abort ();
02256 }
02257 }
02258
02259
02260
02261 void
02262 frv_cgen_init_ibld_table (cd)
02263 CGEN_CPU_DESC cd;
02264 {
02265 cd->insert_handlers = & frv_cgen_insert_handlers[0];
02266 cd->extract_handlers = & frv_cgen_extract_handlers[0];
02267
02268 cd->insert_operand = frv_cgen_insert_operand;
02269 cd->extract_operand = frv_cgen_extract_operand;
02270
02271 cd->get_int_operand = frv_cgen_get_int_operand;
02272 cd->set_int_operand = frv_cgen_set_int_operand;
02273 cd->get_vma_operand = frv_cgen_get_vma_operand;
02274 cd->set_vma_operand = frv_cgen_set_vma_operand;
02275 }