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 "ip2k-desc.h"
00034 #include "ip2k-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 * ip2k_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 ip2k_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 IP2K_OPERAND_ADDR16CJP :
00575 errmsg = insert_normal (cd, fields->f_addr16cjp, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 12, 13, 16, total_length, buffer);
00576 break;
00577 case IP2K_OPERAND_ADDR16H :
00578 errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 7, 8, 16, total_length, buffer);
00579 break;
00580 case IP2K_OPERAND_ADDR16L :
00581 errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 7, 8, 16, total_length, buffer);
00582 break;
00583 case IP2K_OPERAND_ADDR16P :
00584 errmsg = insert_normal (cd, fields->f_page3, 0, 0, 2, 3, 16, total_length, buffer);
00585 break;
00586 case IP2K_OPERAND_BITNO :
00587 errmsg = insert_normal (cd, fields->f_bitno, 0, 0, 11, 3, 16, total_length, buffer);
00588 break;
00589 case IP2K_OPERAND_CBIT :
00590 break;
00591 case IP2K_OPERAND_DCBIT :
00592 break;
00593 case IP2K_OPERAND_FR :
00594 errmsg = insert_normal (cd, fields->f_reg, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 8, 9, 16, total_length, buffer);
00595 break;
00596 case IP2K_OPERAND_LIT8 :
00597 errmsg = insert_normal (cd, fields->f_imm8, 0, 0, 7, 8, 16, total_length, buffer);
00598 break;
00599 case IP2K_OPERAND_PABITS :
00600 break;
00601 case IP2K_OPERAND_RETI3 :
00602 errmsg = insert_normal (cd, fields->f_reti3, 0, 0, 2, 3, 16, total_length, buffer);
00603 break;
00604 case IP2K_OPERAND_ZBIT :
00605 break;
00606
00607 default :
00608
00609 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
00610 opindex);
00611 abort ();
00612 }
00613
00614 return errmsg;
00615 }
00616
00617 int ip2k_cgen_extract_operand
00618 PARAMS ((CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00619 CGEN_FIELDS *, bfd_vma));
00620
00621
00622
00623
00624
00625
00626
00627
00628
00629
00630
00631
00632
00633
00634
00635
00636 int
00637 ip2k_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
00638 CGEN_CPU_DESC cd;
00639 int opindex;
00640 CGEN_EXTRACT_INFO *ex_info;
00641 CGEN_INSN_INT insn_value;
00642 CGEN_FIELDS * fields;
00643 bfd_vma pc;
00644 {
00645
00646 int length = 1;
00647 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00648
00649 switch (opindex)
00650 {
00651 case IP2K_OPERAND_ADDR16CJP :
00652 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 12, 13, 16, total_length, pc, & fields->f_addr16cjp);
00653 break;
00654 case IP2K_OPERAND_ADDR16H :
00655 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 8, 16, total_length, pc, & fields->f_imm8);
00656 break;
00657 case IP2K_OPERAND_ADDR16L :
00658 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 8, 16, total_length, pc, & fields->f_imm8);
00659 break;
00660 case IP2K_OPERAND_ADDR16P :
00661 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 16, total_length, pc, & fields->f_page3);
00662 break;
00663 case IP2K_OPERAND_BITNO :
00664 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 3, 16, total_length, pc, & fields->f_bitno);
00665 break;
00666 case IP2K_OPERAND_CBIT :
00667 break;
00668 case IP2K_OPERAND_DCBIT :
00669 break;
00670 case IP2K_OPERAND_FR :
00671 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_ABS_ADDR), 0, 8, 9, 16, total_length, pc, & fields->f_reg);
00672 break;
00673 case IP2K_OPERAND_LIT8 :
00674 length = extract_normal (cd, ex_info, insn_value, 0, 0, 7, 8, 16, total_length, pc, & fields->f_imm8);
00675 break;
00676 case IP2K_OPERAND_PABITS :
00677 break;
00678 case IP2K_OPERAND_RETI3 :
00679 length = extract_normal (cd, ex_info, insn_value, 0, 0, 2, 3, 16, total_length, pc, & fields->f_reti3);
00680 break;
00681 case IP2K_OPERAND_ZBIT :
00682 break;
00683
00684 default :
00685
00686 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
00687 opindex);
00688 abort ();
00689 }
00690
00691 return length;
00692 }
00693
00694 cgen_insert_fn * const ip2k_cgen_insert_handlers[] =
00695 {
00696 insert_insn_normal,
00697 };
00698
00699 cgen_extract_fn * const ip2k_cgen_extract_handlers[] =
00700 {
00701 extract_insn_normal,
00702 };
00703
00704 int ip2k_cgen_get_int_operand
00705 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00706 bfd_vma ip2k_cgen_get_vma_operand
00707 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00708
00709
00710
00711
00712
00713
00714 int
00715 ip2k_cgen_get_int_operand (cd, opindex, fields)
00716 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00717 int opindex;
00718 const CGEN_FIELDS * fields;
00719 {
00720 int value;
00721
00722 switch (opindex)
00723 {
00724 case IP2K_OPERAND_ADDR16CJP :
00725 value = fields->f_addr16cjp;
00726 break;
00727 case IP2K_OPERAND_ADDR16H :
00728 value = fields->f_imm8;
00729 break;
00730 case IP2K_OPERAND_ADDR16L :
00731 value = fields->f_imm8;
00732 break;
00733 case IP2K_OPERAND_ADDR16P :
00734 value = fields->f_page3;
00735 break;
00736 case IP2K_OPERAND_BITNO :
00737 value = fields->f_bitno;
00738 break;
00739 case IP2K_OPERAND_CBIT :
00740 value = 0;
00741 break;
00742 case IP2K_OPERAND_DCBIT :
00743 value = 0;
00744 break;
00745 case IP2K_OPERAND_FR :
00746 value = fields->f_reg;
00747 break;
00748 case IP2K_OPERAND_LIT8 :
00749 value = fields->f_imm8;
00750 break;
00751 case IP2K_OPERAND_PABITS :
00752 value = 0;
00753 break;
00754 case IP2K_OPERAND_RETI3 :
00755 value = fields->f_reti3;
00756 break;
00757 case IP2K_OPERAND_ZBIT :
00758 value = 0;
00759 break;
00760
00761 default :
00762
00763 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
00764 opindex);
00765 abort ();
00766 }
00767
00768 return value;
00769 }
00770
00771 bfd_vma
00772 ip2k_cgen_get_vma_operand (cd, opindex, fields)
00773 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00774 int opindex;
00775 const CGEN_FIELDS * fields;
00776 {
00777 bfd_vma value;
00778
00779 switch (opindex)
00780 {
00781 case IP2K_OPERAND_ADDR16CJP :
00782 value = fields->f_addr16cjp;
00783 break;
00784 case IP2K_OPERAND_ADDR16H :
00785 value = fields->f_imm8;
00786 break;
00787 case IP2K_OPERAND_ADDR16L :
00788 value = fields->f_imm8;
00789 break;
00790 case IP2K_OPERAND_ADDR16P :
00791 value = fields->f_page3;
00792 break;
00793 case IP2K_OPERAND_BITNO :
00794 value = fields->f_bitno;
00795 break;
00796 case IP2K_OPERAND_CBIT :
00797 value = 0;
00798 break;
00799 case IP2K_OPERAND_DCBIT :
00800 value = 0;
00801 break;
00802 case IP2K_OPERAND_FR :
00803 value = fields->f_reg;
00804 break;
00805 case IP2K_OPERAND_LIT8 :
00806 value = fields->f_imm8;
00807 break;
00808 case IP2K_OPERAND_PABITS :
00809 value = 0;
00810 break;
00811 case IP2K_OPERAND_RETI3 :
00812 value = fields->f_reti3;
00813 break;
00814 case IP2K_OPERAND_ZBIT :
00815 value = 0;
00816 break;
00817
00818 default :
00819
00820 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
00821 opindex);
00822 abort ();
00823 }
00824
00825 return value;
00826 }
00827
00828 void ip2k_cgen_set_int_operand
00829 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, int));
00830 void ip2k_cgen_set_vma_operand
00831 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma));
00832
00833
00834
00835
00836
00837
00838 void
00839 ip2k_cgen_set_int_operand (cd, opindex, fields, value)
00840 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00841 int opindex;
00842 CGEN_FIELDS * fields;
00843 int value;
00844 {
00845 switch (opindex)
00846 {
00847 case IP2K_OPERAND_ADDR16CJP :
00848 fields->f_addr16cjp = value;
00849 break;
00850 case IP2K_OPERAND_ADDR16H :
00851 fields->f_imm8 = value;
00852 break;
00853 case IP2K_OPERAND_ADDR16L :
00854 fields->f_imm8 = value;
00855 break;
00856 case IP2K_OPERAND_ADDR16P :
00857 fields->f_page3 = value;
00858 break;
00859 case IP2K_OPERAND_BITNO :
00860 fields->f_bitno = value;
00861 break;
00862 case IP2K_OPERAND_CBIT :
00863 break;
00864 case IP2K_OPERAND_DCBIT :
00865 break;
00866 case IP2K_OPERAND_FR :
00867 fields->f_reg = value;
00868 break;
00869 case IP2K_OPERAND_LIT8 :
00870 fields->f_imm8 = value;
00871 break;
00872 case IP2K_OPERAND_PABITS :
00873 break;
00874 case IP2K_OPERAND_RETI3 :
00875 fields->f_reti3 = value;
00876 break;
00877 case IP2K_OPERAND_ZBIT :
00878 break;
00879
00880 default :
00881
00882 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
00883 opindex);
00884 abort ();
00885 }
00886 }
00887
00888 void
00889 ip2k_cgen_set_vma_operand (cd, opindex, fields, value)
00890 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00891 int opindex;
00892 CGEN_FIELDS * fields;
00893 bfd_vma value;
00894 {
00895 switch (opindex)
00896 {
00897 case IP2K_OPERAND_ADDR16CJP :
00898 fields->f_addr16cjp = value;
00899 break;
00900 case IP2K_OPERAND_ADDR16H :
00901 fields->f_imm8 = value;
00902 break;
00903 case IP2K_OPERAND_ADDR16L :
00904 fields->f_imm8 = value;
00905 break;
00906 case IP2K_OPERAND_ADDR16P :
00907 fields->f_page3 = value;
00908 break;
00909 case IP2K_OPERAND_BITNO :
00910 fields->f_bitno = value;
00911 break;
00912 case IP2K_OPERAND_CBIT :
00913 break;
00914 case IP2K_OPERAND_DCBIT :
00915 break;
00916 case IP2K_OPERAND_FR :
00917 fields->f_reg = value;
00918 break;
00919 case IP2K_OPERAND_LIT8 :
00920 fields->f_imm8 = value;
00921 break;
00922 case IP2K_OPERAND_PABITS :
00923 break;
00924 case IP2K_OPERAND_RETI3 :
00925 fields->f_reti3 = value;
00926 break;
00927 case IP2K_OPERAND_ZBIT :
00928 break;
00929
00930 default :
00931
00932 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
00933 opindex);
00934 abort ();
00935 }
00936 }
00937
00938
00939
00940 void
00941 ip2k_cgen_init_ibld_table (cd)
00942 CGEN_CPU_DESC cd;
00943 {
00944 cd->insert_handlers = & ip2k_cgen_insert_handlers[0];
00945 cd->extract_handlers = & ip2k_cgen_extract_handlers[0];
00946
00947 cd->insert_operand = ip2k_cgen_insert_operand;
00948 cd->extract_operand = ip2k_cgen_extract_operand;
00949
00950 cd->get_int_operand = ip2k_cgen_get_int_operand;
00951 cd->set_int_operand = ip2k_cgen_set_int_operand;
00952 cd->get_vma_operand = ip2k_cgen_get_vma_operand;
00953 cd->set_vma_operand = ip2k_cgen_set_vma_operand;
00954 }