2009-02-18 Christophe Lyon <christophe.lyon@st.com>
[deliverable/binutils-gdb.git] / opcodes / tic54x-dis.c
CommitLineData
5c84d377 1/* Disassembly routines for TMS320C54X architecture
9b201bb5 2 Copyright 1999, 2000, 2001, 2007 Free Software Foundation, Inc.
5c84d377
TW
3 Contributed by Timothy Wall (twall@cygnus.com)
4
9b201bb5
NC
5 This file is part of the GNU opcodes library.
6
7 This library is free software; you can redistribute it and/or modify
5c84d377 8 it under the terms of the GNU General Public License as published by
9b201bb5
NC
9 the Free Software Foundation; either version 3, or (at your option)
10 any later version.
5c84d377 11
9b201bb5
NC
12 It is distributed in the hope that it will be useful, but WITHOUT
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 License for more details.
5c84d377
TW
16
17 You should have received a copy of the GNU General Public License
9b201bb5
NC
18 along with this file; see the file COPYING. If not, write to the
19 Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
5c84d377
TW
21
22#include <errno.h>
23#include <math.h>
24#include <stdlib.h>
c1485d85 25#include "sysdep.h"
5c84d377
TW
26#include "dis-asm.h"
27#include "opcode/tic54x.h"
28#include "coff/tic54x.h"
29
6e917903
TW
30static int has_lkaddr (unsigned short, const template *);
31static int get_insn_size (unsigned short, const template *);
32static int print_instruction (disassemble_info *, bfd_vma,
33 unsigned short, const char *,
34 const enum optype [], int, int);
35static int print_parallel_instruction (disassemble_info *, bfd_vma,
36 unsigned short,
37 const template *, int);
d83c6548 38static int sprint_dual_address (disassemble_info *,char [],
5c84d377 39 unsigned short);
d83c6548 40static int sprint_indirect_address (disassemble_info *,char [],
5c84d377 41 unsigned short);
d83c6548 42static int sprint_direct_address (disassemble_info *,char [],
5c84d377
TW
43 unsigned short);
44static int sprint_mmr (disassemble_info *,char [],int);
45static int sprint_condition (disassemble_info *,char *,unsigned short);
46static int sprint_cc2 (disassemble_info *,char *,unsigned short);
47
48int
6e917903 49print_insn_tic54x (bfd_vma memaddr, disassemble_info *info)
5c84d377 50{
d83c6548 51 bfd_byte opbuf[2];
5c84d377
TW
52 unsigned short opcode;
53 int status, size;
6e917903 54 const template* tm;
5c84d377
TW
55
56 status = (*info->read_memory_func) (memaddr, opbuf, 2, info);
57 if (status != 0)
58 {
33822a8e 59 (*info->memory_error_func) (status, memaddr, info);
5c84d377
TW
60 return -1;
61 }
62
33822a8e 63 opcode = bfd_getl16 (opbuf);
6e917903 64 tm = tic54x_get_insn (info, memaddr, opcode, &size);
5c84d377 65
5c84d377
TW
66 info->bytes_per_line = 2;
67 info->bytes_per_chunk = 2;
68 info->octets_per_byte = 2;
69 info->display_endian = BFD_ENDIAN_LITTLE;
70
6e917903 71 if (tm->flags & FL_PAR)
5c84d377 72 {
6e917903 73 if (!print_parallel_instruction (info, memaddr, opcode, tm, size))
5c84d377
TW
74 return -1;
75 }
76 else
77 {
d83c6548 78 if (!print_instruction (info, memaddr, opcode,
6e917903
TW
79 (char *) tm->name,
80 tm->operand_types,
81 size, (tm->flags & FL_EXT)))
5c84d377
TW
82 return -1;
83 }
84
33822a8e 85 return size * 2;
5c84d377
TW
86}
87
88static int
6e917903 89has_lkaddr (unsigned short memdata, const template *tm)
5c84d377 90{
6e917903 91 return (IS_LKADDR (memdata)
33822a8e
KH
92 && (OPTYPE (tm->operand_types[0]) == OP_Smem
93 || OPTYPE (tm->operand_types[1]) == OP_Smem
94 || OPTYPE (tm->operand_types[2]) == OP_Smem
6e917903
TW
95 || OPTYPE (tm->operand_types[1]) == OP_Sind
96 || OPTYPE (tm->operand_types[0]) == OP_Lmem
97 || OPTYPE (tm->operand_types[1]) == OP_Lmem));
5c84d377
TW
98}
99
100/* always returns 1 (whether an insn template was found) since we provide an
101 "unknown instruction" template */
6e917903
TW
102const template*
103tic54x_get_insn (disassemble_info *info, bfd_vma addr,
104 unsigned short memdata, int *size)
5c84d377 105{
6e917903 106 const template *tm = NULL;
5c84d377 107
6e917903 108 for (tm = tic54x_optab; tm->name; tm++)
5c84d377 109 {
6e917903 110 if (tm->opcode == (memdata & tm->mask))
5c84d377
TW
111 {
112 /* a few opcodes span two words */
113 if (tm->flags & FL_EXT)
114 {
115 /* if lk addressing is used, the second half of the opcode gets
116 pushed one word later */
117 bfd_byte opbuf[2];
6e917903 118 bfd_vma addr2 = addr + 1 + has_lkaddr (memdata, tm);
33822a8e 119 int status = (*info->read_memory_func) (addr2, opbuf, 2, info);
6e917903 120 // FIXME handle errors
5c84d377
TW
121 if (status == 0)
122 {
6e917903
TW
123 unsigned short data2 = bfd_getl16 (opbuf);
124 if (tm->opcode2 == (data2 & tm->mask2))
5c84d377 125 {
6e917903
TW
126 if (size) *size = get_insn_size (memdata, tm);
127 return tm;
5c84d377
TW
128 }
129 }
130 }
131 else
132 {
6e917903
TW
133 if (size) *size = get_insn_size (memdata, tm);
134 return tm;
5c84d377
TW
135 }
136 }
137 }
6e917903 138 for (tm = (template *) tic54x_paroptab; tm->name; tm++)
5c84d377 139 {
6e917903 140 if (tm->opcode == (memdata & tm->mask))
5c84d377 141 {
6e917903
TW
142 if (size) *size = get_insn_size (memdata, tm);
143 return tm;
5c84d377
TW
144 }
145 }
146
6e917903
TW
147 if (size) *size = 1;
148 return &tic54x_unknown_opcode;
5c84d377
TW
149}
150
d83c6548 151static int
6e917903 152get_insn_size (unsigned short memdata, const template *insn)
5c84d377
TW
153{
154 int size;
155
6e917903 156 if (insn->flags & FL_PAR)
5c84d377
TW
157 {
158 /* only non-parallel instructions support lk addressing */
6e917903 159 size = insn->words;
5c84d377
TW
160 }
161 else
162 {
6e917903 163 size = insn->words + has_lkaddr (memdata, insn);
5c84d377
TW
164 }
165
166 return size;
167}
168
169int
170print_instruction (info, memaddr, opcode, tm_name, tm_operands, size, ext)
171 disassemble_info *info;
172 bfd_vma memaddr;
173 unsigned short opcode;
6e917903
TW
174 const char *tm_name;
175 const enum optype tm_operands[];
5c84d377
TW
176 int size;
177 int ext;
178{
179 static int n;
180 /* string storage for multiple operands */
181 char operand[4][64] = { {0},{0},{0},{0}, };
182 bfd_byte buf[2];
fc05c67f
NC
183 unsigned long opcode2 = 0;
184 unsigned long lkaddr = 0;
5c84d377
TW
185 enum optype src = OP_None;
186 enum optype dst = OP_None;
187 int i, shift;
188 char *comma = "";
189
190 info->fprintf_func (info->stream, "%-7s", tm_name);
191
192 if (size > 1)
193 {
33822a8e 194 int status = (*info->read_memory_func) (memaddr + 1, buf, 2, info);
5c84d377
TW
195 if (status != 0)
196 return 0;
33822a8e 197 lkaddr = opcode2 = bfd_getl16 (buf);
5c84d377
TW
198 if (size > 2)
199 {
33822a8e 200 status = (*info->read_memory_func) (memaddr + 2, buf, 2, info);
5c84d377
TW
201 if (status != 0)
202 return 0;
33822a8e 203 opcode2 = bfd_getl16 (buf);
5c84d377
TW
204 }
205 }
206
33822a8e 207 for (i = 0; i < MAX_OPERANDS && OPTYPE (tm_operands[i]) != OP_None; i++)
5c84d377
TW
208 {
209 char *next_comma = ",";
210 int optional = (tm_operands[i] & OPT) != 0;
211
33822a8e 212 switch (OPTYPE (tm_operands[i]))
5c84d377
TW
213 {
214 case OP_Xmem:
33822a8e 215 sprint_dual_address (info, operand[i], XMEM (opcode));
5c84d377
TW
216 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
217 break;
218 case OP_Ymem:
33822a8e 219 sprint_dual_address (info, operand[i], YMEM (opcode));
5c84d377
TW
220 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
221 break;
222 case OP_Smem:
223 case OP_Sind:
224 case OP_Lmem:
225 info->fprintf_func (info->stream, "%s", comma);
33822a8e 226 if (INDIRECT (opcode))
5c84d377 227 {
33822a8e 228 if (MOD (opcode) >= 12)
5c84d377
TW
229 {
230 bfd_vma addr = lkaddr;
33822a8e
KH
231 int arf = ARF (opcode);
232 int mod = MOD (opcode);
5c84d377
TW
233 if (mod == 15)
234 info->fprintf_func (info->stream, "*(");
235 else
d83c6548 236 info->fprintf_func (info->stream, "*%sar%d(",
5c84d377
TW
237 (mod == 13 || mod == 14 ? "+" : ""),
238 arf);
33822a8e 239 (*(info->print_address_func)) ((bfd_vma) addr, info);
d83c6548 240 info->fprintf_func (info->stream, ")%s",
5c84d377
TW
241 mod == 14 ? "%" : "");
242 }
243 else
244 {
245 sprint_indirect_address (info, operand[i], opcode);
246 info->fprintf_func (info->stream, "%s", operand[i]);
247 }
248 }
249 else
250 {
251 /* FIXME -- use labels (print_address_func) */
252 /* in order to do this, we need to guess what DP is */
253 sprint_direct_address (info, operand[i], opcode);
254 info->fprintf_func (info->stream, "%s", operand[i]);
255 }
256 break;
257 case OP_dmad:
258 info->fprintf_func (info->stream, "%s", comma);
33822a8e 259 (*(info->print_address_func)) ((bfd_vma) opcode2, info);
5c84d377
TW
260 break;
261 case OP_xpmad:
262 /* upper 7 bits of address are in the opcode */
33822a8e 263 opcode2 += ((unsigned long) opcode & 0x7F) << 16;
5c84d377
TW
264 /* fall through */
265 case OP_pmad:
266 info->fprintf_func (info->stream, "%s", comma);
33822a8e 267 (*(info->print_address_func)) ((bfd_vma) opcode2, info);
5c84d377
TW
268 break;
269 case OP_MMRX:
33822a8e 270 sprint_mmr (info, operand[i], MMRX (opcode));
5c84d377
TW
271 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
272 break;
273 case OP_MMRY:
33822a8e 274 sprint_mmr (info, operand[i], MMRY (opcode));
5c84d377
TW
275 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
276 break;
277 case OP_MMR:
33822a8e 278 sprint_mmr (info, operand[i], MMR (opcode));
5c84d377
TW
279 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
280 break;
281 case OP_PA:
33822a8e 282 sprintf (operand[i], "pa%d", (unsigned) opcode2);
5c84d377
TW
283 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
284 break;
285 case OP_SRC:
33822a8e 286 src = SRC (ext ? opcode2 : opcode) ? OP_B : OP_A;
5c84d377
TW
287 sprintf (operand[i], (src == OP_B) ? "b" : "a");
288 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
289 break;
290 case OP_SRC1:
33822a8e 291 src = SRC1 (ext ? opcode2 : opcode) ? OP_B : OP_A;
5c84d377
TW
292 sprintf (operand[i], (src == OP_B) ? "b" : "a");
293 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
294 break;
295 case OP_RND:
33822a8e 296 dst = DST (opcode) ? OP_B : OP_A;
5c84d377
TW
297 sprintf (operand[i], (dst == OP_B) ? "a" : "b");
298 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
299 break;
300 case OP_DST:
33822a8e 301 dst = DST (ext ? opcode2 : opcode) ? OP_B : OP_A;
5c84d377
TW
302 if (!optional || dst != src)
303 {
304 sprintf (operand[i], (dst == OP_B) ? "b" : "a");
305 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
306 }
307 else
308 next_comma = comma;
309 break;
310 case OP_B:
311 sprintf (operand[i], "b");
312 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
313 break;
314 case OP_A:
315 sprintf (operand[i], "a");
316 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
317 break;
318 case OP_ARX:
33822a8e 319 sprintf (operand[i], "ar%d", (int) ARX (opcode));
5c84d377
TW
320 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
321 break;
322 case OP_SHIFT:
33822a8e 323 shift = SHIFT (ext ? opcode2 : opcode);
5c84d377
TW
324 if (!optional || shift != 0)
325 {
33822a8e 326 sprintf (operand[i], "%d", shift);
5c84d377
TW
327 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
328 }
329 else
330 next_comma = comma;
331 break;
332 case OP_SHFT:
33822a8e 333 shift = SHFT (opcode);
5c84d377
TW
334 if (!optional || shift != 0)
335 {
33822a8e 336 sprintf (operand[i], "%d", (unsigned) shift);
5c84d377
TW
337 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
338 }
339 else
340 next_comma = comma;
341 break;
342 case OP_lk:
33822a8e 343 sprintf (operand[i], "#%d", (int) (short) opcode2);
5c84d377
TW
344 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
345 break;
346 case OP_T:
347 sprintf (operand[i], "t");
348 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
349 break;
350 case OP_TS:
351 sprintf (operand[i], "ts");
352 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
353 break;
354 case OP_k8:
33822a8e 355 sprintf (operand[i], "%d", (int) ((signed char) (opcode & 0xFF)));
5c84d377
TW
356 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
357 break;
358 case OP_16:
359 sprintf (operand[i], "16");
360 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
361 break;
362 case OP_ASM:
363 sprintf (operand[i], "asm");
364 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
365 break;
366 case OP_BITC:
33822a8e 367 sprintf (operand[i], "%d", (int) (opcode & 0xF));
5c84d377
TW
368 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
369 break;
370 case OP_CC:
371 /* put all CC operands in the same operand */
372 sprint_condition (info, operand[i], opcode);
373 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
374 i = MAX_OPERANDS;
375 break;
376 case OP_CC2:
377 sprint_cc2 (info, operand[i], opcode);
378 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
379 break;
380 case OP_CC3:
381 {
382 const char *code[] = { "eq", "lt", "gt", "neq" };
33822a8e 383 sprintf (operand[i], code[CC3 (opcode)]);
5c84d377
TW
384 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
385 break;
386 }
387 case OP_123:
388 {
33822a8e 389 int code = (opcode >> 8) & 0x3;
5c84d377
TW
390 sprintf (operand[i], "%d", (code == 0) ? 1 : (code == 2) ? 2 : 3);
391 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
392 break;
393 }
394 case OP_k5:
d83c6548 395 sprintf (operand[i], "#%d",
33822a8e 396 (int) (((signed char) opcode & 0x1F) << 3) >> 3);
5c84d377
TW
397 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
398 break;
399 case OP_k8u:
33822a8e 400 sprintf (operand[i], "#%d", (unsigned) (opcode & 0xFF));
5c84d377
TW
401 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
402 break;
403 case OP_k3:
33822a8e 404 sprintf (operand[i], "#%d", (int) (opcode & 0x7));
5c84d377
TW
405 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
406 break;
407 case OP_lku:
33822a8e 408 sprintf (operand[i], "#%d", (unsigned) opcode2);
5c84d377
TW
409 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
410 break;
411 case OP_N:
412 n = (opcode >> 9) & 0x1;
413 sprintf (operand[i], "st%d", n);
414 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
415 break;
416 case OP_SBIT:
417 {
418 const char *status0[] = {
d83c6548 419 "0", "1", "2", "3", "4", "5", "6", "7", "8",
5c84d377
TW
420 "ovb", "ova", "c", "tc", "13", "14", "15"
421 };
422 const char *status1[] = {
d83c6548 423 "0", "1", "2", "3", "4",
5c84d377
TW
424 "cmpt", "frct", "c16", "sxm", "ovm", "10",
425 "intm", "hm", "xf", "cpl", "braf"
426 };
d83c6548 427 sprintf (operand[i], "%s",
33822a8e 428 n ? status1[SBIT (opcode)] : status0[SBIT (opcode)]);
5c84d377
TW
429 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
430 break;
431 }
432 case OP_12:
33822a8e 433 sprintf (operand[i], "%d", (int) ((opcode >> 9) & 1) + 1);
5c84d377
TW
434 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
435 break;
436 case OP_TRN:
437 sprintf (operand[i], "trn");
438 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
439 break;
440 case OP_DP:
441 sprintf (operand[i], "dp");
442 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
443 break;
444 case OP_k9:
445 /* FIXME-- this is DP, print the original address? */
33822a8e 446 sprintf (operand[i], "#%d", (int) (opcode & 0x1FF));
5c84d377
TW
447 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
448 break;
449 case OP_ARP:
450 sprintf (operand[i], "arp");
451 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
452 break;
453 case OP_031:
33822a8e 454 sprintf (operand[i], "%d", (int) (opcode & 0x1F));
5c84d377
TW
455 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
456 break;
457 default:
458 sprintf (operand[i], "??? (0x%x)", tm_operands[i]);
459 info->fprintf_func (info->stream, "%s%s", comma, operand[i]);
460 break;
461 }
462 comma = next_comma;
463 }
464 return 1;
465}
466
467static int
468print_parallel_instruction (info, memaddr, opcode, ptm, size)
469 disassemble_info *info;
470 bfd_vma memaddr;
471 unsigned short opcode;
6e917903 472 const template *ptm;
5c84d377
TW
473 int size;
474{
d83c6548 475 print_instruction (info, memaddr, opcode,
5c84d377
TW
476 ptm->name, ptm->operand_types, size, 0);
477 info->fprintf_func (info->stream, " || ");
d83c6548 478 return print_instruction (info, memaddr, opcode,
5c84d377
TW
479 ptm->parname, ptm->paroperand_types, size, 0);
480}
481
482static int
483sprint_dual_address (info, buf, code)
d83c6548 484 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
485 char buf[];
486 unsigned short code;
487{
488 const char *formats[] = {
489 "*ar%d",
490 "*ar%d-",
491 "*ar%d+",
492 "*ar%d+0%%",
493 };
33822a8e 494 return sprintf (buf, formats[XMOD (code)], XARX (code));
5c84d377
TW
495}
496
497static int
498sprint_indirect_address (info, buf, opcode)
d83c6548 499 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
500 char buf[];
501 unsigned short opcode;
502{
503 const char *formats[] = {
504 "*ar%d",
505 "*ar%d-",
506 "*ar%d+",
507 "*+ar%d",
508 "*ar%d-0B",
509 "*ar%d-0",
510 "*ar%d+0",
511 "*ar%d+0B",
512 "*ar%d-%%",
513 "*ar%d-0%%",
514 "*ar%d+%%",
515 "*ar%d+0%%",
516 };
33822a8e 517 return sprintf (buf, formats[MOD (opcode)], ARF (opcode));
5c84d377
TW
518}
519
520static int
521sprint_direct_address (info, buf, opcode)
d83c6548 522 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
523 char buf[];
524 unsigned short opcode;
525{
526 /* FIXME -- look up relocation if available */
6e917903 527 return sprintf (buf, "DP+0x%02x", (int) (opcode & 0x7F));
5c84d377
TW
528}
529
530static int
531sprint_mmr (info, buf, mmr)
d83c6548 532 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
533 char buf[];
534 int mmr;
535{
33822a8e 536 symbol *reg = (symbol *) mmregs;
5c84d377
TW
537 while (reg->name != NULL)
538 {
539 if (mmr == reg->value)
540 {
33822a8e 541 sprintf (buf, "%s", (reg + 1)->name);
5c84d377
TW
542 return 1;
543 }
544 ++reg;
545 }
d1e28e24 546 sprintf (buf, "MMR(%d)", mmr); /* FIXME -- different targets. */
5c84d377
TW
547 return 0;
548}
549
550static int
551sprint_cc2 (info, buf, opcode)
d83c6548 552 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
553 char *buf;
554 unsigned short opcode;
555{
556 const char *cc2[] = {
557 "??", "??", "ageq", "alt", "aneq", "aeq", "agt", "aleq",
558 "??", "??", "bgeq", "blt", "bneq", "beq", "bgt", "bleq",
559 };
560 return sprintf (buf, "%s", cc2[opcode & 0xF]);
561}
562
563static int
564sprint_condition (info, buf, opcode)
d83c6548 565 disassemble_info *info ATTRIBUTE_UNUSED;
5c84d377
TW
566 char *buf;
567 unsigned short opcode;
568{
569 char *start = buf;
570 const char *cmp[] = {
571 "??", "??", "geq", "lt", "neq", "eq", "gt", "leq"
572 };
573 if (opcode & 0x40)
574 {
575 char acc = (opcode & 0x8) ? 'b' : 'a';
576 if (opcode & 0x7)
33822a8e
KH
577 buf += sprintf (buf, "%c%s%s", acc, cmp[(opcode & 0x7)],
578 (opcode & 0x20) ? ", " : "");
5c84d377 579 if (opcode & 0x20)
33822a8e 580 buf += sprintf (buf, "%c%s", acc, (opcode & 0x10) ? "ov" : "nov");
5c84d377
TW
581 }
582 else if (opcode & 0x3F)
583 {
584 if (opcode & 0x30)
d83c6548 585 buf += sprintf (buf, "%s%s",
5c84d377
TW
586 ((opcode & 0x30) == 0x30) ? "tc" : "ntc",
587 (opcode & 0x0F) ? ", " : "");
588 if (opcode & 0x0C)
d83c6548 589 buf += sprintf (buf, "%s%s",
5c84d377
TW
590 ((opcode & 0x0C) == 0x0C) ? "c" : "nc",
591 (opcode & 0x03) ? ", " : "");
592 if (opcode & 0x03)
d83c6548 593 buf += sprintf (buf, "%s",
5c84d377
TW
594 ((opcode & 0x03) == 0x03) ? "bio" : "nbio");
595 }
596 else
597 buf += sprintf (buf, "unc");
598
599 return buf - start;
600}
This page took 0.469503 seconds and 4 git commands to generate.