00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <math.h>
00022 #include "libiberty.h"
00023 #include "dis-asm.h"
00024 #include "opcode/tic4x.h"
00025
00026 #define TIC4X_DEBUG 0
00027
00028 #define TIC4X_HASH_SIZE 11
00029 #define TIC4X_SPESOP_SIZE 8
00030
00031 typedef enum
00032 {
00033 IMMED_SINT,
00034 IMMED_SUINT,
00035 IMMED_SFLOAT,
00036 IMMED_INT,
00037 IMMED_UINT,
00038 IMMED_FLOAT
00039 }
00040 immed_t;
00041
00042 typedef enum
00043 {
00044 INDIRECT_SHORT,
00045 INDIRECT_LONG,
00046 INDIRECT_TIC4X
00047 }
00048 indirect_t;
00049
00050 static int tic4x_version = 0;
00051 static int tic4x_dp = 0;
00052
00053 static int tic4x_pc_offset
00054 PARAMS ((unsigned int));
00055 static int tic4x_print_char
00056 PARAMS ((struct disassemble_info *, char));
00057 static int tic4x_print_str
00058 PARAMS ((struct disassemble_info *, char *));
00059 static int tic4x_print_register
00060 PARAMS ((struct disassemble_info *, unsigned long));
00061 static int tic4x_print_addr
00062 PARAMS ((struct disassemble_info *, unsigned long));
00063 static int tic4x_print_relative
00064 PARAMS ((struct disassemble_info *, unsigned long, long, unsigned long));
00065 void tic4x_print_ftoa
00066 PARAMS ((unsigned int, FILE *, fprintf_ftype));
00067 static int tic4x_print_direct
00068 PARAMS ((struct disassemble_info *, unsigned long));
00069 static int tic4x_print_immed
00070 PARAMS ((struct disassemble_info *, immed_t, unsigned long));
00071 static int tic4x_print_cond
00072 PARAMS ((struct disassemble_info *, unsigned int));
00073 static int tic4x_print_indirect
00074 PARAMS ((struct disassemble_info *, indirect_t, unsigned long));
00075 static int tic4x_print_op
00076 PARAMS ((struct disassemble_info *, unsigned long, tic4x_inst_t *, unsigned long));
00077 static void tic4x_hash_opcode_special
00078 PARAMS ((tic4x_inst_t **, const tic4x_inst_t *));
00079 static void tic4x_hash_opcode
00080 PARAMS ((tic4x_inst_t **, tic4x_inst_t **, const tic4x_inst_t *, unsigned long));
00081 static int tic4x_disassemble
00082 PARAMS ((unsigned long, unsigned long, struct disassemble_info *));
00083 int print_insn_tic4x
00084 PARAMS ((bfd_vma, struct disassemble_info *));
00085
00086
00087 static int
00088 tic4x_pc_offset (op)
00089 unsigned int op;
00090 {
00091
00092
00093
00094 switch (op >> 24)
00095 {
00096 case 0x60:
00097 case 0x62:
00098 case 0x64:
00099 return 1;
00100 case 0x61:
00101 case 0x63:
00102 case 0x65:
00103 return 3;
00104 case 0x66:
00105 case 0x67:
00106 return 0;
00107 default:
00108 break;
00109 }
00110
00111 switch ((op & 0xffe00000) >> 20)
00112 {
00113 case 0x6a0:
00114 case 0x720:
00115 case 0x740:
00116 return 1;
00117
00118 case 0x6a2:
00119 case 0x6a6:
00120 case 0x6aa:
00121 case 0x722:
00122 case 0x748:
00123 case 0x798:
00124 return 3;
00125
00126 default:
00127 break;
00128 }
00129
00130 switch ((op & 0xfe200000) >> 20)
00131 {
00132 case 0x6e0:
00133 return 1;
00134
00135 case 0x6e2:
00136 return 3;
00137
00138 default:
00139 break;
00140 }
00141
00142 return 0;
00143 }
00144
00145 static int
00146 tic4x_print_char (info, ch)
00147 struct disassemble_info * info;
00148 char ch;
00149 {
00150 if (info != NULL)
00151 (*info->fprintf_func) (info->stream, "%c", ch);
00152 return 1;
00153 }
00154
00155 static int
00156 tic4x_print_str (info, str)
00157 struct disassemble_info *info;
00158 char *str;
00159 {
00160 if (info != NULL)
00161 (*info->fprintf_func) (info->stream, "%s", str);
00162 return 1;
00163 }
00164
00165 static int
00166 tic4x_print_register (info, regno)
00167 struct disassemble_info *info;
00168 unsigned long regno;
00169 {
00170 static tic4x_register_t **registertable = NULL;
00171 unsigned int i;
00172
00173 if (registertable == NULL)
00174 {
00175 registertable = (tic4x_register_t **)
00176 xmalloc (sizeof (tic4x_register_t *) * REG_TABLE_SIZE);
00177 for (i = 0; i < tic3x_num_registers; i++)
00178 registertable[tic3x_registers[i].regno] = (void *)&tic3x_registers[i];
00179 if (IS_CPU_TIC4X (tic4x_version))
00180 {
00181
00182
00183 for (i = 0; i < tic4x_num_registers; i++)
00184 registertable[tic4x_registers[i].regno] = (void *)&tic4x_registers[i];
00185 }
00186 }
00187 if ((int) regno > (IS_CPU_TIC4X (tic4x_version) ? TIC4X_REG_MAX : TIC3X_REG_MAX))
00188 return 0;
00189 if (info != NULL)
00190 (*info->fprintf_func) (info->stream, "%s", registertable[regno]->name);
00191 return 1;
00192 }
00193
00194 static int
00195 tic4x_print_addr (info, addr)
00196 struct disassemble_info *info;
00197 unsigned long addr;
00198 {
00199 if (info != NULL)
00200 (*info->print_address_func)(addr, info);
00201 return 1;
00202 }
00203
00204 static int
00205 tic4x_print_relative (info, pc, offset, opcode)
00206 struct disassemble_info *info;
00207 unsigned long pc;
00208 long offset;
00209 unsigned long opcode;
00210 {
00211 return tic4x_print_addr (info, pc + offset + tic4x_pc_offset (opcode));
00212 }
00213
00214 static int
00215 tic4x_print_direct (info, arg)
00216 struct disassemble_info *info;
00217 unsigned long arg;
00218 {
00219 if (info != NULL)
00220 {
00221 (*info->fprintf_func) (info->stream, "@");
00222 tic4x_print_addr (info, arg + (tic4x_dp << 16));
00223 }
00224 return 1;
00225 }
00226
00227
00228
00229 void
00230 tic4x_print_ftoa (val, stream, pfunc)
00231 unsigned int val;
00232 FILE *stream;
00233 fprintf_ftype pfunc;
00234 {
00235 int e;
00236 int s;
00237 int f;
00238 double num = 0.0;
00239
00240 e = EXTRS (val, 31, 24);
00241 if (e != -128)
00242 {
00243 s = EXTRU (val, 23, 23);
00244 f = EXTRU (val, 22, 0);
00245 if (s)
00246 f += -2 * (1 << 23);
00247 else
00248 f += (1 << 23);
00249 num = f / (double)(1 << 23);
00250 num = ldexp (num, e);
00251 }
00252 (*pfunc)(stream, "%.9g", num);
00253 }
00254
00255 static int
00256 tic4x_print_immed (info, type, arg)
00257 struct disassemble_info *info;
00258 immed_t type;
00259 unsigned long arg;
00260 {
00261 int s;
00262 int f;
00263 int e;
00264 double num = 0.0;
00265
00266 if (info == NULL)
00267 return 1;
00268 switch (type)
00269 {
00270 case IMMED_SINT:
00271 case IMMED_INT:
00272 (*info->fprintf_func) (info->stream, "%d", (long)arg);
00273 break;
00274
00275 case IMMED_SUINT:
00276 case IMMED_UINT:
00277 (*info->fprintf_func) (info->stream, "%u", arg);
00278 break;
00279
00280 case IMMED_SFLOAT:
00281 e = EXTRS (arg, 15, 12);
00282 if (e != -8)
00283 {
00284 s = EXTRU (arg, 11, 11);
00285 f = EXTRU (arg, 10, 0);
00286 if (s)
00287 f += -2 * (1 << 11);
00288 else
00289 f += (1 << 11);
00290 num = f / (double)(1 << 11);
00291 num = ldexp (num, e);
00292 }
00293 (*info->fprintf_func) (info->stream, "%f", num);
00294 break;
00295 case IMMED_FLOAT:
00296 e = EXTRS (arg, 31, 24);
00297 if (e != -128)
00298 {
00299 s = EXTRU (arg, 23, 23);
00300 f = EXTRU (arg, 22, 0);
00301 if (s)
00302 f += -2 * (1 << 23);
00303 else
00304 f += (1 << 23);
00305 num = f / (double)(1 << 23);
00306 num = ldexp (num, e);
00307 }
00308 (*info->fprintf_func) (info->stream, "%f", num);
00309 break;
00310 }
00311 return 1;
00312 }
00313
00314 static int
00315 tic4x_print_cond (info, cond)
00316 struct disassemble_info *info;
00317 unsigned int cond;
00318 {
00319 static tic4x_cond_t **condtable = NULL;
00320 unsigned int i;
00321
00322 if (condtable == NULL)
00323 {
00324 condtable = (tic4x_cond_t **)xmalloc (sizeof (tic4x_cond_t *) * 32);
00325 for (i = 0; i < tic4x_num_conds; i++)
00326 condtable[tic4x_conds[i].cond] = (void *)&tic4x_conds[i];
00327 }
00328 if (cond > 31 || condtable[cond] == NULL)
00329 return 0;
00330 if (info != NULL)
00331 (*info->fprintf_func) (info->stream, "%s", condtable[cond]->name);
00332 return 1;
00333 }
00334
00335 static int
00336 tic4x_print_indirect (info, type, arg)
00337 struct disassemble_info *info;
00338 indirect_t type;
00339 unsigned long arg;
00340 {
00341 unsigned int aregno;
00342 unsigned int modn;
00343 unsigned int disp;
00344 char *a;
00345
00346 aregno = 0;
00347 modn = 0;
00348 disp = 1;
00349 switch(type)
00350 {
00351 case INDIRECT_TIC4X:
00352 disp = EXTRU (arg, 7, 3);
00353 aregno = EXTRU (arg, 2, 0) + REG_AR0;
00354 modn = 0;
00355 break;
00356 case INDIRECT_SHORT:
00357 disp = 1;
00358 aregno = EXTRU (arg, 2, 0) + REG_AR0;
00359 modn = EXTRU (arg, 7, 3);
00360 break;
00361 case INDIRECT_LONG:
00362 disp = EXTRU (arg, 7, 0);
00363 aregno = EXTRU (arg, 10, 8) + REG_AR0;
00364 modn = EXTRU (arg, 15, 11);
00365 if (modn > 7 && disp != 0)
00366 return 0;
00367 break;
00368 default:
00369 (*info->fprintf_func)(info->stream, "# internal error: Unknown indirect type %d", type);
00370 return 0;
00371 }
00372 if (modn > TIC3X_MODN_MAX)
00373 return 0;
00374 a = tic4x_indirects[modn].name;
00375 while (*a)
00376 {
00377 switch (*a)
00378 {
00379 case 'a':
00380 tic4x_print_register (info, aregno);
00381 break;
00382 case 'd':
00383 tic4x_print_immed (info, IMMED_UINT, disp);
00384 break;
00385 case 'y':
00386 tic4x_print_str (info, "ir0");
00387 break;
00388 case 'z':
00389 tic4x_print_str (info, "ir1");
00390 break;
00391 default:
00392 tic4x_print_char (info, *a);
00393 break;
00394 }
00395 a++;
00396 }
00397 return 1;
00398 }
00399
00400 static int
00401 tic4x_print_op (info, instruction, p, pc)
00402 struct disassemble_info *info;
00403 unsigned long instruction;
00404 tic4x_inst_t *p;
00405 unsigned long pc;
00406 {
00407 int val;
00408 char *s;
00409 char *parallel = NULL;
00410
00411
00412 s = p->name;
00413 while (*s && parallel == NULL)
00414 {
00415 switch (*s)
00416 {
00417 case 'B':
00418 if (! tic4x_print_cond (info, EXTRU (instruction, 20, 16)))
00419 return 0;
00420 break;
00421 case 'C':
00422 if (! tic4x_print_cond (info, EXTRU (instruction, 27, 23)))
00423 return 0;
00424 break;
00425 case '_':
00426 parallel = s + 1;
00427 break;
00428 default:
00429 tic4x_print_char (info, *s);
00430 break;
00431 }
00432 s++;
00433 }
00434
00435
00436 s = p->args;
00437 if (*s)
00438 tic4x_print_char (info, ' ');
00439
00440 while (*s)
00441 {
00442 switch (*s)
00443 {
00444 case '*':
00445 if (! tic4x_print_indirect (info, INDIRECT_LONG,
00446 EXTRU (instruction, 15, 0)))
00447 return 0;
00448 break;
00449
00450 case '#':
00451 tic4x_print_immed (info, IMMED_UINT, EXTRU (instruction, 15, 0));
00452 break;
00453
00454 case '@':
00455 tic4x_print_direct (info, EXTRU (instruction, 15, 0));
00456 break;
00457
00458 case 'A':
00459 if (! tic4x_print_register (info, EXTRU (instruction, 24, 22) +
00460 REG_AR0))
00461 return 0;
00462 break;
00463
00464 case 'B':
00465
00466 if (IS_CPU_TIC4X (tic4x_version))
00467 tic4x_print_relative (info, pc, EXTRS (instruction, 23, 0),
00468 p->opcode);
00469 else
00470 tic4x_print_addr (info, EXTRU (instruction, 23, 0));
00471 break;
00472
00473 case 'C':
00474 if (! IS_CPU_TIC4X (tic4x_version))
00475 return 0;
00476 if (! tic4x_print_indirect (info, INDIRECT_TIC4X,
00477 EXTRU (instruction, 7, 0)))
00478 return 0;
00479 break;
00480
00481 case 'D':
00482
00483 break;
00484
00485 case 'E':
00486 case 'e':
00487 if (! tic4x_print_register (info, EXTRU (instruction, 7, 0)))
00488 return 0;
00489 break;
00490
00491 case 'F':
00492 tic4x_print_immed (info, IMMED_SFLOAT,
00493 EXTRU (instruction, 15, 0));
00494 break;
00495
00496 case 'i':
00497 if ( EXTRU (instruction, 7, 5) == 7 )
00498 {
00499 if( !tic4x_print_register (info, EXTRU (instruction, 4, 0)) )
00500 return 0;
00501 break;
00502 }
00503
00504
00505 case 'I':
00506 if (! tic4x_print_indirect (info, INDIRECT_SHORT,
00507 EXTRU (instruction, 7, 0)))
00508 return 0;
00509 break;
00510
00511 case 'j':
00512 if ( EXTRU (instruction, 15, 13) == 7 )
00513 {
00514 if( !tic4x_print_register (info, EXTRU (instruction, 12, 8)) )
00515 return 0;
00516 break;
00517 }
00518
00519 case 'J':
00520 if (! tic4x_print_indirect (info, INDIRECT_SHORT,
00521 EXTRU (instruction, 15, 8)))
00522 return 0;
00523 break;
00524
00525 case 'G':
00526 case 'g':
00527 if (! tic4x_print_register (info, EXTRU (instruction, 15, 8)))
00528 return 0;
00529 break;
00530
00531 case 'H':
00532 if (! tic4x_print_register (info, EXTRU (instruction, 18, 16)))
00533 return 0;
00534 break;
00535
00536 case 'K':
00537 if (! tic4x_print_register (info, EXTRU (instruction, 21, 19)))
00538 return 0;
00539 break;
00540
00541 case 'L':
00542 if (! tic4x_print_register (info, EXTRU (instruction, 24, 22)))
00543 return 0;
00544 break;
00545
00546 case 'M':
00547 tic4x_print_register (info, EXTRU (instruction, 22, 22) + REG_R2);
00548 break;
00549
00550 case 'N':
00551 tic4x_print_register (info, EXTRU (instruction, 23, 23) + REG_R0);
00552 break;
00553
00554 case 'O':
00555 if (! IS_CPU_TIC4X (tic4x_version))
00556 return 0;
00557 if (! tic4x_print_indirect (info, INDIRECT_TIC4X,
00558 EXTRU (instruction, 15, 8)))
00559 return 0;
00560 break;
00561
00562 case 'P':
00563 tic4x_print_relative (info, pc, EXTRS (instruction, 15, 0),
00564 p->opcode);
00565 break;
00566
00567 case 'Q':
00568 case 'q':
00569 if (! tic4x_print_register (info, EXTRU (instruction, 15, 0)))
00570 return 0;
00571 break;
00572
00573 case 'R':
00574 case 'r':
00575 if (! tic4x_print_register (info, EXTRU (instruction, 20, 16)))
00576 return 0;
00577 break;
00578
00579 case 'S':
00580 tic4x_print_immed (info, IMMED_SINT,
00581 EXTRS (instruction, 15, 0));
00582 break;
00583
00584 case 'T':
00585 if (! IS_CPU_TIC4X (tic4x_version))
00586 return 0;
00587 if (! tic4x_print_immed (info, IMMED_SUINT,
00588 EXTRU (instruction, 20, 16)))
00589 return 0;
00590 break;
00591
00592 case 'U':
00593 tic4x_print_immed (info, IMMED_SUINT, EXTRU (instruction, 15, 0));
00594 break;
00595
00596 case 'V':
00597 tic4x_print_immed (info, IMMED_SUINT,
00598 IS_CPU_TIC4X (tic4x_version) ?
00599 EXTRU (instruction, 8, 0) :
00600 EXTRU (instruction, 4, 0) & ~0x20);
00601 break;
00602
00603 case 'W':
00604 if (! IS_CPU_TIC4X (tic4x_version))
00605 return 0;
00606 tic4x_print_immed (info, IMMED_SINT, EXTRS (instruction, 7, 0));
00607 break;
00608
00609 case 'X':
00610 val = EXTRU (instruction, 4, 0) + REG_IVTP;
00611 if (val < REG_IVTP || val > REG_TVTP)
00612 return 0;
00613 if (! tic4x_print_register (info, val))
00614 return 0;
00615 break;
00616
00617 case 'Y':
00618 val = EXTRU (instruction, 20, 16);
00619 if (val < REG_AR0 || val > REG_SP)
00620 return 0;
00621 if (! tic4x_print_register (info, val))
00622 return 0;
00623 break;
00624
00625 case 'Z':
00626 val = EXTRU (instruction, 20, 16) + REG_IVTP;
00627 if (val < REG_IVTP || val > REG_TVTP)
00628 return 0;
00629 if (! tic4x_print_register (info, val))
00630 return 0;
00631 break;
00632
00633 case '|':
00634 tic4x_print_str (info, " || ");
00635 tic4x_print_str (info, parallel);
00636 tic4x_print_char (info, ' ');
00637 break;
00638
00639 case ';':
00640 tic4x_print_char (info, ',');
00641 break;
00642
00643 default:
00644 tic4x_print_char (info, *s);
00645 break;
00646 }
00647 s++;
00648 }
00649 return 1;
00650 }
00651
00652 static void
00653 tic4x_hash_opcode_special (optable_special, inst)
00654 tic4x_inst_t **optable_special;
00655 const tic4x_inst_t *inst;
00656 {
00657 int i;
00658
00659 for( i=0; i<TIC4X_SPESOP_SIZE; i++ )
00660 if( optable_special[i] != NULL
00661 && optable_special[i]->opcode == inst->opcode )
00662 {
00663
00664 optable_special[i] = (void *)inst;
00665 return;
00666 }
00667
00668 for( i=0; i<TIC4X_SPESOP_SIZE; i++ )
00669 if( optable_special[i] == NULL )
00670 {
00671
00672 optable_special[i] = (void *)inst;
00673 return;
00674 }
00675
00676
00677
00678
00679 #if TIC4X_DEBUG
00680 printf("optable_special[] is full, please increase TIC4X_SPESOP_SIZE!\n");
00681 #endif
00682 }
00683
00684 static void
00685 tic4x_hash_opcode (optable, optable_special, inst, tic4x_oplevel)
00686 tic4x_inst_t **optable;
00687 tic4x_inst_t **optable_special;
00688 const tic4x_inst_t *inst;
00689 const unsigned long tic4x_oplevel;
00690 {
00691 int j;
00692 int opcode = inst->opcode >> (32 - TIC4X_HASH_SIZE);
00693 int opmask = inst->opmask >> (32 - TIC4X_HASH_SIZE);
00694
00695
00696
00697
00698 for (j = opcode; j < opmask; j++)
00699 if ( (j & opmask) == opcode
00700 && inst->oplevel & tic4x_oplevel )
00701 {
00702 #if TIC4X_DEBUG
00703
00704
00705 if (optable[j] != NULL)
00706 printf("Collision at index %d, %s and %s\n",
00707 j, optable[j]->name, inst->name);
00708 #endif
00709
00710
00711
00712
00713 if ( optable[j] != NULL
00714 && inst->opmask & ~(opmask << (32 - TIC4X_HASH_SIZE)) )
00715 {
00716
00717 tic4x_hash_opcode_special(optable_special, optable[j]);
00718
00719
00720 tic4x_hash_opcode_special(optable_special, inst);
00721 }
00722
00723 optable[j] = (void *)inst;
00724 }
00725 }
00726
00727
00728
00729
00730
00731
00732
00733 static int
00734 tic4x_disassemble (pc, instruction, info)
00735 unsigned long pc;
00736 unsigned long instruction;
00737 struct disassemble_info *info;
00738 {
00739 static tic4x_inst_t **optable = NULL;
00740 static tic4x_inst_t **optable_special = NULL;
00741 tic4x_inst_t *p;
00742 int i;
00743 unsigned long tic4x_oplevel;
00744
00745 tic4x_version = info->mach;
00746
00747 tic4x_oplevel = (IS_CPU_TIC4X (tic4x_version)) ? OP_C4X : 0;
00748 tic4x_oplevel |= OP_C3X|OP_LPWR|OP_IDLE2|OP_ENH;
00749
00750 if (optable == NULL)
00751 {
00752 optable = (tic4x_inst_t **)
00753 xcalloc (sizeof (tic4x_inst_t *), (1 << TIC4X_HASH_SIZE));
00754
00755 optable_special = (tic4x_inst_t **)
00756 xcalloc (sizeof (tic4x_inst_t *), TIC4X_SPESOP_SIZE );
00757
00758
00759
00760 for (i = tic4x_num_insts - 1; i >= 0; i--)
00761 tic4x_hash_opcode (optable, optable_special, &tic4x_insts[i], tic4x_oplevel);
00762
00763
00764
00765
00766
00767 for (i=0; i<TIC4X_SPESOP_SIZE; i++)
00768 if ( optable_special[i] != NULL )
00769 optable[optable_special[i]->opcode >> (32 - TIC4X_HASH_SIZE)] = NULL;
00770 }
00771
00772
00773 if ((instruction >> 16) == 0x5070 || (instruction >> 16) == 0x1f70)
00774 tic4x_dp = EXTRU (instruction, 15, 0);
00775
00776 p = optable[instruction >> (32 - TIC4X_HASH_SIZE)];
00777 if ( p != NULL )
00778 {
00779 if ( ((instruction & p->opmask) == p->opcode)
00780 && tic4x_print_op (NULL, instruction, p, pc) )
00781 tic4x_print_op (info, instruction, p, pc);
00782 else
00783 (*info->fprintf_func) (info->stream, "%08x", instruction);
00784 }
00785 else
00786 {
00787 for (i = 0; i<TIC4X_SPESOP_SIZE; i++)
00788 if (optable_special[i] != NULL
00789 && optable_special[i]->opcode == instruction )
00790 {
00791 (*info->fprintf_func)(info->stream, "%s", optable_special[i]->name);
00792 break;
00793 }
00794 if (i==TIC4X_SPESOP_SIZE)
00795 (*info->fprintf_func) (info->stream, "%08x", instruction);
00796 }
00797
00798
00799 return 1;
00800 }
00801
00802
00803 int
00804 print_insn_tic4x (memaddr, info)
00805 bfd_vma memaddr;
00806 struct disassemble_info *info;
00807 {
00808 int status;
00809 unsigned long pc;
00810 unsigned long op;
00811 bfd_byte buffer[4];
00812
00813 status = (*info->read_memory_func) (memaddr, buffer, 4, info);
00814 if (status != 0)
00815 {
00816 (*info->memory_error_func) (status, memaddr, info);
00817 return -1;
00818 }
00819
00820 pc = memaddr;
00821 op = bfd_getl32 (buffer);
00822 info->bytes_per_line = 4;
00823 info->bytes_per_chunk = 4;
00824 info->octets_per_byte = 4;
00825 info->display_endian = BFD_ENDIAN_LITTLE;
00826 return tic4x_disassemble (pc, op, info) * 4;
00827 }