diff options
author | Jeff Law <law@redhat.com> | 1998-03-19 21:05:23 +0000 |
---|---|---|
committer | Jeff Law <law@redhat.com> | 1998-03-19 21:05:23 +0000 |
commit | ffee80df9e5d050688247291c07f2fbd22d6520f (patch) | |
tree | 5e088a048b85af7c6a63108872bb69e39b49ede4 /opcodes/mips-dis.c | |
parent | f4f7d59421e5a6de5e06f7d170d517998a250f30 (diff) | |
download | gdb-ffee80df9e5d050688247291c07f2fbd22d6520f.zip gdb-ffee80df9e5d050688247291c07f2fbd22d6520f.tar.gz gdb-ffee80df9e5d050688247291c07f2fbd22d6520f.tar.bz2 |
* vu0.h: New file with cop2/vu0 instructions.
* mips-opc.c: Include vu0.h.
* mips-dis.c (print_insn_arg): Handle new args 0-9, +, -, %, K, &,
J, Q, X, and U.
(print_insn_mips): Do not emit a tab after an instruction if the
first arg is an instruction completer (&). If the next arg is an
escape character (%), then print the next arg verbatim.
* Makefile.am (mips-opc.lo): Depend on vu0.h
Diffstat (limited to 'opcodes/mips-dis.c')
-rw-r--r-- | opcodes/mips-dis.c | 140 |
1 files changed, 138 insertions, 2 deletions
diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index 673dbfe..f2b1847 100644 --- a/opcodes/mips-dis.c +++ b/opcodes/mips-dis.c @@ -84,6 +84,10 @@ print_insn_arg (d, l, pc, info) case '[': case ']': /* end-sanitize-vr5400 */ + /* start-sanitize-r5900 */ + case '+': + case '-': + /* end-santiize-r5900 */ (*info->fprintf_func) (info->stream, "%c", *d); break; @@ -179,6 +183,113 @@ print_insn_arg (d, l, pc, info) (l >> OP_SH_FS) & OP_MASK_FS); break; + /* start-sanitize-r5900 + case '0': + (*info->fprintf_func) (info->stream, "0x%x", + (l >> 6) & 0x1f); + break; + + case '9': + (*info->fprintf_func) (info->stream, "vi19"); + break; + + case '1': + (*info->fprintf_func) (info->stream, "vf%d", + (l >> OP_SH_FT) & OP_MASK_FT); + break; + case '2': + (*info->fprintf_func) (info->stream, "vf%d", + (l >> OP_SH_FS) & OP_MASK_FS); + break; + case '3': + (*info->fprintf_func) (info->stream, "vf%d", + (l >> OP_SH_FD) & OP_MASK_FD); + break; + + case '4': + (*info->fprintf_func) (info->stream, "vi%d", + (l >> OP_SH_FT) & OP_MASK_FT); + break; + case '5': + (*info->fprintf_func) (info->stream, "vi%d", + (l >> OP_SH_FS) & OP_MASK_FS); + break; + case '6': + (*info->fprintf_func) (info->stream, "vi%d", + (l >> OP_SH_FD) & OP_MASK_FD); + break; + + case '7': + (*info->fprintf_func) (info->stream, "vf%d", + (l >> OP_SH_FT) & OP_MASK_FT); + switch ((l >> 23) & 0x3) + { + case 0: + (*info->fprintf_func) (info->stream, "x"); + break; + case 1: + (*info->fprintf_func) (info->stream, "y"); + break; + case 2: + (*info->fprintf_func) (info->stream, "z"); + break; + case 3: + (*info->fprintf_func) (info->stream, "w"); + break; + } + break; + case 'K': + break; + + case '&': + (*info->fprintf_func) (info->stream, "."); + if (l & (1 << 21)) + (*info->fprintf_func) (info->stream, "w"); + if (l & (1 << 24)) + (*info->fprintf_func) (info->stream, "x"); + if (l & (1 << 23)) + (*info->fprintf_func) (info->stream, "y"); + if (l & (1 << 22)) + (*info->fprintf_func) (info->stream, "z"); + (*info->fprintf_func) (info->stream, "\t"); + break; + + case '8': + (*info->fprintf_func) (info->stream, "vf%d", + (l >> OP_SH_FS) & OP_MASK_FS); + switch ((l >> 21) & 0x3) + { + case 0: + (*info->fprintf_func) (info->stream, "x"); + break; + case 1: + (*info->fprintf_func) (info->stream, "y"); + break; + case 2: + (*info->fprintf_func) (info->stream, "z"); + break; + case 3: + (*info->fprintf_func) (info->stream, "w"); + break; + } + break; + case 'J': + (*info->fprintf_func) (info->stream, "I"); + break; + + case 'Q': + (*info->fprintf_func) (info->stream, "Q"); + break; + + case 'X': + (*info->fprintf_func) (info->stream, "R"); + break; + + case 'U': + (*info->fprintf_func) (info->stream, "ACC"); + break; + /* end-sanitize-r5900 */ + case 'T': case 'W': (*info->fprintf_func) (info->stream, "$f%d", @@ -309,6 +420,12 @@ _print_insn_mips (memaddr, word, info) target_processor = 4300; mips_isa = 3; break; + /* start-sanitize-vr4320 */ + case bfd_mach_mips4320: + target_processor = 4320; + mips_isa = 3; + break; + /* end-sanitize-vr4320 */ case bfd_mach_mips4400: target_processor = 4400; mips_isa = 3; @@ -397,6 +514,10 @@ _print_insn_mips (memaddr, word, info) && op->membership & INSN_4010) == 0 && (target_processor == 4100 && op->membership & INSN_4100) == 0 + /* start-sanitize-vr4320 */ + && (target_processor == 4320 + && op->membership & INSN_4320) == 0 + /* end-sanitize-vr4320 */ /* start-sanitize-vr5400 */ && (target_processor == 5400 && op->membership & INSN_5400) == 0 @@ -418,9 +539,24 @@ _print_insn_mips (memaddr, word, info) d = op->args; if (d != NULL && *d != '\0') { - (*info->fprintf_func) (info->stream, "\t"); + /* start-sanitize-r5900 */ + /* If this is an opcode completer, then do not emit + a tab after the opcode. */ + if (*d != '&') + /* end-sanitize-r5900 */ + (*info->fprintf_func) (info->stream, "\t"); for (; *d != '\0'; d++) - print_insn_arg (d, word, memaddr, info); + /* start-sanitize-r5900 */ + /* If this is an escape character, go ahead and print the + next character in the arg string verbatim. */ + if (*d == '%') + { + d++; + (*info->fprintf_func) (info->stream, "%c", *d); + } + else + /* end-sanitize-r5900 */ + print_insn_arg (d, word, memaddr, info); } return 4; |