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 "openrisc-desc.h"
00034 #include "openrisc-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 * openrisc_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 openrisc_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 OPENRISC_OPERAND_ABS_26 :
00575 {
00576 long value = fields->f_abs26;
00577 value = ((unsigned int) (pc) >> (2));
00578 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_ABS_ADDR), 0, 25, 26, 32, total_length, buffer);
00579 }
00580 break;
00581 case OPENRISC_OPERAND_DISP_26 :
00582 {
00583 long value = fields->f_disp26;
00584 value = ((int) (((value) - (pc))) >> (2));
00585 errmsg = insert_normal (cd, value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 25, 26, 32, total_length, buffer);
00586 }
00587 break;
00588 case OPENRISC_OPERAND_HI16 :
00589 errmsg = insert_normal (cd, fields->f_simm16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
00590 break;
00591 case OPENRISC_OPERAND_LO16 :
00592 errmsg = insert_normal (cd, fields->f_lo16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
00593 break;
00594 case OPENRISC_OPERAND_OP_F_23 :
00595 errmsg = insert_normal (cd, fields->f_op4, 0, 0, 23, 3, 32, total_length, buffer);
00596 break;
00597 case OPENRISC_OPERAND_OP_F_3 :
00598 errmsg = insert_normal (cd, fields->f_op5, 0, 0, 25, 5, 32, total_length, buffer);
00599 break;
00600 case OPENRISC_OPERAND_RA :
00601 errmsg = insert_normal (cd, fields->f_r2, 0, 0, 20, 5, 32, total_length, buffer);
00602 break;
00603 case OPENRISC_OPERAND_RB :
00604 errmsg = insert_normal (cd, fields->f_r3, 0, 0, 15, 5, 32, total_length, buffer);
00605 break;
00606 case OPENRISC_OPERAND_RD :
00607 errmsg = insert_normal (cd, fields->f_r1, 0, 0, 25, 5, 32, total_length, buffer);
00608 break;
00609 case OPENRISC_OPERAND_SIMM_16 :
00610 errmsg = insert_normal (cd, fields->f_simm16, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, buffer);
00611 break;
00612 case OPENRISC_OPERAND_UI16NC :
00613 {
00614 {
00615 FLD (f_i16_2) = ((((unsigned int) (FLD (f_i16nc)) >> (11))) & (31));
00616 FLD (f_i16_1) = ((FLD (f_i16nc)) & (2047));
00617 }
00618 errmsg = insert_normal (cd, fields->f_i16_1, 0, 0, 10, 11, 32, total_length, buffer);
00619 if (errmsg)
00620 break;
00621 errmsg = insert_normal (cd, fields->f_i16_2, 0, 0, 25, 5, 32, total_length, buffer);
00622 if (errmsg)
00623 break;
00624 }
00625 break;
00626 case OPENRISC_OPERAND_UIMM_16 :
00627 errmsg = insert_normal (cd, fields->f_uimm16, 0, 0, 15, 16, 32, total_length, buffer);
00628 break;
00629 case OPENRISC_OPERAND_UIMM_5 :
00630 errmsg = insert_normal (cd, fields->f_uimm5, 0, 0, 4, 5, 32, total_length, buffer);
00631 break;
00632
00633 default :
00634
00635 fprintf (stderr, _("Unrecognized field %d while building insn.\n"),
00636 opindex);
00637 abort ();
00638 }
00639
00640 return errmsg;
00641 }
00642
00643 int openrisc_cgen_extract_operand
00644 PARAMS ((CGEN_CPU_DESC, int, CGEN_EXTRACT_INFO *, CGEN_INSN_INT,
00645 CGEN_FIELDS *, bfd_vma));
00646
00647
00648
00649
00650
00651
00652
00653
00654
00655
00656
00657
00658
00659
00660
00661
00662 int
00663 openrisc_cgen_extract_operand (cd, opindex, ex_info, insn_value, fields, pc)
00664 CGEN_CPU_DESC cd;
00665 int opindex;
00666 CGEN_EXTRACT_INFO *ex_info;
00667 CGEN_INSN_INT insn_value;
00668 CGEN_FIELDS * fields;
00669 bfd_vma pc;
00670 {
00671
00672 int length = 1;
00673 unsigned int total_length = CGEN_FIELDS_BITSIZE (fields);
00674
00675 switch (opindex)
00676 {
00677 case OPENRISC_OPERAND_ABS_26 :
00678 {
00679 long value;
00680 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_ABS_ADDR), 0, 25, 26, 32, total_length, pc, & value);
00681 value = ((value) << (2));
00682 fields->f_abs26 = value;
00683 }
00684 break;
00685 case OPENRISC_OPERAND_DISP_26 :
00686 {
00687 long value;
00688 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED)|(1<<CGEN_IFLD_PCREL_ADDR), 0, 25, 26, 32, total_length, pc, & value);
00689 value = ((((value) << (2))) + (pc));
00690 fields->f_disp26 = value;
00691 }
00692 break;
00693 case OPENRISC_OPERAND_HI16 :
00694 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_simm16);
00695 break;
00696 case OPENRISC_OPERAND_LO16 :
00697 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_lo16);
00698 break;
00699 case OPENRISC_OPERAND_OP_F_23 :
00700 length = extract_normal (cd, ex_info, insn_value, 0, 0, 23, 3, 32, total_length, pc, & fields->f_op4);
00701 break;
00702 case OPENRISC_OPERAND_OP_F_3 :
00703 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 5, 32, total_length, pc, & fields->f_op5);
00704 break;
00705 case OPENRISC_OPERAND_RA :
00706 length = extract_normal (cd, ex_info, insn_value, 0, 0, 20, 5, 32, total_length, pc, & fields->f_r2);
00707 break;
00708 case OPENRISC_OPERAND_RB :
00709 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 5, 32, total_length, pc, & fields->f_r3);
00710 break;
00711 case OPENRISC_OPERAND_RD :
00712 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 5, 32, total_length, pc, & fields->f_r1);
00713 break;
00714 case OPENRISC_OPERAND_SIMM_16 :
00715 length = extract_normal (cd, ex_info, insn_value, 0|(1<<CGEN_IFLD_SIGNED), 0, 15, 16, 32, total_length, pc, & fields->f_simm16);
00716 break;
00717 case OPENRISC_OPERAND_UI16NC :
00718 {
00719 length = extract_normal (cd, ex_info, insn_value, 0, 0, 10, 11, 32, total_length, pc, & fields->f_i16_1);
00720 if (length <= 0) break;
00721 length = extract_normal (cd, ex_info, insn_value, 0, 0, 25, 5, 32, total_length, pc, & fields->f_i16_2);
00722 if (length <= 0) break;
00723 {
00724 FLD (f_i16nc) = openrisc_sign_extend_16bit (((((FLD (f_i16_2)) << (11))) | (FLD (f_i16_1))));
00725 }
00726 }
00727 break;
00728 case OPENRISC_OPERAND_UIMM_16 :
00729 length = extract_normal (cd, ex_info, insn_value, 0, 0, 15, 16, 32, total_length, pc, & fields->f_uimm16);
00730 break;
00731 case OPENRISC_OPERAND_UIMM_5 :
00732 length = extract_normal (cd, ex_info, insn_value, 0, 0, 4, 5, 32, total_length, pc, & fields->f_uimm5);
00733 break;
00734
00735 default :
00736
00737 fprintf (stderr, _("Unrecognized field %d while decoding insn.\n"),
00738 opindex);
00739 abort ();
00740 }
00741
00742 return length;
00743 }
00744
00745 cgen_insert_fn * const openrisc_cgen_insert_handlers[] =
00746 {
00747 insert_insn_normal,
00748 };
00749
00750 cgen_extract_fn * const openrisc_cgen_extract_handlers[] =
00751 {
00752 extract_insn_normal,
00753 };
00754
00755 int openrisc_cgen_get_int_operand
00756 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00757 bfd_vma openrisc_cgen_get_vma_operand
00758 PARAMS ((CGEN_CPU_DESC, int, const CGEN_FIELDS *));
00759
00760
00761
00762
00763
00764
00765 int
00766 openrisc_cgen_get_int_operand (cd, opindex, fields)
00767 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00768 int opindex;
00769 const CGEN_FIELDS * fields;
00770 {
00771 int value;
00772
00773 switch (opindex)
00774 {
00775 case OPENRISC_OPERAND_ABS_26 :
00776 value = fields->f_abs26;
00777 break;
00778 case OPENRISC_OPERAND_DISP_26 :
00779 value = fields->f_disp26;
00780 break;
00781 case OPENRISC_OPERAND_HI16 :
00782 value = fields->f_simm16;
00783 break;
00784 case OPENRISC_OPERAND_LO16 :
00785 value = fields->f_lo16;
00786 break;
00787 case OPENRISC_OPERAND_OP_F_23 :
00788 value = fields->f_op4;
00789 break;
00790 case OPENRISC_OPERAND_OP_F_3 :
00791 value = fields->f_op5;
00792 break;
00793 case OPENRISC_OPERAND_RA :
00794 value = fields->f_r2;
00795 break;
00796 case OPENRISC_OPERAND_RB :
00797 value = fields->f_r3;
00798 break;
00799 case OPENRISC_OPERAND_RD :
00800 value = fields->f_r1;
00801 break;
00802 case OPENRISC_OPERAND_SIMM_16 :
00803 value = fields->f_simm16;
00804 break;
00805 case OPENRISC_OPERAND_UI16NC :
00806 value = fields->f_i16nc;
00807 break;
00808 case OPENRISC_OPERAND_UIMM_16 :
00809 value = fields->f_uimm16;
00810 break;
00811 case OPENRISC_OPERAND_UIMM_5 :
00812 value = fields->f_uimm5;
00813 break;
00814
00815 default :
00816
00817 fprintf (stderr, _("Unrecognized field %d while getting int operand.\n"),
00818 opindex);
00819 abort ();
00820 }
00821
00822 return value;
00823 }
00824
00825 bfd_vma
00826 openrisc_cgen_get_vma_operand (cd, opindex, fields)
00827 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00828 int opindex;
00829 const CGEN_FIELDS * fields;
00830 {
00831 bfd_vma value;
00832
00833 switch (opindex)
00834 {
00835 case OPENRISC_OPERAND_ABS_26 :
00836 value = fields->f_abs26;
00837 break;
00838 case OPENRISC_OPERAND_DISP_26 :
00839 value = fields->f_disp26;
00840 break;
00841 case OPENRISC_OPERAND_HI16 :
00842 value = fields->f_simm16;
00843 break;
00844 case OPENRISC_OPERAND_LO16 :
00845 value = fields->f_lo16;
00846 break;
00847 case OPENRISC_OPERAND_OP_F_23 :
00848 value = fields->f_op4;
00849 break;
00850 case OPENRISC_OPERAND_OP_F_3 :
00851 value = fields->f_op5;
00852 break;
00853 case OPENRISC_OPERAND_RA :
00854 value = fields->f_r2;
00855 break;
00856 case OPENRISC_OPERAND_RB :
00857 value = fields->f_r3;
00858 break;
00859 case OPENRISC_OPERAND_RD :
00860 value = fields->f_r1;
00861 break;
00862 case OPENRISC_OPERAND_SIMM_16 :
00863 value = fields->f_simm16;
00864 break;
00865 case OPENRISC_OPERAND_UI16NC :
00866 value = fields->f_i16nc;
00867 break;
00868 case OPENRISC_OPERAND_UIMM_16 :
00869 value = fields->f_uimm16;
00870 break;
00871 case OPENRISC_OPERAND_UIMM_5 :
00872 value = fields->f_uimm5;
00873 break;
00874
00875 default :
00876
00877 fprintf (stderr, _("Unrecognized field %d while getting vma operand.\n"),
00878 opindex);
00879 abort ();
00880 }
00881
00882 return value;
00883 }
00884
00885 void openrisc_cgen_set_int_operand
00886 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, int));
00887 void openrisc_cgen_set_vma_operand
00888 PARAMS ((CGEN_CPU_DESC, int, CGEN_FIELDS *, bfd_vma));
00889
00890
00891
00892
00893
00894
00895 void
00896 openrisc_cgen_set_int_operand (cd, opindex, fields, value)
00897 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00898 int opindex;
00899 CGEN_FIELDS * fields;
00900 int value;
00901 {
00902 switch (opindex)
00903 {
00904 case OPENRISC_OPERAND_ABS_26 :
00905 fields->f_abs26 = value;
00906 break;
00907 case OPENRISC_OPERAND_DISP_26 :
00908 fields->f_disp26 = value;
00909 break;
00910 case OPENRISC_OPERAND_HI16 :
00911 fields->f_simm16 = value;
00912 break;
00913 case OPENRISC_OPERAND_LO16 :
00914 fields->f_lo16 = value;
00915 break;
00916 case OPENRISC_OPERAND_OP_F_23 :
00917 fields->f_op4 = value;
00918 break;
00919 case OPENRISC_OPERAND_OP_F_3 :
00920 fields->f_op5 = value;
00921 break;
00922 case OPENRISC_OPERAND_RA :
00923 fields->f_r2 = value;
00924 break;
00925 case OPENRISC_OPERAND_RB :
00926 fields->f_r3 = value;
00927 break;
00928 case OPENRISC_OPERAND_RD :
00929 fields->f_r1 = value;
00930 break;
00931 case OPENRISC_OPERAND_SIMM_16 :
00932 fields->f_simm16 = value;
00933 break;
00934 case OPENRISC_OPERAND_UI16NC :
00935 fields->f_i16nc = value;
00936 break;
00937 case OPENRISC_OPERAND_UIMM_16 :
00938 fields->f_uimm16 = value;
00939 break;
00940 case OPENRISC_OPERAND_UIMM_5 :
00941 fields->f_uimm5 = value;
00942 break;
00943
00944 default :
00945
00946 fprintf (stderr, _("Unrecognized field %d while setting int operand.\n"),
00947 opindex);
00948 abort ();
00949 }
00950 }
00951
00952 void
00953 openrisc_cgen_set_vma_operand (cd, opindex, fields, value)
00954 CGEN_CPU_DESC cd ATTRIBUTE_UNUSED;
00955 int opindex;
00956 CGEN_FIELDS * fields;
00957 bfd_vma value;
00958 {
00959 switch (opindex)
00960 {
00961 case OPENRISC_OPERAND_ABS_26 :
00962 fields->f_abs26 = value;
00963 break;
00964 case OPENRISC_OPERAND_DISP_26 :
00965 fields->f_disp26 = value;
00966 break;
00967 case OPENRISC_OPERAND_HI16 :
00968 fields->f_simm16 = value;
00969 break;
00970 case OPENRISC_OPERAND_LO16 :
00971 fields->f_lo16 = value;
00972 break;
00973 case OPENRISC_OPERAND_OP_F_23 :
00974 fields->f_op4 = value;
00975 break;
00976 case OPENRISC_OPERAND_OP_F_3 :
00977 fields->f_op5 = value;
00978 break;
00979 case OPENRISC_OPERAND_RA :
00980 fields->f_r2 = value;
00981 break;
00982 case OPENRISC_OPERAND_RB :
00983 fields->f_r3 = value;
00984 break;
00985 case OPENRISC_OPERAND_RD :
00986 fields->f_r1 = value;
00987 break;
00988 case OPENRISC_OPERAND_SIMM_16 :
00989 fields->f_simm16 = value;
00990 break;
00991 case OPENRISC_OPERAND_UI16NC :
00992 fields->f_i16nc = value;
00993 break;
00994 case OPENRISC_OPERAND_UIMM_16 :
00995 fields->f_uimm16 = value;
00996 break;
00997 case OPENRISC_OPERAND_UIMM_5 :
00998 fields->f_uimm5 = value;
00999 break;
01000
01001 default :
01002
01003 fprintf (stderr, _("Unrecognized field %d while setting vma operand.\n"),
01004 opindex);
01005 abort ();
01006 }
01007 }
01008
01009
01010
01011 void
01012 openrisc_cgen_init_ibld_table (cd)
01013 CGEN_CPU_DESC cd;
01014 {
01015 cd->insert_handlers = & openrisc_cgen_insert_handlers[0];
01016 cd->extract_handlers = & openrisc_cgen_extract_handlers[0];
01017
01018 cd->insert_operand = openrisc_cgen_insert_operand;
01019 cd->extract_operand = openrisc_cgen_extract_operand;
01020
01021 cd->get_int_operand = openrisc_cgen_get_int_operand;
01022 cd->set_int_operand = openrisc_cgen_set_int_operand;
01023 cd->get_vma_operand = openrisc_cgen_get_vma_operand;
01024 cd->set_vma_operand = openrisc_cgen_set_vma_operand;
01025 }