diff options
author | Richard Sandiford <rdsandiford@googlemail.com> | 2013-08-04 07:31:39 +0000 |
---|---|---|
committer | Richard Sandiford <rdsandiford@googlemail.com> | 2013-08-04 07:31:39 +0000 |
commit | 14daeee3aec3b5e02e2f71303f8c2a78fb3108f4 (patch) | |
tree | b535af4d5838e62a19569276d3182f0658345181 /opcodes/mips-dis.c | |
parent | ba5b2044e819909a3cef85754278b648c65fa9e1 (diff) | |
download | gdb-14daeee3aec3b5e02e2f71303f8c2a78fb3108f4.zip gdb-14daeee3aec3b5e02e2f71303f8c2a78fb3108f4.tar.gz gdb-14daeee3aec3b5e02e2f71303f8c2a78fb3108f4.tar.bz2 |
include/opcode/
2013-08-04 Jürgen Urban <JuergenUrban@gmx.de>
Richard Sandiford <rdsandiford@googlemail.com>
* mips.h: Document new VU0 operand characters.
(OP_VU0_SUFFIX, OP_VU0_MATCH_SUFFIX): New mips_operand_types.
(OP_REG_VF, OP_REG_VI, OP_REG_R5900_I, OP_REG_R5900_Q, OP_REG_R5900_R)
(OP_REG_R5900_ACC): New mips_reg_operand_types.
(INSN2_VU0_CHANNEL_SUFFIX): New macro.
(mips_vu0_channel_mask): Declare.
opcodes/
2013-08-04 Jürgen Urban <JuergenUrban@gmx.de>
Richard Sandiford <rdsandiford@googlemail.com>
* mips-dis.c (print_reg): Handle OP_REG_VI, OP_REG_VF, OP_REG_R5900_I,
OP_REG_R5900_Q, OP_REG_R5900_R and OP_REG_R5900_ACC.
(print_vu0_channel): New function.
(print_insn_arg): Handle OP_VU0_SUFFIX and OP_VU0_MATCH_SUFFIX.
(print_insn_args): Handle '#'.
(print_insn_mips): Handle INSN2_VU0_CHANNEL_SUFFIX.
* mips-opc.c (mips_vu0_channel_mask): New constant.
(decode_mips_operand): Handle new VU0 operand types.
(VU0, VU0CH): New macros.
(mips_builtin_opcodes): Add VU0 opcodes. Use "+7" rather than "E"
for LQC2 and SQC2. Use "+9" rather than "G" for EE CFC2 and CTC2.
Use "+6" rather than "G" for QMFC2 and QMTC2.
gas/
2013-08-04 Jürgen Urban <JuergenUrban@gmx.de>
Richard Sandiford <rdsandiford@googlemail.com>
* config/tc-mips.c (MAX_OPERANDS): Bump to 6.
(RWARN): Bump to 0x8000000.
(RTYPE_VI, RTYPE_VF, RTYPE_R5900_I, RTYPE_R5900_Q, RTYPE_R5900_R)
(RTYPE_R5900_ACC): New register types.
(RTYPE_MASK): Include them.
(R5900_I_NAMES, R5900_Q_NAMES, R5900_R_NAMES, R5900_ACC_NAMES): New
macros.
(reg_names): Include them.
(mips_parse_register_1): New function, split out from...
(mips_parse_register): ...here. Add a channels_ptr parameter.
Look for VU0 channel suffixes when nonnull.
(reg_lookup): Update the call to mips_parse_register.
(mips_parse_vu0_channels): New function.
(OT_CHANNELS, OT_DOUBLE_CHAR): New mips_operand_token_types.
(mips_operand_token): Add a "channels" field to the union.
Extend the comment above "ch" to OT_DOUBLE_CHAR.
(mips_parse_base_start): Match -- and ++. Handle channel suffixes.
(mips_parse_argument_token): Handle channel suffixes here too.
(validate_mips_insn): Handle INSN2_VU0_CHANNEL_SUFFIX.
Ignore OP_VU0_MATCH_SUFFIX when calculating the used bits.
Handle '#' formats.
(md_begin): Register $vfN and $vfI registers.
(operand_reg_mask): Handle OP_VU0_SUFFIX and OP_VU0_MATCH_SUFFIX.
(convert_reg_type): Handle OP_REG_VI, OP_REG_VF, OP_REG_R5900_I,
OP_REG_R5900_Q, OP_REG_R5900_R and OP_REG_R5900_ACC.
(match_vu0_suffix_operand): New function.
(match_operand): Handle OP_VU0_SUFFIX and OP_VU0_MATCH_SUFFIX.
(macro): Use "+7" rather than "E" for LDQ2 and STQ2.
(mips_lookup_insn): New function.
(mips_ip): Use it. Allow "+K" operands to be elided at the end
of an instruction. Handle '#' sequences.
gas/testsuite/
2013-08-04 Jürgen Urban <JuergenUrban@gmx.de>
* gas/mips/r5900-vu0.d: Expect $vfN and $viN instead of numeric
coprocessor registers.
* gas/mips/r5900-all-vu0.s, gas/mips/r5900-all-vu0.d,
gas/mips/r5900-full-vu0.s, gas/mips/r5900-full-vu0.d,
gas/mips/r5900-error-vu0.s, gas/mips/r5900-error-vu0.l: New tests.
* gas/mips/mips.exp: Run them.
Diffstat (limited to 'opcodes/mips-dis.c')
-rw-r--r-- | opcodes/mips-dis.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/opcodes/mips-dis.c b/opcodes/mips-dis.c index 6d816a1..1d1c724 100644 --- a/opcodes/mips-dis.c +++ b/opcodes/mips-dis.c @@ -917,6 +917,30 @@ print_reg (struct disassemble_info *info, const struct mips_opcode *opcode, case OP_REG_HW: info->fprintf_func (info->stream, "%s", mips_hwr_names[regno]); break; + + case OP_REG_VF: + info->fprintf_func (info->stream, "$vf%d", regno); + break; + + case OP_REG_VI: + info->fprintf_func (info->stream, "$vi%d", regno); + break; + + case OP_REG_R5900_I: + info->fprintf_func (info->stream, "$I"); + break; + + case OP_REG_R5900_Q: + info->fprintf_func (info->stream, "$Q"); + break; + + case OP_REG_R5900_R: + info->fprintf_func (info->stream, "$R"); + break; + + case OP_REG_R5900_ACC: + info->fprintf_func (info->stream, "$ACC"); + break; } } @@ -941,6 +965,25 @@ init_print_arg_state (struct mips_print_arg_state *state) memset (state, 0, sizeof (*state)); } +/* Print OP_VU0_SUFFIX or OP_VU0_MATCH_SUFFIX operand OPERAND, + whose value is given by UVAL. */ + +static void +print_vu0_channel (struct disassemble_info *info, + const struct mips_operand *operand, unsigned int uval) +{ + if (operand->size == 4) + info->fprintf_func (info->stream, "%s%s%s%s", + uval & 8 ? "x" : "", + uval & 4 ? "y" : "", + uval & 2 ? "z" : "", + uval & 1 ? "w" : ""); + else if (operand->size == 2) + info->fprintf_func (info->stream, "%c", "xyzw"[uval]); + else + abort (); +} + /* Print operand OPERAND of OPCODE, using STATE to track inter-operand state. UVAL is the encoding of the operand (shifted into bit 0) and BASE_PC is the base address for OP_PCREL operands. */ @@ -1201,6 +1244,11 @@ print_insn_arg (struct disassemble_info *info, case OP_PC: infprintf (is, "$pc"); break; + + case OP_VU0_SUFFIX: + case OP_VU0_MATCH_SUFFIX: + print_vu0_channel (info, operand, uval); + break; } } @@ -1231,6 +1279,11 @@ print_insn_args (struct disassemble_info *info, infprintf (is, "%c", *s); break; + case '#': + ++s; + infprintf (is, "%c%c", *s, *s); + break; + default: operand = decode_operand (s); if (!operand) @@ -1365,6 +1418,14 @@ print_insn_mips (bfd_vma memaddr, info->insn_type = dis_dref; infprintf (is, "%s", op->name); + if (op->pinfo2 & INSN2_VU0_CHANNEL_SUFFIX) + { + unsigned int uval; + + infprintf (is, "."); + uval = mips_extract_operand (&mips_vu0_channel_mask, word); + print_vu0_channel (info, &mips_vu0_channel_mask, uval); + } if (op->args[0]) { |