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 #include "sysdep.h"
00028 #include <stdio.h>
00029 #include "ansidecl.h"
00030 #include "dis-asm.h"
00031 #include "bfd.h"
00032 #include "symcat.h"
00033 #include "fr30-desc.h"
00034 #include "fr30-opc.h"
00035 #include "opintl.h"
00036 #include "safe-ctype.h"
00037
00038 #undef min
00039 #define min(a,b) ((a) < (b) ? (a) : (b))
00040 #undef max
00041 #define max(a,b) ((a) > (b) ? (a) : (b))
00042
00043
00044 #define FLD(f) (fields->f)
00045
00046 static const char * insert_normal
00047 (CGEN_CPU_DESC, long, unsigned int, unsigned int, unsigned int,
00048 unsigned int, unsigned int, unsigned int, CGEN_INSN_BYTES_PTR);
00049 static const char * insert_insn_normal
00050 (CGEN_CPU_DESC, const CGEN_INSN *,
00051 CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma);
00052 static int extract_normal
00053 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00054 unsigned int, unsigned int, unsigned int, unsigned int,
00055 unsigned int, unsigned int, bfd_vma, long *);
00056 static int extract_insn_normal
00057 (CGEN_CPU_DESC, const CGEN_INSN *, CGEN_EXTRACT_INFO *,
00058 CGEN_INSN_INT, CGEN_FIELDS *, bfd_vma);
00059 #if CGEN_INT_INSN_P
00060 static void put_insn_int_value
00061 (CGEN_CPU_DESC, CGEN_INSN_BYTES_PTR, int, int, CGEN_INSN_INT);
00062 #endif
00063 #if ! CGEN_INT_INSN_P
00064 static CGEN_INLINE void insert_1
00065 (CGEN_CPU_DESC, unsigned long, int, int, int, unsigned char *);
00066 static CGEN_INLINE int fill_cache
00067 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, bfd_vma);
00068 static CGEN_INLINE long extract_1
00069 (CGEN_CPU_DESC, CGEN_EXTRACT_INFO *, int, int, int, unsigned char *, bfd_vma);
00070 #endif
00071
00072
00073
00074 #if ! CGEN_INT_INSN_P
00075
00076
00077
00078 static CGEN_INLINE void
00079 insert_1 (CGEN_CPU_DESC cd,
00080 unsigned long value,
00081 int start,
00082 int length,
00083 int word_length,
00084 unsigned char *bufp)
00085 {
00086 unsigned long x,mask;
00087 int shift;
00088
00089 x = cgen_get_insn_value (cd, bufp, word_length);
00090
00091
00092 mask = (((1L << (length - 1)) - 1) << 1) | 1;
00093 if (CGEN_INSN_LSB0_P)
00094 shift = (start + 1) - length;
00095 else
00096 shift = (word_length - (start + length));
00097 x = (x & ~(mask << shift)) | ((value & mask) << shift);
00098
00099 cgen_put_insn_value (cd, bufp, word_length, (bfd_vma) x);
00100 }
00101
00102 #endif
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120 static const char *
00121 insert_normal (CGEN_CPU_DESC cd,
00122 long value,
00123 unsigned int attrs,
00124 unsigned int word_offset,
00125 unsigned int start,
00126 unsigned int length,
00127 unsigned int word_length,
00128 unsigned int total_length,
00129 CGEN_INSN_BYTES_PTR buffer)
00130 {
00131 static char errbuf[100];
00132
00133 unsigned long mask = (((1L << (length - 1)) - 1) << 1) | 1;
00134
00135
00136 if (length == 0)
00137 return NULL;
00138
00139 #if 0
00140 if (CGEN_INT_INSN_P
00141 && word_offset != 0)
00142 abort ();
00143 #endif
00144
00145 if (word_length > 32)
00146 abort ();
00147
00148
00149
00150 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
00151 {
00152 if (word_offset == 0
00153 && word_length > total_length)
00154 word_length = total_length;
00155 }
00156
00157
00158 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGN_OPT))
00159 {
00160 long minval = - (1L << (length - 1));
00161 unsigned long maxval = mask;
00162
00163 if ((value > 0 && (unsigned long) value > maxval)
00164 || value < minval)
00165 {
00166
00167 sprintf (errbuf,
00168 _("operand out of range (%ld not between %ld and %lu)"),
00169 value, minval, maxval);
00170 return errbuf;
00171 }
00172 }
00173 else if (! CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED))
00174 {
00175 unsigned long maxval = mask;
00176
00177 if ((unsigned long) value > maxval)
00178 {
00179
00180 sprintf (errbuf,
00181 _("operand out of range (%lu not between 0 and %lu)"),
00182 value, maxval);
00183 return errbuf;
00184 }
00185 }
00186 else
00187 {
00188 if (! cgen_signed_overflow_ok_p (cd))
00189 {
00190 long minval = - (1L << (length - 1));
00191 long maxval = (1L << (length - 1)) - 1;
00192
00193 if (value < minval || value > maxval)
00194 {
00195 sprintf
00196
00197 (errbuf, _("operand out of range (%ld not between %ld and %ld)"),
00198 value, minval, maxval);
00199 return errbuf;
00200 }
00201 }
00202 }
00203
00204 #if CGEN_INT_INSN_P
00205
00206 {
00207 int shift;
00208
00209 if (CGEN_INSN_LSB0_P)
00210 shift = (word_offset + start + 1) - length;
00211 else
00212 shift = total_length - (word_offset + start + length);
00213 *buffer = (*buffer & ~(mask << shift)) | ((value & mask) << shift);
00214 }
00215
00216 #else
00217
00218 {
00219 unsigned char *bufp = (unsigned char *) buffer + word_offset / 8;
00220
00221 insert_1 (cd, value, start, length, word_length, bufp);
00222 }
00223
00224 #endif
00225
00226 return NULL;
00227 }
00228
00229
00230
00231
00232
00233
00234
00235
00236 static const char *
00237 insert_insn_normal (CGEN_CPU_DESC cd,
00238 const CGEN_INSN * insn,
00239 CGEN_FIELDS * fields,
00240 CGEN_INSN_BYTES_PTR buffer,
00241 bfd_vma pc)
00242 {
00243 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
00244 unsigned long value;
00245 const CGEN_SYNTAX_CHAR_TYPE * syn;
00246
00247 CGEN_INIT_INSERT (cd);
00248 value = CGEN_INSN_BASE_VALUE (insn);
00249
00250
00251
00252
00253 #if CGEN_INT_INSN_P
00254
00255 put_insn_int_value (cd, buffer, cd->base_insn_bitsize,
00256 CGEN_FIELDS_BITSIZE (fields), value);
00257
00258 #else
00259
00260 cgen_put_insn_value (cd, buffer, min ((unsigned) cd->base_insn_bitsize,
00261 (unsigned) CGEN_FIELDS_BITSIZE (fields)),
00262 value);
00263
00264 #endif
00265
00266
00267
00268
00269
00270
00271 for (syn = CGEN_SYNTAX_STRING (syntax); * syn; ++ syn)
00272 {
00273 const char *errmsg;
00274
00275 if (CGEN_SYNTAX_CHAR_P (* syn))
00276 continue;
00277
00278 errmsg = (* cd->insert_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
00279 fields, buffer, pc);
00280 if (errmsg)
00281 return errmsg;
00282 }
00283
00284 return NULL;
00285 }
00286
00287 #if CGEN_INT_INSN_P
00288
00289
00290
00291 static void
00292 put_insn_int_value (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
00293 CGEN_INSN_BYTES_PTR buf,
00294 int length,
00295 int insn_length,
00296 CGEN_INSN_INT value)
00297 {
00298
00299
00300 if (length > insn_length)
00301 *buf = value;
00302 else
00303 {
00304 int shift = insn_length - length;
00305
00306 CGEN_INSN_INT mask = (((1L << (length - 1)) - 1) << 1) | 1;
00307 *buf = (*buf & ~(mask << shift)) | ((value & mask) << shift);
00308 }
00309 }
00310 #endif
00311
00312
00313
00314 #if ! CGEN_INT_INSN_P
00315
00316
00317
00318
00319
00320
00321
00322 static CGEN_INLINE int
00323 fill_cache (CGEN_CPU_DESC cd ATTRIBUTE_UNUSED,
00324 CGEN_EXTRACT_INFO *ex_info,
00325 int offset,
00326 int bytes,
00327 bfd_vma pc)
00328 {
00329
00330
00331 unsigned int mask;
00332 disassemble_info *info = (disassemble_info *) ex_info->dis_info;
00333
00334
00335 mask = (1 << bytes) - 1;
00336 if (((ex_info->valid >> offset) & mask) == mask)
00337 return 1;
00338
00339
00340 for (mask = 1 << offset; bytes > 0; --bytes, ++offset, mask <<= 1)
00341 if (! (mask & ex_info->valid))
00342 break;
00343
00344 if (bytes)
00345 {
00346 int status;
00347
00348 pc += offset;
00349 status = (*info->read_memory_func)
00350 (pc, ex_info->insn_bytes + offset, bytes, info);
00351
00352 if (status != 0)
00353 {
00354 (*info->memory_error_func) (status, pc, info);
00355 return 0;
00356 }
00357
00358 ex_info->valid |= ((1 << bytes) - 1) << offset;
00359 }
00360
00361 return 1;
00362 }
00363
00364
00365
00366 static CGEN_INLINE long
00367 extract_1 (CGEN_CPU_DESC cd,
00368 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
00369 int start,
00370 int length,
00371 int word_length,
00372 unsigned char *bufp,
00373 bfd_vma pc ATTRIBUTE_UNUSED)
00374 {
00375 unsigned long x;
00376 int shift;
00377 #if 0
00378 int big_p = CGEN_CPU_INSN_ENDIAN (cd) == CGEN_ENDIAN_BIG;
00379 #endif
00380 x = cgen_get_insn_value (cd, bufp, word_length);
00381
00382 if (CGEN_INSN_LSB0_P)
00383 shift = (start + 1) - length;
00384 else
00385 shift = (word_length - (start + length));
00386 return x >> shift;
00387 }
00388
00389 #endif
00390
00391
00392
00393
00394
00395
00396
00397
00398
00399
00400
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411 static int
00412 extract_normal (CGEN_CPU_DESC cd,
00413 #if ! CGEN_INT_INSN_P
00414 CGEN_EXTRACT_INFO *ex_info,
00415 #else
00416 CGEN_EXTRACT_INFO *ex_info ATTRIBUTE_UNUSED,
00417 #endif
00418 CGEN_INSN_INT insn_value,
00419 unsigned int attrs,
00420 unsigned int word_offset,
00421 unsigned int start,
00422 unsigned int length,
00423 unsigned int word_length,
00424 unsigned int total_length,
00425 #if ! CGEN_INT_INSN_P
00426 bfd_vma pc,
00427 #else
00428 bfd_vma pc ATTRIBUTE_UNUSED,
00429 #endif
00430 long *valuep)
00431 {
00432 long value, mask;
00433
00434
00435
00436 if (length == 0)
00437 {
00438 *valuep = 0;
00439 return 1;
00440 }
00441
00442 #if 0
00443 if (CGEN_INT_INSN_P
00444 && word_offset != 0)
00445 abort ();
00446 #endif
00447
00448 if (word_length > 32)
00449 abort ();
00450
00451
00452
00453 if (cd->min_insn_bitsize < cd->base_insn_bitsize)
00454 {
00455 if (word_offset == 0
00456 && word_length > total_length)
00457 word_length = total_length;
00458 }
00459
00460
00461
00462 if (CGEN_INT_INSN_P || (word_offset == 0 && word_length == total_length))
00463 {
00464 if (CGEN_INSN_LSB0_P)
00465 value = insn_value >> ((word_offset + start + 1) - length);
00466 else
00467 value = insn_value >> (total_length - ( word_offset + start + length));
00468 }
00469
00470 #if ! CGEN_INT_INSN_P
00471
00472 else
00473 {
00474 unsigned char *bufp = ex_info->insn_bytes + word_offset / 8;
00475
00476 if (word_length > 32)
00477 abort ();
00478
00479 if (fill_cache (cd, ex_info, word_offset / 8, word_length / 8, pc) == 0)
00480 return 0;
00481
00482 value = extract_1 (cd, ex_info, start, length, word_length, bufp, pc);
00483 }
00484
00485 #endif
00486
00487
00488 mask = (((1L << (length - 1)) - 1) << 1) | 1;
00489
00490 value &= mask;
00491
00492 if (CGEN_BOOL_ATTR (attrs, CGEN_IFLD_SIGNED)
00493 && (value & (1L << (length - 1))))
00494 value |= ~mask;
00495
00496 *valuep = value;
00497
00498 return 1;
00499 }
00500
00501
00502
00503
00504
00505
00506
00507
00508
00509
00510 static int
00511 extract_insn_normal (CGEN_CPU_DESC cd,
00512 const CGEN_INSN *insn,
00513 CGEN_EXTRACT_INFO *ex_info,
00514 CGEN_INSN_INT insn_value,
00515 CGEN_FIELDS *fields,
00516 bfd_vma pc)
00517 {
00518 const CGEN_SYNTAX *syntax = CGEN_INSN_SYNTAX (insn);
00519 const CGEN_SYNTAX_CHAR_TYPE *syn;
00520
00521 CGEN_FIELDS_BITSIZE (fields) = CGEN_INSN_BITSIZE (insn);
00522
00523 CGEN_INIT_EXTRACT (cd);
00524
00525 for (syn = CGEN_SYNTAX_STRING (syntax); *syn; ++syn)
00526 {
00527 int length;
00528
00529 if (CGEN_SYNTAX_CHAR_P (*syn))
00530 continue;
00531
00532 length = (* cd->extract_operand) (cd, CGEN_SYNTAX_FIELD (*syn),
00533 ex_info, insn_value, fields, pc);
00534 if (length <= 0)
00535 return length;
00536 }
00537
00538
00539 return CGEN_INSN_BITSIZE (insn);
00540 }
00541
00542
00543
00544 const char * fr30_cgen_insert_operand
00545 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, CGEN_INSN_BYTES_PTR, bfd_vma));
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556
00557
00558
00559
00560
00561 const char *
00562 fr30_cgen_insert_operand (cd, opindex, fields, buffer, pc)
00563 CGEN_CPU_DESC cd;
00564 int opindex;
00565 CGEN_FIELDS * fields;
00566 CGEN_INSN_BYTES_PTR buffer;
00567 bfd_vma pc ATTRIBUTE_UNUSED;
00568 {
00569 const char * errmsg = NULL;
00570 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00571
00572 switch (opindex)
00573 {
00574 case FR30_OPERAND_CRI :
00575 errmsg = insert_normal (cd, fields->f_CRi, 0, 16, 12, 4, 16, total_length, buffer);
00576 break;
00577 case FR30_OPERAND_CRJ :
00578 errmsg = insert_normal (cd, fields->f_CRj, 0, 16, 8, 4, 16, total_length, buffer);
00579 break;
00580 case FR30_OPERAND_R13 :
00581 break;
00582 case FR30_OPERAND_R14 :
00583 break;
00584 case FR30_OPERAND_R15 :
00585 break;
00586 case FR30_OPERAND_RI :
00587 errmsg = insert_normal (cd, fields->f_Ri, 0, 0, 12, 4, 16, total_length, buffer);
00588 break;
00589 case FR30_OPERAND_RIC :
00590 errmsg = insert_normal (cd, fields->f_Ric, 0, 16, 12, 4, 16, total_length, buffer);
00591 break;
00592 case FR30_OPERAND_RJ :
00593 errmsg = insert_normal (cd, fields->f_Rj, 0, 0, 8, 4, 16, total_length, buffer);
00594 break;
00595 case FR30_OPERAND_RJC :
00596 errmsg = insert_normal (cd, fields->f_Rjc, 0, 16, 8, 4, 16, total_length, buffer);
00597 break;
00598 case FR30_OPERAND_RS1 :
00599 errmsg = insert_normal (cd, fields->f_Rs1, 0, 0, 8, 4, 16, total_length, buffer);
00600 break;
00601 case FR30_OPERAND_RS2 :
00602 errmsg = insert_normal (cd, fields->f_Rs2, 0, 0, 12, 4, 16, total_length, buffer);
00603 break;
00604 case FR30_OPERAND_CC :
00605 errmsg = insert_normal (cd, fields->f_cc, 0, 0, 4, 4, 16, total_length, buffer);
00606 break;
00607 case FR30_OPERAND_CCC :
00608 errmsg = insert_normal (cd, fields->f_ccc, 0, 16, 0, 8, 16, total_length, buffer);
00609 break;
00610 case FR30_OPERAND_DIR10 :
00611 {
00612 long value = fields->f_dir10;
00613 value = ((unsigned int) (value) >> (2));
00614 errmsg = insert_normal (cd, value, 0, 0, 8, 8, 16, total_length, buffer);
00615 }
00616 break;
00617 case FR30_OPERAND_DIR8 :
00618 errmsg = insert_normal (cd, fields->f_dir8, 0, 0, 8, 8, 16, total_length, buffer);
00619 break;
00620 case FR30_OPERAND_DIR9 :
00621 {
00622 long value = fields->f_dir9;
00623 value = ((unsigned int) (value) >> (1));
00624 errmsg = insert_normal (cd, value, 0, 0, 8, 8, 16, total_length, buffer);
00625 }
00626 break;
00627 case FR30_OPERAND_DISP10 :
00628 {
00629 long value = fields->f_disp10;
00630 value = ((int) (value) >> (2));
00631 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, buffer);
00632 }
00633 break;
00634 case FR30_OPERAND_DISP8 :
00635 errmsg = insert_normal (cd, fields->f_disp8, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, buffer);
00636 break;
00637 case FR30_OPERAND_DISP9 :
00638 {
00639 long value = fields->f_disp9;
00640 value = ((int) (value) >> (1));
00641 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, buffer);
00642 }
00643 break;
00644 case FR30_OPERAND_I20 :
00645 {
00646 {
00647 FLD (f_i20_4) = ((unsigned int) (FLD (f_i20)) >> (16));
00648 FLD (f_i20_16) = ((FLD (f_i20)) & (65535));
00649 }
00650 errmsg = insert_normal (cd, fields->f_i20_4, 0, 0, 8, 4, 16, total_length, buffer);
00651 if (errmsg)
00652 break;
00653 errmsg = insert_normal (cd, fields->f_i20_16, 0, 16, 0, 16, 16, total_length, buffer);
00654 if (errmsg)
00655 break;
00656 }
00657 break;
00658 case FR30_OPERAND_I32 :
00659 errmsg = insert_normal (cd, fields->f_i32, 0|(1<<CGEN_IFLD_SIGN_OPT), 16, 0, 32, 32, total_length, buffer);
00660 break;
00661 case FR30_OPERAND_I8 :
00662 errmsg = insert_normal (cd, fields->f_i8, 0, 0, 4, 8, 16, total_length, buffer);
00663 break;
00664 case FR30_OPERAND_LABEL12 :
00665 {
00666 long value = fields->f_rel12;
00667 value = ((int) (((value) - (((pc) + (2))))) >> (1));
00668 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 11, 16, total_length, buffer);
00669 }
00670 break;
00671 case FR30_OPERAND_LABEL9 :
00672 {
00673 long value = fields->f_rel9;
00674 value = ((int) (((value) - (((pc) + (2))))) >> (1));
00675 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 8, 16, total_length, buffer);
00676 }
00677 break;
00678 case FR30_OPERAND_M4 :
00679 {
00680 long value = fields->f_m4;
00681 value = ((value) & (15));
00682 errmsg = insert_normal (cd, value, 0, 0, 8, 4, 16, total_length, buffer);
00683 }
00684 break;
00685 case FR30_OPERAND_PS :
00686 break;
00687 case FR30_OPERAND_REGLIST_HI_LD :
00688 errmsg = insert_normal (cd, fields->f_reglist_hi_ld, 0, 0, 8, 8, 16, total_length, buffer);
00689 break;
00690 case FR30_OPERAND_REGLIST_HI_ST :
00691 errmsg = insert_normal (cd, fields->f_reglist_hi_st, 0, 0, 8, 8, 16, total_length, buffer);
00692 break;
00693 case FR30_OPERAND_REGLIST_LOW_LD :
00694 errmsg = insert_normal (cd, fields->f_reglist_low_ld, 0, 0, 8, 8, 16, total_length, buffer);
00695 break;
00696 case FR30_OPERAND_REGLIST_LOW_ST :
00697 errmsg = insert_normal (cd, fields->f_reglist_low_st, 0, 0, 8, 8, 16, total_length, buffer);
00698 break;
00699 case FR30_OPERAND_S10 :
00700 {
00701 long value = fields->f_s10;
00702 value = ((int) (value) >> (2));
00703 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 16, total_length, buffer);
00704 }
00705 break;
00706 case FR30_OPERAND_U10 :
00707 {
00708 long value = fields->f_u10;
00709 value = ((unsigned int) (value) >> (2));
00710 errmsg = insert_normal (cd, value, 0, 0, 8, 8, 16, total_length, buffer);
00711 }
00712 break;
00713 case FR30_OPERAND_U4 :
00714 errmsg = insert_normal (cd, fields->f_u4, 0, 0, 8, 4, 16, total_length, buffer);
00715 break;
00716 case FR30_OPERAND_U4C :
00717 errmsg = insert_normal (cd, fields->f_u4c, 0, 0, 12, 4, 16, total_length, buffer);
00718 break;
00719 case FR30_OPERAND_U8 :
00720 errmsg = insert_normal (cd, fields->f_u8, 0, 0, 8, 8, 16, total_length, buffer);
00721 break;
00722 case FR30_OPERAND_UDISP6 :
00723 {
00724 long value = fields->f_udisp6;
00725 value = ((unsigned int) (value) >> (2));
00726 errmsg = insert_normal (cd, value, 0, 0, 8, 4, 16, total_length, buffer);
00727 }
00728 break;
00729
00730 default :
00731
00732 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
00733 opindex);
00734 abort ();
00735 }
00736
00737 return errmsg;
00738 }
00739
00740 int fr30_cgen_extract_operand
00741 PARAMS ((CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00742 CGEN_FIELDS *, bfd_vma));
00743
00744
00745
00746
00747
00748
00749
00750
00751
00752
00753
00754
00755
00756
00757
00758
00759 int
00760 fr30_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
00761 CGEN_CPU_DESC cd;
00762 int opindex;
00763 CGEN_EXTRACT_INFO *ex_info;
00764 CGEN_INSN_INT insn_value;
00765 CGEN_FIELDS * fields;
00766 bfd_vma pc;
00767 {
00768
00769 int length = 1;
00770 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00771
00772 switch (opindex)
00773 {
00774 case FR30_OPERAND_CRI :
00775 length = extract_normal (cd, ex_info, insn_value, 0, 16, 12, 4, 16, total_length, pc, & fields->f_CRi);
00776 break;
00777 case FR30_OPERAND_CRJ :
00778 length = extract_normal (cd, ex_info, insn_value, 0, 16, 8, 4, 16, total_length, pc, & fields->f_CRj);
00779 break;
00780 case FR30_OPERAND_R13 :
00781 break;
00782 case FR30_OPERAND_R14 :
00783 break;
00784 case FR30_OPERAND_R15 :
00785 break;
00786 case FR30_OPERAND_RI :
00787 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 16, total_length, pc, & fields->f_Ri);
00788 break;
00789 case FR30_OPERAND_RIC :
00790 length = extract_normal (cd, ex_info, insn_value, 0, 16, 12, 4, 16, total_length, pc, & fields->f_Ric);
00791 break;
00792 case FR30_OPERAND_RJ :
00793 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & fields->f_Rj);
00794 break;
00795 case FR30_OPERAND_RJC :
00796 length = extract_normal (cd, ex_info, insn_value, 0, 16, 8, 4, 16, total_length, pc, & fields->f_Rjc);
00797 break;
00798 case FR30_OPERAND_RS1 :
00799 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & fields->f_Rs1);
00800 break;
00801 case FR30_OPERAND_RS2 :
00802 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 16, total_length, pc, & fields->f_Rs2);
00803 break;
00804 case FR30_OPERAND_CC :
00805 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 16, total_length, pc, & fields->f_cc);
00806 break;
00807 case FR30_OPERAND_CCC :
00808 length = extract_normal (cd, ex_info, insn_value, 0, 16, 0, 8, 16, total_length, pc, & fields->f_ccc);
00809 break;
00810 case FR30_OPERAND_DIR10 :
00811 {
00812 long value;
00813 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & value);
00814 value = ((value) << (2));
00815 fields->f_dir10 = value;
00816 }
00817 break;
00818 case FR30_OPERAND_DIR8 :
00819 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_dir8);
00820 break;
00821 case FR30_OPERAND_DIR9 :
00822 {
00823 long value;
00824 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & value);
00825 value = ((value) << (1));
00826 fields->f_dir9 = value;
00827 }
00828 break;
00829 case FR30_OPERAND_DISP10 :
00830 {
00831 long value;
00832 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, pc, & value);
00833 value = ((value) << (2));
00834 fields->f_disp10 = value;
00835 }
00836 break;
00837 case FR30_OPERAND_DISP8 :
00838 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, pc, & fields->f_disp8);
00839 break;
00840 case FR30_OPERAND_DISP9 :
00841 {
00842 long value;
00843 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 4, 8, 16, total_length, pc, & value);
00844 value = ((value) << (1));
00845 fields->f_disp9 = value;
00846 }
00847 break;
00848 case FR30_OPERAND_I20 :
00849 {
00850 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & fields->f_i20_4);
00851 if (length <= 0) break;
00852 length = extract_normal (cd, ex_info, insn_value, 0, 16, 0, 16, 16, total_length, pc, & fields->f_i20_16);
00853 if (length <= 0) break;
00854 {
00855 FLD (f_i20) = ((((FLD (f_i20_4)) << (16))) | (FLD (f_i20_16)));
00856 }
00857 }
00858 break;
00859 case FR30_OPERAND_I32 :
00860 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGN_OPT), 16, 0, 32, 32, total_length, pc, & fields->f_i32);
00861 break;
00862 case FR30_OPERAND_I8 :
00863 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 8, 16, total_length, pc, & fields->f_i8);
00864 break;
00865 case FR30_OPERAND_LABEL12 :
00866 {
00867 long value;
00868 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 5, 11, 16, total_length, pc, & value);
00869 value = ((((value) << (1))) + (((pc) + (2))));
00870 fields->f_rel12 = value;
00871 }
00872 break;
00873 case FR30_OPERAND_LABEL9 :
00874 {
00875 long value;
00876 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 8, 16, total_length, pc, & value);
00877 value = ((((value) << (1))) + (((pc) + (2))));
00878 fields->f_rel9 = value;
00879 }
00880 break;
00881 case FR30_OPERAND_M4 :
00882 {
00883 long value;
00884 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & value);
00885 value = ((value) | (((-1) << (4))));
00886 fields->f_m4 = value;
00887 }
00888 break;
00889 case FR30_OPERAND_PS :
00890 break;
00891 case FR30_OPERAND_REGLIST_HI_LD :
00892 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_reglist_hi_ld);
00893 break;
00894 case FR30_OPERAND_REGLIST_HI_ST :
00895 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_reglist_hi_st);
00896 break;
00897 case FR30_OPERAND_REGLIST_LOW_LD :
00898 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_reglist_low_ld);
00899 break;
00900 case FR30_OPERAND_REGLIST_LOW_ST :
00901 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_reglist_low_st);
00902 break;
00903 case FR30_OPERAND_S10 :
00904 {
00905 long value;
00906 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 16, total_length, pc, & value);
00907 value = ((value) << (2));
00908 fields->f_s10 = value;
00909 }
00910 break;
00911 case FR30_OPERAND_U10 :
00912 {
00913 long value;
00914 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & value);
00915 value = ((value) << (2));
00916 fields->f_u10 = value;
00917 }
00918 break;
00919 case FR30_OPERAND_U4 :
00920 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & fields->f_u4);
00921 break;
00922 case FR30_OPERAND_U4C :
00923 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 16, total_length, pc, & fields->f_u4c);
00924 break;
00925 case FR30_OPERAND_U8 :
00926 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 16, total_length, pc, & fields->f_u8);
00927 break;
00928 case FR30_OPERAND_UDISP6 :
00929 {
00930 long value;
00931 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 4, 16, total_length, pc, & value);
00932 value = ((value) << (2));
00933 fields->f_udisp6 = value;
00934 }
00935 break;
00936
00937 default :
00938
00939 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
00940 opindex);
00941 abort ();
00942 }
00943
00944 return length;
00945 }
00946
00947 cgen_insert_fn * const fr30_cgen_insert_handlers[] =
00948 {
00949 insert_insn_normal,
00950 };
00951
00952 cgen_extract_fn * const fr30_cgen_extract_handlers[] =
00953 {
00954 extract_insn_normal,
00955 };
00956
00957 int fr30_cgen_get_int_operand
00958 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00959 bfd_vma fr30_cgen_get_vma_operand
00960 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00961
00962
00963
00964
00965
00966
00967 int
00968 fr30_cgen_get_int_operand (cd, opindex, fields)
00969 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00970 int opindex;
00971 const CGEN_FIELDS * fields;
00972 {
00973 int value;
00974
00975 switch (opindex)
00976 {
00977 case FR30_OPERAND_CRI :
00978 value = fields->f_CRi;
00979 break;
00980 case FR30_OPERAND_CRJ :
00981 value = fields->f_CRj;
00982 break;
00983 case FR30_OPERAND_R13 :
00984 value = 0;
00985 break;
00986 case FR30_OPERAND_R14 :
00987 value = 0;
00988 break;
00989 case FR30_OPERAND_R15 :
00990 value = 0;
00991 break;
00992 case FR30_OPERAND_RI :
00993 value = fields->f_Ri;
00994 break;
00995 case FR30_OPERAND_RIC :
00996 value = fields->f_Ric;
00997 break;
00998 case FR30_OPERAND_RJ :
00999 value = fields->f_Rj;
01000 break;
01001 case FR30_OPERAND_RJC :
01002 value = fields->f_Rjc;
01003 break;
01004 case FR30_OPERAND_RS1 :
01005 value = fields->f_Rs1;
01006 break;
01007 case FR30_OPERAND_RS2 :
01008 value = fields->f_Rs2;
01009 break;
01010 case FR30_OPERAND_CC :
01011 value = fields->f_cc;
01012 break;
01013 case FR30_OPERAND_CCC :
01014 value = fields->f_ccc;
01015 break;
01016 case FR30_OPERAND_DIR10 :
01017 value = fields->f_dir10;
01018 break;
01019 case FR30_OPERAND_DIR8 :
01020 value = fields->f_dir8;
01021 break;
01022 case FR30_OPERAND_DIR9 :
01023 value = fields->f_dir9;
01024 break;
01025 case FR30_OPERAND_DISP10 :
01026 value = fields->f_disp10;
01027 break;
01028 case FR30_OPERAND_DISP8 :
01029 value = fields->f_disp8;
01030 break;
01031 case FR30_OPERAND_DISP9 :
01032 value = fields->f_disp9;
01033 break;
01034 case FR30_OPERAND_I20 :
01035 value = fields->f_i20;
01036 break;
01037 case FR30_OPERAND_I32 :
01038 value = fields->f_i32;
01039 break;
01040 case FR30_OPERAND_I8 :
01041 value = fields->f_i8;
01042 break;
01043 case FR30_OPERAND_LABEL12 :
01044 value = fields->f_rel12;
01045 break;
01046 case FR30_OPERAND_LABEL9 :
01047 value = fields->f_rel9;
01048 break;
01049 case FR30_OPERAND_M4 :
01050 value = fields->f_m4;
01051 break;
01052 case FR30_OPERAND_PS :
01053 value = 0;
01054 break;
01055 case FR30_OPERAND_REGLIST_HI_LD :
01056 value = fields->f_reglist_hi_ld;
01057 break;
01058 case FR30_OPERAND_REGLIST_HI_ST :
01059 value = fields->f_reglist_hi_st;
01060 break;
01061 case FR30_OPERAND_REGLIST_LOW_LD :
01062 value = fields->f_reglist_low_ld;
01063 break;
01064 case FR30_OPERAND_REGLIST_LOW_ST :
01065 value = fields->f_reglist_low_st;
01066 break;
01067 case FR30_OPERAND_S10 :
01068 value = fields->f_s10;
01069 break;
01070 case FR30_OPERAND_U10 :
01071 value = fields->f_u10;
01072 break;
01073 case FR30_OPERAND_U4 :
01074 value = fields->f_u4;
01075 break;
01076 case FR30_OPERAND_U4C :
01077 value = fields->f_u4c;
01078 break;
01079 case FR30_OPERAND_U8 :
01080 value = fields->f_u8;
01081 break;
01082 case FR30_OPERAND_UDISP6 :
01083 value = fields->f_udisp6;
01084 break;
01085
01086 default :
01087
01088 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
01089 opindex);
01090 abort ();
01091 }
01092
01093 return value;
01094 }
01095
01096 bfd_vma
01097 fr30_cgen_get_vma_operand (cd, opindex, fields)
01098 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01099 int opindex;
01100 const CGEN_FIELDS * fields;
01101 {
01102 bfd_vma value;
01103
01104 switch (opindex)
01105 {
01106 case FR30_OPERAND_CRI :
01107 value = fields->f_CRi;
01108 break;
01109 case FR30_OPERAND_CRJ :
01110 value = fields->f_CRj;
01111 break;
01112 case FR30_OPERAND_R13 :
01113 value = 0;
01114 break;
01115 case FR30_OPERAND_R14 :
01116 value = 0;
01117 break;
01118 case FR30_OPERAND_R15 :
01119 value = 0;
01120 break;
01121 case FR30_OPERAND_RI :
01122 value = fields->f_Ri;
01123 break;
01124 case FR30_OPERAND_RIC :
01125 value = fields->f_Ric;
01126 break;
01127 case FR30_OPERAND_RJ :
01128 value = fields->f_Rj;
01129 break;
01130 case FR30_OPERAND_RJC :
01131 value = fields->f_Rjc;
01132 break;
01133 case FR30_OPERAND_RS1 :
01134 value = fields->f_Rs1;
01135 break;
01136 case FR30_OPERAND_RS2 :
01137 value = fields->f_Rs2;
01138 break;
01139 case FR30_OPERAND_CC :
01140 value = fields->f_cc;
01141 break;
01142 case FR30_OPERAND_CCC :
01143 value = fields->f_ccc;
01144 break;
01145 case FR30_OPERAND_DIR10 :
01146 value = fields->f_dir10;
01147 break;
01148 case FR30_OPERAND_DIR8 :
01149 value = fields->f_dir8;
01150 break;
01151 case FR30_OPERAND_DIR9 :
01152 value = fields->f_dir9;
01153 break;
01154 case FR30_OPERAND_DISP10 :
01155 value = fields->f_disp10;
01156 break;
01157 case FR30_OPERAND_DISP8 :
01158 value = fields->f_disp8;
01159 break;
01160 case FR30_OPERAND_DISP9 :
01161 value = fields->f_disp9;
01162 break;
01163 case FR30_OPERAND_I20 :
01164 value = fields->f_i20;
01165 break;
01166 case FR30_OPERAND_I32 :
01167 value = fields->f_i32;
01168 break;
01169 case FR30_OPERAND_I8 :
01170 value = fields->f_i8;
01171 break;
01172 case FR30_OPERAND_LABEL12 :
01173 value = fields->f_rel12;
01174 break;
01175 case FR30_OPERAND_LABEL9 :
01176 value = fields->f_rel9;
01177 break;
01178 case FR30_OPERAND_M4 :
01179 value = fields->f_m4;
01180 break;
01181 case FR30_OPERAND_PS :
01182 value = 0;
01183 break;
01184 case FR30_OPERAND_REGLIST_HI_LD :
01185 value = fields->f_reglist_hi_ld;
01186 break;
01187 case FR30_OPERAND_REGLIST_HI_ST :
01188 value = fields->f_reglist_hi_st;
01189 break;
01190 case FR30_OPERAND_REGLIST_LOW_LD :
01191 value = fields->f_reglist_low_ld;
01192 break;
01193 case FR30_OPERAND_REGLIST_LOW_ST :
01194 value = fields->f_reglist_low_st;
01195 break;
01196 case FR30_OPERAND_S10 :
01197 value = fields->f_s10;
01198 break;
01199 case FR30_OPERAND_U10 :
01200 value = fields->f_u10;
01201 break;
01202 case FR30_OPERAND_U4 :
01203 value = fields->f_u4;
01204 break;
01205 case FR30_OPERAND_U4C :
01206 value = fields->f_u4c;
01207 break;
01208 case FR30_OPERAND_U8 :
01209 value = fields->f_u8;
01210 break;
01211 case FR30_OPERAND_UDISP6 :
01212 value = fields->f_udisp6;
01213 break;
01214
01215 default :
01216
01217 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
01218 opindex);
01219 abort ();
01220 }
01221
01222 return value;
01223 }
01224
01225 void fr30_cgen_set_int_operand
01226 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, int));
01227 void fr30_cgen_set_vma_operand
01228 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma));
01229
01230
01231
01232
01233
01234
01235 void
01236 fr30_cgen_set_int_operand (cd, opindex, fields, value)
01237 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01238 int opindex;
01239 CGEN_FIELDS * fields;
01240 int value;
01241 {
01242 switch (opindex)
01243 {
01244 case FR30_OPERAND_CRI :
01245 fields->f_CRi = value;
01246 break;
01247 case FR30_OPERAND_CRJ :
01248 fields->f_CRj = value;
01249 break;
01250 case FR30_OPERAND_R13 :
01251 break;
01252 case FR30_OPERAND_R14 :
01253 break;
01254 case FR30_OPERAND_R15 :
01255 break;
01256 case FR30_OPERAND_RI :
01257 fields->f_Ri = value;
01258 break;
01259 case FR30_OPERAND_RIC :
01260 fields->f_Ric = value;
01261 break;
01262 case FR30_OPERAND_RJ :
01263 fields->f_Rj = value;
01264 break;
01265 case FR30_OPERAND_RJC :
01266 fields->f_Rjc = value;
01267 break;
01268 case FR30_OPERAND_RS1 :
01269 fields->f_Rs1 = value;
01270 break;
01271 case FR30_OPERAND_RS2 :
01272 fields->f_Rs2 = value;
01273 break;
01274 case FR30_OPERAND_CC :
01275 fields->f_cc = value;
01276 break;
01277 case FR30_OPERAND_CCC :
01278 fields->f_ccc = value;
01279 break;
01280 case FR30_OPERAND_DIR10 :
01281 fields->f_dir10 = value;
01282 break;
01283 case FR30_OPERAND_DIR8 :
01284 fields->f_dir8 = value;
01285 break;
01286 case FR30_OPERAND_DIR9 :
01287 fields->f_dir9 = value;
01288 break;
01289 case FR30_OPERAND_DISP10 :
01290 fields->f_disp10 = value;
01291 break;
01292 case FR30_OPERAND_DISP8 :
01293 fields->f_disp8 = value;
01294 break;
01295 case FR30_OPERAND_DISP9 :
01296 fields->f_disp9 = value;
01297 break;
01298 case FR30_OPERAND_I20 :
01299 fields->f_i20 = value;
01300 break;
01301 case FR30_OPERAND_I32 :
01302 fields->f_i32 = value;
01303 break;
01304 case FR30_OPERAND_I8 :
01305 fields->f_i8 = value;
01306 break;
01307 case FR30_OPERAND_LABEL12 :
01308 fields->f_rel12 = value;
01309 break;
01310 case FR30_OPERAND_LABEL9 :
01311 fields->f_rel9 = value;
01312 break;
01313 case FR30_OPERAND_M4 :
01314 fields->f_m4 = value;
01315 break;
01316 case FR30_OPERAND_PS :
01317 break;
01318 case FR30_OPERAND_REGLIST_HI_LD :
01319 fields->f_reglist_hi_ld = value;
01320 break;
01321 case FR30_OPERAND_REGLIST_HI_ST :
01322 fields->f_reglist_hi_st = value;
01323 break;
01324 case FR30_OPERAND_REGLIST_LOW_LD :
01325 fields->f_reglist_low_ld = value;
01326 break;
01327 case FR30_OPERAND_REGLIST_LOW_ST :
01328 fields->f_reglist_low_st = value;
01329 break;
01330 case FR30_OPERAND_S10 :
01331 fields->f_s10 = value;
01332 break;
01333 case FR30_OPERAND_U10 :
01334 fields->f_u10 = value;
01335 break;
01336 case FR30_OPERAND_U4 :
01337 fields->f_u4 = value;
01338 break;
01339 case FR30_OPERAND_U4C :
01340 fields->f_u4c = value;
01341 break;
01342 case FR30_OPERAND_U8 :
01343 fields->f_u8 = value;
01344 break;
01345 case FR30_OPERAND_UDISP6 :
01346 fields->f_udisp6 = value;
01347 break;
01348
01349 default :
01350
01351 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
01352 opindex);
01353 abort ();
01354 }
01355 }
01356
01357 void
01358 fr30_cgen_set_vma_operand (cd, opindex, fields, value)
01359 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01360 int opindex;
01361 CGEN_FIELDS * fields;
01362 bfd_vma value;
01363 {
01364 switch (opindex)
01365 {
01366 case FR30_OPERAND_CRI :
01367 fields->f_CRi = value;
01368 break;
01369 case FR30_OPERAND_CRJ :
01370 fields->f_CRj = value;
01371 break;
01372 case FR30_OPERAND_R13 :
01373 break;
01374 case FR30_OPERAND_R14 :
01375 break;
01376 case FR30_OPERAND_R15 :
01377 break;
01378 case FR30_OPERAND_RI :
01379 fields->f_Ri = value;
01380 break;
01381 case FR30_OPERAND_RIC :
01382 fields->f_Ric = value;
01383 break;
01384 case FR30_OPERAND_RJ :
01385 fields->f_Rj = value;
01386 break;
01387 case FR30_OPERAND_RJC :
01388 fields->f_Rjc = value;
01389 break;
01390 case FR30_OPERAND_RS1 :
01391 fields->f_Rs1 = value;
01392 break;
01393 case FR30_OPERAND_RS2 :
01394 fields->f_Rs2 = value;
01395 break;
01396 case FR30_OPERAND_CC :
01397 fields->f_cc = value;
01398 break;
01399 case FR30_OPERAND_CCC :
01400 fields->f_ccc = value;
01401 break;
01402 case FR30_OPERAND_DIR10 :
01403 fields->f_dir10 = value;
01404 break;
01405 case FR30_OPERAND_DIR8 :
01406 fields->f_dir8 = value;
01407 break;
01408 case FR30_OPERAND_DIR9 :
01409 fields->f_dir9 = value;
01410 break;
01411 case FR30_OPERAND_DISP10 :
01412 fields->f_disp10 = value;
01413 break;
01414 case FR30_OPERAND_DISP8 :
01415 fields->f_disp8 = value;
01416 break;
01417 case FR30_OPERAND_DISP9 :
01418 fields->f_disp9 = value;
01419 break;
01420 case FR30_OPERAND_I20 :
01421 fields->f_i20 = value;
01422 break;
01423 case FR30_OPERAND_I32 :
01424 fields->f_i32 = value;
01425 break;
01426 case FR30_OPERAND_I8 :
01427 fields->f_i8 = value;
01428 break;
01429 case FR30_OPERAND_LABEL12 :
01430 fields->f_rel12 = value;
01431 break;
01432 case FR30_OPERAND_LABEL9 :
01433 fields->f_rel9 = value;
01434 break;
01435 case FR30_OPERAND_M4 :
01436 fields->f_m4 = value;
01437 break;
01438 case FR30_OPERAND_PS :
01439 break;
01440 case FR30_OPERAND_REGLIST_HI_LD :
01441 fields->f_reglist_hi_ld = value;
01442 break;
01443 case FR30_OPERAND_REGLIST_HI_ST :
01444 fields->f_reglist_hi_st = value;
01445 break;
01446 case FR30_OPERAND_REGLIST_LOW_LD :
01447 fields->f_reglist_low_ld = value;
01448 break;
01449 case FR30_OPERAND_REGLIST_LOW_ST :
01450 fields->f_reglist_low_st = value;
01451 break;
01452 case FR30_OPERAND_S10 :
01453 fields->f_s10 = value;
01454 break;
01455 case FR30_OPERAND_U10 :
01456 fields->f_u10 = value;
01457 break;
01458 case FR30_OPERAND_U4 :
01459 fields->f_u4 = value;
01460 break;
01461 case FR30_OPERAND_U4C :
01462 fields->f_u4c = value;
01463 break;
01464 case FR30_OPERAND_U8 :
01465 fields->f_u8 = value;
01466 break;
01467 case FR30_OPERAND_UDISP6 :
01468 fields->f_udisp6 = value;
01469 break;
01470
01471 default :
01472
01473 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
01474 opindex);
01475 abort ();
01476 }
01477 }
01478
01479
01480
01481 void
01482 fr30_cgen_init_ibld_table (cd)
01483 CGEN_CPU_DESC cd;
01484 {
01485 cd->insert_handlers = & fr30_cgen_insert_handlers[0];
01486 cd->extract_handlers = & fr30_cgen_extract_handlers[0];
01487
01488 cd->insert_operand = fr30_cgen_insert_operand;
01489 cd->extract_operand = fr30_cgen_extract_operand;
01490
01491 cd->get_int_operand = fr30_cgen_get_int_operand;
01492 cd->set_int_operand = fr30_cgen_set_int_operand;
01493 cd->get_vma_operand = fr30_cgen_get_vma_operand;
01494 cd->set_vma_operand = fr30_cgen_set_vma_operand;
01495 }