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 "m32r-desc.h"
00034 #include "m32r-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 * m32r_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 m32r_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 M32R_OPERAND_ACC :
00575 errmsg = insert_normal (cd, fields->f_acc, 0, 0, 8, 1, 32, total_length, buffer);
00576 break;
00577 case M32R_OPERAND_ACCD :
00578 errmsg = insert_normal (cd, fields->f_accd, 0, 0, 4, 2, 32, total_length, buffer);
00579 break;
00580 case M32R_OPERAND_ACCS :
00581 errmsg = insert_normal (cd, fields->f_accs, 0, 0, 12, 2, 32, total_length, buffer);
00582 break;
00583 case M32R_OPERAND_DCR :
00584 errmsg = insert_normal (cd, fields->f_r1, 0, 0, 4, 4, 32, total_length, buffer);
00585 break;
00586 case M32R_OPERAND_DISP16 :
00587 {
00588 long value = fields->f_disp16;
00589 value = ((int) (((value) - (pc))) >> (2));
00590 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, buffer);
00591 }
00592 break;
00593 case M32R_OPERAND_DISP24 :
00594 {
00595 long value = fields->f_disp24;
00596 value = ((int) (((value) - (pc))) >> (2));
00597 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 24, 32, total_length, buffer);
00598 }
00599 break;
00600 case M32R_OPERAND_DISP8 :
00601 {
00602 long value = fields->f_disp8;
00603 value = ((int) (((value) - (((pc) & (-4))))) >> (2));
00604 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 8, 32, total_length, buffer);
00605 }
00606 break;
00607 case M32R_OPERAND_DR :
00608 errmsg = insert_normal (cd, fields->f_r1, 0, 0, 4, 4, 32, total_length, buffer);
00609 break;
00610 case M32R_OPERAND_HASH :
00611 break;
00612 case M32R_OPERAND_HI16 :
00613 errmsg = insert_normal (cd, fields->f_hi16, 0|(1<<CGEN_IFLD_SIGN_OPT), 0, 16, 16, 32, total_length, buffer);
00614 break;
00615 case M32R_OPERAND_IMM1 :
00616 {
00617 long value = fields->f_imm1;
00618 value = ((value) - (1));
00619 errmsg = insert_normal (cd, value, 0, 0, 15, 1, 32, total_length, buffer);
00620 }
00621 break;
00622 case M32R_OPERAND_SCR :
00623 errmsg = insert_normal (cd, fields->f_r2, 0, 0, 12, 4, 32, total_length, buffer);
00624 break;
00625 case M32R_OPERAND_SIMM16 :
00626 errmsg = insert_normal (cd, fields->f_simm16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
00627 break;
00628 case M32R_OPERAND_SIMM8 :
00629 errmsg = insert_normal (cd, fields->f_simm8, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, buffer);
00630 break;
00631 case M32R_OPERAND_SLO16 :
00632 errmsg = insert_normal (cd, fields->f_simm16, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, buffer);
00633 break;
00634 case M32R_OPERAND_SR :
00635 errmsg = insert_normal (cd, fields->f_r2, 0, 0, 12, 4, 32, total_length, buffer);
00636 break;
00637 case M32R_OPERAND_SRC1 :
00638 errmsg = insert_normal (cd, fields->f_r1, 0, 0, 4, 4, 32, total_length, buffer);
00639 break;
00640 case M32R_OPERAND_SRC2 :
00641 errmsg = insert_normal (cd, fields->f_r2, 0, 0, 12, 4, 32, total_length, buffer);
00642 break;
00643 case M32R_OPERAND_UIMM16 :
00644 errmsg = insert_normal (cd, fields->f_uimm16, 0, 0, 16, 16, 32, total_length, buffer);
00645 break;
00646 case M32R_OPERAND_UIMM24 :
00647 errmsg = insert_normal (cd, fields->f_uimm24, 0|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_ABS_ADDR), 0, 8, 24, 32, total_length, buffer);
00648 break;
00649 case M32R_OPERAND_UIMM3 :
00650 errmsg = insert_normal (cd, fields->f_uimm3, 0, 0, 5, 3, 32, total_length, buffer);
00651 break;
00652 case M32R_OPERAND_UIMM4 :
00653 errmsg = insert_normal (cd, fields->f_uimm4, 0, 0, 12, 4, 32, total_length, buffer);
00654 break;
00655 case M32R_OPERAND_UIMM5 :
00656 errmsg = insert_normal (cd, fields->f_uimm5, 0, 0, 11, 5, 32, total_length, buffer);
00657 break;
00658 case M32R_OPERAND_UIMM8 :
00659 errmsg = insert_normal (cd, fields->f_uimm8, 0, 0, 8, 8, 32, total_length, buffer);
00660 break;
00661 case M32R_OPERAND_ULO16 :
00662 errmsg = insert_normal (cd, fields->f_uimm16, 0, 0, 16, 16, 32, total_length, buffer);
00663 break;
00664
00665 default :
00666
00667 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
00668 opindex);
00669 abort ();
00670 }
00671
00672 return errmsg;
00673 }
00674
00675 int m32r_cgen_extract_operand
00676 PARAMS ((CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00677 CGEN_FIELDS *, bfd_vma));
00678
00679
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689
00690
00691
00692
00693
00694 int
00695 m32r_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
00696 CGEN_CPU_DESC cd;
00697 int opindex;
00698 CGEN_EXTRACT_INFO *ex_info;
00699 CGEN_INSN_INT insn_value;
00700 CGEN_FIELDS * fields;
00701 bfd_vma pc;
00702 {
00703
00704 int length = 1;
00705 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00706
00707 switch (opindex)
00708 {
00709 case M32R_OPERAND_ACC :
00710 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 1, 32, total_length, pc, & fields->f_acc);
00711 break;
00712 case M32R_OPERAND_ACCD :
00713 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 2, 32, total_length, pc, & fields->f_accd);
00714 break;
00715 case M32R_OPERAND_ACCS :
00716 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 2, 32, total_length, pc, & fields->f_accs);
00717 break;
00718 case M32R_OPERAND_DCR :
00719 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_r1);
00720 break;
00721 case M32R_OPERAND_DISP16 :
00722 {
00723 long value;
00724 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 16, 16, 32, total_length, pc, & value);
00725 value = ((((value) << (2))) + (pc));
00726 fields->f_disp16 = value;
00727 }
00728 break;
00729 case M32R_OPERAND_DISP24 :
00730 {
00731 long value;
00732 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 24, 32, total_length, pc, & value);
00733 value = ((((value) << (2))) + (pc));
00734 fields->f_disp24 = value;
00735 }
00736 break;
00737 case M32R_OPERAND_DISP8 :
00738 {
00739 long value;
00740 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 8, 8, 32, total_length, pc, & value);
00741 value = ((((value) << (2))) + (((pc) & (-4))));
00742 fields->f_disp8 = value;
00743 }
00744 break;
00745 case M32R_OPERAND_DR :
00746 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_r1);
00747 break;
00748 case M32R_OPERAND_HASH :
00749 break;
00750 case M32R_OPERAND_HI16 :
00751 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGN_OPT), 0, 16, 16, 32, total_length, pc, & fields->f_hi16);
00752 break;
00753 case M32R_OPERAND_IMM1 :
00754 {
00755 long value;
00756 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 1, 32, total_length, pc, & value);
00757 value = ((value) + (1));
00758 fields->f_imm1 = value;
00759 }
00760 break;
00761 case M32R_OPERAND_SCR :
00762 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_r2);
00763 break;
00764 case M32R_OPERAND_SIMM16 :
00765 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_simm16);
00766 break;
00767 case M32R_OPERAND_SIMM8 :
00768 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 8, 8, 32, total_length, pc, & fields->f_simm8);
00769 break;
00770 case M32R_OPERAND_SLO16 :
00771 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 16, 16, 32, total_length, pc, & fields->f_simm16);
00772 break;
00773 case M32R_OPERAND_SR :
00774 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_r2);
00775 break;
00776 case M32R_OPERAND_SRC1 :
00777 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 4, 32, total_length, pc, & fields->f_r1);
00778 break;
00779 case M32R_OPERAND_SRC2 :
00780 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_r2);
00781 break;
00782 case M32R_OPERAND_UIMM16 :
00783 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_uimm16);
00784 break;
00785 case M32R_OPERAND_UIMM24 :
00786 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_RELOC)|(1<<CGEN_IFLD_ABS_ADDR), 0, 8, 24, 32, total_length, pc, & fields->f_uimm24);
00787 break;
00788 case M32R_OPERAND_UIMM3 :
00789 length = extract_normal (cd, ex_info, insn_value, 0, 0, 5, 3, 32, total_length, pc, & fields->f_uimm3);
00790 break;
00791 case M32R_OPERAND_UIMM4 :
00792 length = extract_normal (cd, ex_info, insn_value, 0, 0, 12, 4, 32, total_length, pc, & fields->f_uimm4);
00793 break;
00794 case M32R_OPERAND_UIMM5 :
00795 length = extract_normal (cd, ex_info, insn_value, 0, 0, 11, 5, 32, total_length, pc, & fields->f_uimm5);
00796 break;
00797 case M32R_OPERAND_UIMM8 :
00798 length = extract_normal (cd, ex_info, insn_value, 0, 0, 8, 8, 32, total_length, pc, & fields->f_uimm8);
00799 break;
00800 case M32R_OPERAND_ULO16 :
00801 length = extract_normal (cd, ex_info, insn_value, 0, 0, 16, 16, 32, total_length, pc, & fields->f_uimm16);
00802 break;
00803
00804 default :
00805
00806 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
00807 opindex);
00808 abort ();
00809 }
00810
00811 return length;
00812 }
00813
00814 cgen_insert_fn * const m32r_cgen_insert_handlers[] =
00815 {
00816 insert_insn_normal,
00817 };
00818
00819 cgen_extract_fn * const m32r_cgen_extract_handlers[] =
00820 {
00821 extract_insn_normal,
00822 };
00823
00824 int m32r_cgen_get_int_operand
00825 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00826 bfd_vma m32r_cgen_get_vma_operand
00827 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00828
00829
00830
00831
00832
00833
00834 int
00835 m32r_cgen_get_int_operand (cd, opindex, fields)
00836 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00837 int opindex;
00838 const CGEN_FIELDS * fields;
00839 {
00840 int value;
00841
00842 switch (opindex)
00843 {
00844 case M32R_OPERAND_ACC :
00845 value = fields->f_acc;
00846 break;
00847 case M32R_OPERAND_ACCD :
00848 value = fields->f_accd;
00849 break;
00850 case M32R_OPERAND_ACCS :
00851 value = fields->f_accs;
00852 break;
00853 case M32R_OPERAND_DCR :
00854 value = fields->f_r1;
00855 break;
00856 case M32R_OPERAND_DISP16 :
00857 value = fields->f_disp16;
00858 break;
00859 case M32R_OPERAND_DISP24 :
00860 value = fields->f_disp24;
00861 break;
00862 case M32R_OPERAND_DISP8 :
00863 value = fields->f_disp8;
00864 break;
00865 case M32R_OPERAND_DR :
00866 value = fields->f_r1;
00867 break;
00868 case M32R_OPERAND_HASH :
00869 value = 0;
00870 break;
00871 case M32R_OPERAND_HI16 :
00872 value = fields->f_hi16;
00873 break;
00874 case M32R_OPERAND_IMM1 :
00875 value = fields->f_imm1;
00876 break;
00877 case M32R_OPERAND_SCR :
00878 value = fields->f_r2;
00879 break;
00880 case M32R_OPERAND_SIMM16 :
00881 value = fields->f_simm16;
00882 break;
00883 case M32R_OPERAND_SIMM8 :
00884 value = fields->f_simm8;
00885 break;
00886 case M32R_OPERAND_SLO16 :
00887 value = fields->f_simm16;
00888 break;
00889 case M32R_OPERAND_SR :
00890 value = fields->f_r2;
00891 break;
00892 case M32R_OPERAND_SRC1 :
00893 value = fields->f_r1;
00894 break;
00895 case M32R_OPERAND_SRC2 :
00896 value = fields->f_r2;
00897 break;
00898 case M32R_OPERAND_UIMM16 :
00899 value = fields->f_uimm16;
00900 break;
00901 case M32R_OPERAND_UIMM24 :
00902 value = fields->f_uimm24;
00903 break;
00904 case M32R_OPERAND_UIMM3 :
00905 value = fields->f_uimm3;
00906 break;
00907 case M32R_OPERAND_UIMM4 :
00908 value = fields->f_uimm4;
00909 break;
00910 case M32R_OPERAND_UIMM5 :
00911 value = fields->f_uimm5;
00912 break;
00913 case M32R_OPERAND_UIMM8 :
00914 value = fields->f_uimm8;
00915 break;
00916 case M32R_OPERAND_ULO16 :
00917 value = fields->f_uimm16;
00918 break;
00919
00920 default :
00921
00922 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
00923 opindex);
00924 abort ();
00925 }
00926
00927 return value;
00928 }
00929
00930 bfd_vma
00931 m32r_cgen_get_vma_operand (cd, opindex, fields)
00932 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00933 int opindex;
00934 const CGEN_FIELDS * fields;
00935 {
00936 bfd_vma value;
00937
00938 switch (opindex)
00939 {
00940 case M32R_OPERAND_ACC :
00941 value = fields->f_acc;
00942 break;
00943 case M32R_OPERAND_ACCD :
00944 value = fields->f_accd;
00945 break;
00946 case M32R_OPERAND_ACCS :
00947 value = fields->f_accs;
00948 break;
00949 case M32R_OPERAND_DCR :
00950 value = fields->f_r1;
00951 break;
00952 case M32R_OPERAND_DISP16 :
00953 value = fields->f_disp16;
00954 break;
00955 case M32R_OPERAND_DISP24 :
00956 value = fields->f_disp24;
00957 break;
00958 case M32R_OPERAND_DISP8 :
00959 value = fields->f_disp8;
00960 break;
00961 case M32R_OPERAND_DR :
00962 value = fields->f_r1;
00963 break;
00964 case M32R_OPERAND_HASH :
00965 value = 0;
00966 break;
00967 case M32R_OPERAND_HI16 :
00968 value = fields->f_hi16;
00969 break;
00970 case M32R_OPERAND_IMM1 :
00971 value = fields->f_imm1;
00972 break;
00973 case M32R_OPERAND_SCR :
00974 value = fields->f_r2;
00975 break;
00976 case M32R_OPERAND_SIMM16 :
00977 value = fields->f_simm16;
00978 break;
00979 case M32R_OPERAND_SIMM8 :
00980 value = fields->f_simm8;
00981 break;
00982 case M32R_OPERAND_SLO16 :
00983 value = fields->f_simm16;
00984 break;
00985 case M32R_OPERAND_SR :
00986 value = fields->f_r2;
00987 break;
00988 case M32R_OPERAND_SRC1 :
00989 value = fields->f_r1;
00990 break;
00991 case M32R_OPERAND_SRC2 :
00992 value = fields->f_r2;
00993 break;
00994 case M32R_OPERAND_UIMM16 :
00995 value = fields->f_uimm16;
00996 break;
00997 case M32R_OPERAND_UIMM24 :
00998 value = fields->f_uimm24;
00999 break;
01000 case M32R_OPERAND_UIMM3 :
01001 value = fields->f_uimm3;
01002 break;
01003 case M32R_OPERAND_UIMM4 :
01004 value = fields->f_uimm4;
01005 break;
01006 case M32R_OPERAND_UIMM5 :
01007 value = fields->f_uimm5;
01008 break;
01009 case M32R_OPERAND_UIMM8 :
01010 value = fields->f_uimm8;
01011 break;
01012 case M32R_OPERAND_ULO16 :
01013 value = fields->f_uimm16;
01014 break;
01015
01016 default :
01017
01018 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
01019 opindex);
01020 abort ();
01021 }
01022
01023 return value;
01024 }
01025
01026 void m32r_cgen_set_int_operand
01027 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, int));
01028 void m32r_cgen_set_vma_operand
01029 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma));
01030
01031
01032
01033
01034
01035
01036 void
01037 m32r_cgen_set_int_operand (cd, opindex, fields, value)
01038 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01039 int opindex;
01040 CGEN_FIELDS * fields;
01041 int value;
01042 {
01043 switch (opindex)
01044 {
01045 case M32R_OPERAND_ACC :
01046 fields->f_acc = value;
01047 break;
01048 case M32R_OPERAND_ACCD :
01049 fields->f_accd = value;
01050 break;
01051 case M32R_OPERAND_ACCS :
01052 fields->f_accs = value;
01053 break;
01054 case M32R_OPERAND_DCR :
01055 fields->f_r1 = value;
01056 break;
01057 case M32R_OPERAND_DISP16 :
01058 fields->f_disp16 = value;
01059 break;
01060 case M32R_OPERAND_DISP24 :
01061 fields->f_disp24 = value;
01062 break;
01063 case M32R_OPERAND_DISP8 :
01064 fields->f_disp8 = value;
01065 break;
01066 case M32R_OPERAND_DR :
01067 fields->f_r1 = value;
01068 break;
01069 case M32R_OPERAND_HASH :
01070 break;
01071 case M32R_OPERAND_HI16 :
01072 fields->f_hi16 = value;
01073 break;
01074 case M32R_OPERAND_IMM1 :
01075 fields->f_imm1 = value;
01076 break;
01077 case M32R_OPERAND_SCR :
01078 fields->f_r2 = value;
01079 break;
01080 case M32R_OPERAND_SIMM16 :
01081 fields->f_simm16 = value;
01082 break;
01083 case M32R_OPERAND_SIMM8 :
01084 fields->f_simm8 = value;
01085 break;
01086 case M32R_OPERAND_SLO16 :
01087 fields->f_simm16 = value;
01088 break;
01089 case M32R_OPERAND_SR :
01090 fields->f_r2 = value;
01091 break;
01092 case M32R_OPERAND_SRC1 :
01093 fields->f_r1 = value;
01094 break;
01095 case M32R_OPERAND_SRC2 :
01096 fields->f_r2 = value;
01097 break;
01098 case M32R_OPERAND_UIMM16 :
01099 fields->f_uimm16 = value;
01100 break;
01101 case M32R_OPERAND_UIMM24 :
01102 fields->f_uimm24 = value;
01103 break;
01104 case M32R_OPERAND_UIMM3 :
01105 fields->f_uimm3 = value;
01106 break;
01107 case M32R_OPERAND_UIMM4 :
01108 fields->f_uimm4 = value;
01109 break;
01110 case M32R_OPERAND_UIMM5 :
01111 fields->f_uimm5 = value;
01112 break;
01113 case M32R_OPERAND_UIMM8 :
01114 fields->f_uimm8 = value;
01115 break;
01116 case M32R_OPERAND_ULO16 :
01117 fields->f_uimm16 = value;
01118 break;
01119
01120 default :
01121
01122 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
01123 opindex);
01124 abort ();
01125 }
01126 }
01127
01128 void
01129 m32r_cgen_set_vma_operand (cd, opindex, fields, value)
01130 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
01131 int opindex;
01132 CGEN_FIELDS * fields;
01133 bfd_vma value;
01134 {
01135 switch (opindex)
01136 {
01137 case M32R_OPERAND_ACC :
01138 fields->f_acc = value;
01139 break;
01140 case M32R_OPERAND_ACCD :
01141 fields->f_accd = value;
01142 break;
01143 case M32R_OPERAND_ACCS :
01144 fields->f_accs = value;
01145 break;
01146 case M32R_OPERAND_DCR :
01147 fields->f_r1 = value;
01148 break;
01149 case M32R_OPERAND_DISP16 :
01150 fields->f_disp16 = value;
01151 break;
01152 case M32R_OPERAND_DISP24 :
01153 fields->f_disp24 = value;
01154 break;
01155 case M32R_OPERAND_DISP8 :
01156 fields->f_disp8 = value;
01157 break;
01158 case M32R_OPERAND_DR :
01159 fields->f_r1 = value;
01160 break;
01161 case M32R_OPERAND_HASH :
01162 break;
01163 case M32R_OPERAND_HI16 :
01164 fields->f_hi16 = value;
01165 break;
01166 case M32R_OPERAND_IMM1 :
01167 fields->f_imm1 = value;
01168 break;
01169 case M32R_OPERAND_SCR :
01170 fields->f_r2 = value;
01171 break;
01172 case M32R_OPERAND_SIMM16 :
01173 fields->f_simm16 = value;
01174 break;
01175 case M32R_OPERAND_SIMM8 :
01176 fields->f_simm8 = value;
01177 break;
01178 case M32R_OPERAND_SLO16 :
01179 fields->f_simm16 = value;
01180 break;
01181 case M32R_OPERAND_SR :
01182 fields->f_r2 = value;
01183 break;
01184 case M32R_OPERAND_SRC1 :
01185 fields->f_r1 = value;
01186 break;
01187 case M32R_OPERAND_SRC2 :
01188 fields->f_r2 = value;
01189 break;
01190 case M32R_OPERAND_UIMM16 :
01191 fields->f_uimm16 = value;
01192 break;
01193 case M32R_OPERAND_UIMM24 :
01194 fields->f_uimm24 = value;
01195 break;
01196 case M32R_OPERAND_UIMM3 :
01197 fields->f_uimm3 = value;
01198 break;
01199 case M32R_OPERAND_UIMM4 :
01200 fields->f_uimm4 = value;
01201 break;
01202 case M32R_OPERAND_UIMM5 :
01203 fields->f_uimm5 = value;
01204 break;
01205 case M32R_OPERAND_UIMM8 :
01206 fields->f_uimm8 = value;
01207 break;
01208 case M32R_OPERAND_ULO16 :
01209 fields->f_uimm16 = value;
01210 break;
01211
01212 default :
01213
01214 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
01215 opindex);
01216 abort ();
01217 }
01218 }
01219
01220
01221
01222 void
01223 m32r_cgen_init_ibld_table (cd)
01224 CGEN_CPU_DESC cd;
01225 {
01226 cd->insert_handlers = & m32r_cgen_insert_handlers[0];
01227 cd->extract_handlers = & m32r_cgen_extract_handlers[0];
01228
01229 cd->insert_operand = m32r_cgen_insert_operand;
01230 cd->extract_operand = m32r_cgen_extract_operand;
01231
01232 cd->get_int_operand = m32r_cgen_get_int_operand;
01233 cd->set_int_operand = m32r_cgen_set_int_operand;
01234 cd->get_vma_operand = m32r_cgen_get_vma_operand;
01235 cd->set_vma_operand = m32r_cgen_set_vma_operand;
01236 }