[ gas/ChangeLog ]

2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
            Ed Satterthwaite  <ehs@broadcom.com>

	* config/tc-mips.c (mips_set_options): New "ase_mdmx" member.
	(mips_opts): Initialize "ase_mdmx" member.
	(file_ase_mdmx): New variable.
	(CPU_HAS_MDMX): New macro.
	(md_begin): Initialize mips_opts.ase_mdmx and file_ase_mdmx
	based on command line options and configuration defaults.
	(macro_build): Note in comment that use of MDMX in macros is
	not currently allowed.
	(validate_mips_insn): Add support for the "O", "Q", "X", "Y", and
	"Z" MDMX operand types.
	(mips_ip): Accept MDMX instructions if mips_opts.ase_mdmx is set,
	and add support for the "O", "Q", "X", "Y", and "Z" MDMX operand
	types.
	(OPTION_MDMX, OPTION_NO_MDMX, md_longopts, md_parse_option):
	Add support for "-mdmx" and "-no-mdmx" options.
	(OPTION_ELF_BASE): Move to accomodate new options.
	(s_mipsset): Support ".set mdmx" and ".set nomdmx".
	(mips_elf_final_processing): Set MDMX ASE ELF header flag if
	file_ase_mdmx was set.
	* doc/as.texinfo: Document -mdmx and -no-mdmx options.
	* doc/c-mips.texi: Likewise, and document ".set mdmx" and ".set
	nomdmx" directives.

[ gas/testsuite/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>

	* gas/mips/mips64-mdmx.s: New file.
	* gas/mips/mips64-mdmx.d: Likewise.
	* gas/mips/mips.exp: Run new "mips64-mdmx" test.

[ include/opcode/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>

	* mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL)
	(MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH)
	(MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC)
	(INSN_MDMX): New constants, for MDMX support.
	(opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX.

[ opcodes/ChangeLog ]
2002-05-30  Chris G. Demetriou  <cgd@broadcom.com>
            Ed Satterthwaite  <ehs@broadcom.com>

	* mips-dis.c (print_insn_arg): Add support for 'O', 'Q', 'X', 'Y',
	and 'Z' formats, for MDMX.
        (mips_isa_type): Add MDMX instructions to the ISA
	bit mask for bfd_mach_mipsisa64.
	* mips-opc.c: Add support for MDMX instructions.
	(MX): New definition.

	* mips-dis.c: Update copyright years to include 2002.
This commit is contained in:
Chris Demetriou 2002-05-31 01:17:18 +00:00
parent 2f2c3626c9
commit deec17343c
13 changed files with 889 additions and 15 deletions

View file

@ -1,3 +1,29 @@
2002-05-30 Chris G. Demetriou <cgd@broadcom.com>
Ed Satterthwaite <ehs@broadcom.com>
* config/tc-mips.c (mips_set_options): New "ase_mdmx" member.
(mips_opts): Initialize "ase_mdmx" member.
(file_ase_mdmx): New variable.
(CPU_HAS_MDMX): New macro.
(md_begin): Initialize mips_opts.ase_mdmx and file_ase_mdmx
based on command line options and configuration defaults.
(macro_build): Note in comment that use of MDMX in macros is
not currently allowed.
(validate_mips_insn): Add support for the "O", "Q", "X", "Y", and
"Z" MDMX operand types.
(mips_ip): Accept MDMX instructions if mips_opts.ase_mdmx is set,
and add support for the "O", "Q", "X", "Y", and "Z" MDMX operand
types.
(OPTION_MDMX, OPTION_NO_MDMX, md_longopts, md_parse_option):
Add support for "-mdmx" and "-no-mdmx" options.
(OPTION_ELF_BASE): Move to accomodate new options.
(s_mipsset): Support ".set mdmx" and ".set nomdmx".
(mips_elf_final_processing): Set MDMX ASE ELF header flag if
file_ase_mdmx was set.
* doc/as.texinfo: Document -mdmx and -no-mdmx options.
* doc/c-mips.texi: Likewise, and document ".set mdmx" and ".set
nomdmx" directives.
2002-05-31 Thiemo Seufer <seufer@csv.ica.uni-stuttgart.de>
* config/tc-mips.c (OPTION_NO_M7000_HILO_FIX): Rename to

View file

@ -141,6 +141,7 @@ struct mips_set_options
if they have not been initialized. Changed by `.set <asename>', by
command line options, and based on the default architecture. */
int ase_mips3d;
int ase_mdmx;
/* Whether we are assembling for the mips16 processor. 0 if we are
not, 1 if we are, and -1 if the value has not been initialized.
Changed by `.set mips16' and `.set nomips16', and the -mips16 and
@ -189,7 +190,7 @@ static int file_mips_fp32 = -1;
static struct mips_set_options mips_opts =
{
ISA_UNKNOWN, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
ISA_UNKNOWN, -1, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, NO_ABI
};
/* These variables are filled in with the masks of registers used.
@ -205,6 +206,10 @@ static int file_mips_isa = ISA_UNKNOWN;
command line (e.g., by -march). */
static int file_ase_mips3d;
/* True if -mdmx was passed or implied by arguments passed on the
command line (e.g., by -march). */
static int file_ase_mdmx;
/* The argument of the -mcpu= flag. Historical for code generation. */
static int mips_cpu = CPU_UNKNOWN;
@ -275,6 +280,10 @@ static int mips_32bitmode = 0;
#define CPU_HAS_MIPS3D(cpu) ((cpu) == CPU_SB1 \
)
/* Return true if the given CPU supports the MDMX ASE. */
#define CPU_HAS_MDMX(cpu) (0 \
)
/* Whether the processor uses hardware interlocks to protect
reads from the HI and LO registers, and thus does not
require nops to be inserted. */
@ -1241,6 +1250,8 @@ md_begin ()
generation of code for them. */
if (mips_opts.ase_mips3d == -1 && CPU_HAS_MIPS3D (mips_arch))
mips_opts.ase_mips3d = 1;
if (mips_opts.ase_mdmx == -1 && CPU_HAS_MDMX (mips_arch))
mips_opts.ase_mdmx = 1;
if (! bfd_set_arch_mach (stdoutput, bfd_arch_mips, mips_arch))
as_warn (_("Could not set architecture and machine"));
@ -1253,6 +1264,7 @@ md_begin ()
file_mips_isa = mips_opts.isa;
file_mips_abi = mips_opts.abi;
file_ase_mips3d = mips_opts.ase_mips3d;
file_ase_mdmx = mips_opts.ase_mdmx;
mips_opts.gp32 = file_mips_gp32;
mips_opts.fp32 = file_mips_fp32;
@ -2917,8 +2929,8 @@ macro_build (place, counter, ep, name, fmt, va_alist)
/* Search until we get a match for NAME. */
while (1)
{
/* It is assumed here that macros will never generate
MIPS-3D instructions. */
/* It is assumed here that macros will never generate
MDMX or MIPS-3D instructions. */
if (strcmp (fmt, insn.insn_mo->args) == 0
&& insn.insn_mo->pinfo != INSN_MACRO
&& OPCODE_IS_MEMBER (insn.insn_mo, mips_opts.isa, mips_arch)
@ -7795,11 +7807,17 @@ validate_mips_insn (opc)
case 'L': break;
case 'M': USE_BITS (OP_MASK_CCC, OP_SH_CCC); break;
case 'N': USE_BITS (OP_MASK_BCC, OP_SH_BCC); break;
case 'O': USE_BITS (OP_MASK_ALN, OP_SH_ALN); break;
case 'Q': USE_BITS (OP_MASK_VSEL, OP_SH_VSEL);
USE_BITS (OP_MASK_FT, OP_SH_FT); break;
case 'R': USE_BITS (OP_MASK_FR, OP_SH_FR); break;
case 'S': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
case 'T': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
case 'V': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
case 'W': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
case 'X': USE_BITS (OP_MASK_FD, OP_SH_FD); break;
case 'Y': USE_BITS (OP_MASK_FS, OP_SH_FS); break;
case 'Z': USE_BITS (OP_MASK_FT, OP_SH_FT); break;
case 'a': USE_BITS (OP_MASK_TARGET, OP_SH_TARGET); break;
case 'b': USE_BITS (OP_MASK_RS, OP_SH_RS); break;
case 'c': USE_BITS (OP_MASK_CODE, OP_SH_CODE); break;
@ -7918,6 +7936,7 @@ mips_ip (str, ip)
if (OPCODE_IS_MEMBER (insn,
(mips_opts.isa
| (mips_opts.ase_mdmx ? INSN_MDMX : 0)
| (mips_opts.ase_mips3d ? INSN_MIPS3D : 0)),
mips_arch))
ok = true;
@ -7961,7 +7980,10 @@ mips_ip (str, ip)
insn_error = NULL;
for (args = insn->args;; ++args)
{
int is_mdmx;
s += strspn (s, " \t");
is_mdmx = 0;
switch (*args)
{
case '\0': /* end of args */
@ -8310,6 +8332,47 @@ mips_ip (str, ip)
}
break;
case 'O': /* MDMX alignment immediate constant. */
my_getExpression (&imm_expr, s);
check_absolute_expr (ip, &imm_expr);
if ((unsigned long) imm_expr.X_add_number > OP_MASK_ALN)
{
as_warn ("Improper align amount (%ld), using low bits",
(long) imm_expr.X_add_number);
imm_expr.X_add_number &= OP_MASK_ALN;
}
ip->insn_opcode |= imm_expr.X_add_number << OP_SH_ALN;
imm_expr.X_op = O_absent;
s = expr_end;
continue;
case 'Q': /* MDMX vector, element sel, or const. */
if (s[0] != '$')
{
/* MDMX Immediate. */
my_getExpression (&imm_expr, s);
check_absolute_expr (ip, &imm_expr);
if ((unsigned long) imm_expr.X_add_number > OP_MASK_FT)
{
as_warn (_("Invalid MDMX Immediate (%ld)"),
(long) imm_expr.X_add_number);
imm_expr.X_add_number &= OP_MASK_FT;
}
imm_expr.X_add_number &= OP_MASK_FT;
if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
ip->insn_opcode |= MDMX_FMTSEL_IMM_QH << OP_SH_VSEL;
else
ip->insn_opcode |= MDMX_FMTSEL_IMM_OB << OP_SH_VSEL;
ip->insn_opcode |= imm_expr.X_add_number << OP_SH_FT;
imm_expr.X_op = O_absent;
s = expr_end;
continue;
}
/* Not MDMX Immediate. Fall through. */
case 'X': /* MDMX destination register. */
case 'Y': /* MDMX source register. */
case 'Z': /* MDMX target register. */
is_mdmx = 1;
case 'D': /* floating point destination register */
case 'S': /* floating point source register */
case 'T': /* floating point target register */
@ -8317,8 +8380,11 @@ mips_ip (str, ip)
case 'V':
case 'W':
s_reset = s;
if (s[0] == '$' && s[1] == 'f'
&& ISDIGIT (s[2]))
/* Accept $fN for FP and MDMX register numbers, and in
addition accept $vN for MDMX register numbers. */
if ((s[0] == '$' && s[1] == 'f' && ISDIGIT (s[2]))
|| (is_mdmx != 0 && s[0] == '$' && s[1] == 'v'
&& ISDIGIT (s[2])))
{
s += 2;
regno = 0;
@ -8359,14 +8425,51 @@ mips_ip (str, ip)
switch (c)
{
case 'D':
case 'X':
ip->insn_opcode |= regno << OP_SH_FD;
break;
case 'V':
case 'S':
case 'Y':
ip->insn_opcode |= regno << OP_SH_FS;
break;
case 'Q':
/* This is like 'Z', but also needs to fix the MDMX
vector/scalar select bits. Note that the
scalar immediate case is handled above. */
if (*s == '[')
{
int is_qh = (ip->insn_opcode & (1 << OP_SH_VSEL));
int max_el = (is_qh ? 3 : 7);
s++;
my_getExpression(&imm_expr, s);
check_absolute_expr (ip, &imm_expr);
s = expr_end;
if (imm_expr.X_add_number > max_el)
as_bad(_("Bad element selector %ld"),
(long) imm_expr.X_add_number);
imm_expr.X_add_number &= max_el;
ip->insn_opcode |= (imm_expr.X_add_number
<< (OP_SH_VSEL +
(is_qh ? 2 : 1)));
if (*s != ']')
as_warn(_("Expecting ']' found '%s'"), s);
else
s++;
}
else
{
if (ip->insn_opcode & (OP_MASK_VSEL << OP_SH_VSEL))
ip->insn_opcode |= (MDMX_FMTSEL_VEC_QH
<< OP_SH_VSEL);
else
ip->insn_opcode |= (MDMX_FMTSEL_VEC_OB <<
OP_SH_VSEL);
}
/* Fall through */
case 'W':
case 'T':
case 'Z':
ip->insn_opcode |= regno << OP_SH_FT;
break;
case 'R':
@ -9992,8 +10095,12 @@ struct option md_longopts[] =
{"mips3d", no_argument, NULL, OPTION_MIPS3D},
#define OPTION_NO_MIPS3D (OPTION_MD_BASE + 34)
{"no-mips3d", no_argument, NULL, OPTION_NO_MIPS3D},
#define OPTION_MDMX (OPTION_MD_BASE + 35)
{"mdmx", no_argument, NULL, OPTION_MDMX},
#define OPTION_NO_MDMX (OPTION_MD_BASE + 36)
{"no-mdmx", no_argument, NULL, OPTION_NO_MDMX},
#ifdef OBJ_ELF
#define OPTION_ELF_BASE (OPTION_MD_BASE + 35)
#define OPTION_ELF_BASE (OPTION_MD_BASE + 37)
#define OPTION_CALL_SHARED (OPTION_ELF_BASE + 0)
{"KPIC", no_argument, NULL, OPTION_CALL_SHARED},
{"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
@ -10198,6 +10305,14 @@ md_parse_option (c, arg)
case OPTION_NO_M3900:
break;
case OPTION_MDMX:
mips_opts.ase_mdmx = 1;
break;
case OPTION_NO_MDMX:
mips_opts.ase_mdmx = 0;
break;
case OPTION_MIPS16:
mips_opts.mips16 = 1;
mips_no_prev_insn (false);
@ -11532,6 +11647,10 @@ s_mipsset (x)
{
mips_opts.nobopt = 1;
}
else if (strcmp (name, "mdmx") == 0)
mips_opts.ase_mdmx = 1;
else if (strcmp (name, "nomdmx") == 0)
mips_opts.ase_mdmx = 0;
else if (strcmp (name, "mips16") == 0
|| strcmp (name, "MIPS-16") == 0)
mips_opts.mips16 = 1;
@ -13021,6 +13140,8 @@ mips_elf_final_processing ()
if (file_ase_mips3d)
elf_elfheader (stdoutput)->e_flags |= ???;
#endif
if (file_ase_mdmx)
elf_elfheader (stdoutput)->e_flags |= EF_MIPS_ARCH_ASE_MDMX;
/* Set the MIPS ELF ABI flags. */
if (file_mips_abi == NO_ABI)

View file

@ -375,6 +375,7 @@ gcc(1), ld(1), and the Info entries for @file{binutils} and @file{ld}.
[@b{-mips32}] [@b{-mips64}]
[@b{-m4650}] [@b{-no-m4650}]
[@b{-mips3d}] [@b{-no-mips3d}]
[@b{-mdmx}] [@b{-no-mdmx}]
[@b{--trap}] [@b{--break}] [@b{-n}]
[@b{--emulation}=@var{name} ]
@end ifset
@ -888,6 +889,12 @@ Generate code for the MIPS-3D Application Specific Extension.
This tells the assembler to accept MIPS-3D instructions.
@samp{-no-mips3d} turns off this option.
@item -mdmx
@itemx -no-mdmx
Generate code for the MDMX Application Specific Extension.
This tells the assembler to accept MDMX instructions.
@samp{-no-mdmx} turns off this option.
@item -mcpu=@var{CPU}
Generate code for a particular MIPS cpu. It is exactly equivalent to
@samp{-m@var{cpu}}, except that there are more value of @var{cpu}

View file

@ -105,6 +105,12 @@ Generate code for the MIPS-3D Application Specific Extension.
This tells the assembler to accept MIPS-3D instructions.
@samp{-no-mips3d} turns off this option.
@item -mdmx
@itemx -no-mdmx
Generate code for the MDMX Application Specific Extension.
This tells the assembler to accept MDMX instructions.
@samp{-no-mdmx} turns off this option.
@item -mfix7000
@itemx -mno-fix7000
Cause nops to be inserted if the read of the destination register
@ -343,4 +349,12 @@ from the MIPS-3D Application Specific Extension from that point on
in the assembly. The @code{.set nomips3d} directive prevents MIPS-3D
instructions from being accepted.
@cindex MIPS MDMX instruction generation override
@kindex @code{.set mdmx}
@kindex @code{.set nomdmx}
The directive @code{.set mdmx} makes the assembler accept instructions
from the MDMX Application Specific Extension from that point on
in the assembly. The @code{.set nomdmx} directive prevents MDMX
instructions from being accepted.
Traditional @sc{mips} assemblers do not support these directives.

View file

@ -1,3 +1,9 @@
2002-05-30 Chris G. Demetriou <cgd@broadcom.com>
* gas/mips/mips64-mdmx.s: New file.
* gas/mips/mips64-mdmx.d: Likewise.
* gas/mips/mips.exp: Run new "mips64-mdmx" test.
2002-05-30 Richard Henderson <rth@redhat.com>
* gas/alpha/elf-tls-1.s, gas/alpha/elf-tls-1.d: New.

View file

@ -152,6 +152,7 @@ if { [istarget mips*-*-*] } then {
run_dump_test "mips32"
run_dump_test "mips64"
run_dump_test "mips64-mips3d"
run_dump_test "mips64-mdmx"
run_dump_test "sb1-ext-ps"
# It will always fail until someone fixes it.

View file

@ -0,0 +1,215 @@
#objdump: -dr --prefix-addresses --show-raw-insn -mmips:isa64
#name: MIPS MIPS64 MDMX ASE instructions
#as: -mips64 -mdmx
# Check MIPS64 MDMX ASE instruction assembly and disassembly
.*: +file format .*mips.*
Disassembly of section .text:
0+0000 <[^>]*> 46b46051 movf\.l \$f1,\$f12,\$fcc5
0+0004 <[^>]*> 46b26053 movn\.l \$f1,\$f12,s2
0+0008 <[^>]*> 46b56051 movt\.l \$f1,\$f12,\$fcc5
0+000c <[^>]*> 46b26052 movz\.l \$f1,\$f12,s2
0+0010 <[^>]*> 7ad2604b add\.ob \$v1,\$v12,\$v18
0+0014 <[^>]*> 7ad2604b add\.ob \$v1,\$v12,\$v18
0+0018 <[^>]*> 7992604b add\.ob \$v1,\$v12,\$v18\[6\]
0+001c <[^>]*> 7bb2604b add\.qh \$v1,\$v12,0x12
0+0020 <[^>]*> 7932604b add\.qh \$v1,\$v12,\$v18\[2\]
0+0024 <[^>]*> 7bb2604b add\.qh \$v1,\$v12,0x12
0+0028 <[^>]*> 7ad26037 adda\.ob \$v12,\$v18
0+002c <[^>]*> 7ad26037 adda\.ob \$v12,\$v18
0+0030 <[^>]*> 79926037 adda\.ob \$v12,\$v18\[6\]
0+0034 <[^>]*> 7ab26037 adda\.qh \$v12,\$v18
0+0038 <[^>]*> 7ab26037 adda\.qh \$v12,\$v18
0+003c <[^>]*> 79326037 adda\.qh \$v12,\$v18\[2\]
0+0040 <[^>]*> 7ad26437 addl\.ob \$v12,\$v18
0+0044 <[^>]*> 7ad26437 addl\.ob \$v12,\$v18
0+0048 <[^>]*> 79926437 addl\.ob \$v12,\$v18\[6\]
0+004c <[^>]*> 7ab26437 addl\.qh \$v12,\$v18
0+0050 <[^>]*> 7ab26437 addl\.qh \$v12,\$v18
0+0054 <[^>]*> 79326437 addl\.qh \$v12,\$v18\[2\]
0+0058 <[^>]*> 78d26058 alni\.ob \$v1,\$v12,\$v18,6
0+005c <[^>]*> 7852605a alni\.qh \$v1,\$v12,\$v18,2
0+0060 <[^>]*> 7ab26059 alnv\.ob \$v1,\$v12,\$v18,s5
0+0064 <[^>]*> 7ab2605b alnv\.qh \$v1,\$v12,\$v18,s5
0+0068 <[^>]*> 7ad2604c and\.ob \$v1,\$v12,\$v18
0+006c <[^>]*> 7ad2604c and\.ob \$v1,\$v12,\$v18
0+0070 <[^>]*> 7992604c and\.ob \$v1,\$v12,\$v18\[6\]
0+0074 <[^>]*> 7bb2604c and\.qh \$v1,\$v12,0x12
0+0078 <[^>]*> 7932604c and\.qh \$v1,\$v12,\$v18\[2\]
0+007c <[^>]*> 7bb2604c and\.qh \$v1,\$v12,0x12
0+0080 <[^>]*> 7ad26001 c\.eq\.ob \$v12,\$v18
0+0084 <[^>]*> 7ad26001 c\.eq\.ob \$v12,\$v18
0+0088 <[^>]*> 79926001 c\.eq\.ob \$v12,\$v18\[6\]
0+008c <[^>]*> 7ab26001 c\.eq\.qh \$v12,\$v18
0+0090 <[^>]*> 7ab26001 c\.eq\.qh \$v12,\$v18
0+0094 <[^>]*> 79326001 c\.eq\.qh \$v12,\$v18\[2\]
0+0098 <[^>]*> 7ad26005 c\.le\.ob \$v12,\$v18
0+009c <[^>]*> 7ad26005 c\.le\.ob \$v12,\$v18
0+00a0 <[^>]*> 79926005 c\.le\.ob \$v12,\$v18\[6\]
0+00a4 <[^>]*> 7ab26005 c\.le\.qh \$v12,\$v18
0+00a8 <[^>]*> 7ab26005 c\.le\.qh \$v12,\$v18
0+00ac <[^>]*> 79326005 c\.le\.qh \$v12,\$v18\[2\]
0+00b0 <[^>]*> 7ad26004 c\.lt\.ob \$v12,\$v18
0+00b4 <[^>]*> 7ad26004 c\.lt\.ob \$v12,\$v18
0+00b8 <[^>]*> 79926004 c\.lt\.ob \$v12,\$v18\[6\]
0+00bc <[^>]*> 7ab26004 c\.lt\.qh \$v12,\$v18
0+00c0 <[^>]*> 7ab26004 c\.lt\.qh \$v12,\$v18
0+00c4 <[^>]*> 79326004 c\.lt\.qh \$v12,\$v18\[2\]
0+00c8 <[^>]*> 7ad26047 max\.ob \$v1,\$v12,\$v18
0+00cc <[^>]*> 7ad26047 max\.ob \$v1,\$v12,\$v18
0+00d0 <[^>]*> 79926047 max\.ob \$v1,\$v12,\$v18\[6\]
0+00d4 <[^>]*> 7bb26047 max\.qh \$v1,\$v12,0x12
0+00d8 <[^>]*> 79326047 max\.qh \$v1,\$v12,\$v18\[2\]
0+00dc <[^>]*> 7bb26047 max\.qh \$v1,\$v12,0x12
0+00e0 <[^>]*> 7ad26046 min\.ob \$v1,\$v12,\$v18
0+00e4 <[^>]*> 7ad26046 min\.ob \$v1,\$v12,\$v18
0+00e8 <[^>]*> 79926046 min\.ob \$v1,\$v12,\$v18\[6\]
0+00ec <[^>]*> 7bb26046 min\.qh \$v1,\$v12,0x12
0+00f0 <[^>]*> 79326046 min\.qh \$v1,\$v12,\$v18\[2\]
0+00f4 <[^>]*> 7bb26046 min\.qh \$v1,\$v12,0x12
0+00f8 <[^>]*> 7bb26040 msgn\.qh \$v1,\$v12,0x12
0+00fc <[^>]*> 79326040 msgn\.qh \$v1,\$v12,\$v18\[2\]
0+0100 <[^>]*> 7bb26040 msgn\.qh \$v1,\$v12,0x12
0+0104 <[^>]*> 7ad26070 mul\.ob \$v1,\$v12,\$v18
0+0108 <[^>]*> 7ad26070 mul\.ob \$v1,\$v12,\$v18
0+010c <[^>]*> 79926070 mul\.ob \$v1,\$v12,\$v18\[6\]
0+0110 <[^>]*> 7bb26070 mul\.qh \$v1,\$v12,0x12
0+0114 <[^>]*> 79326070 mul\.qh \$v1,\$v12,\$v18\[2\]
0+0118 <[^>]*> 7bb26070 mul\.qh \$v1,\$v12,0x12
0+011c <[^>]*> 7ad26033 mula\.ob \$v12,\$v18
0+0120 <[^>]*> 7ad26033 mula\.ob \$v12,\$v18
0+0124 <[^>]*> 79926033 mula\.ob \$v12,\$v18\[6\]
0+0128 <[^>]*> 7ab26033 mula\.qh \$v12,\$v18
0+012c <[^>]*> 7ab26033 mula\.qh \$v12,\$v18
0+0130 <[^>]*> 79326033 mula\.qh \$v12,\$v18\[2\]
0+0134 <[^>]*> 7ad26433 mull\.ob \$v12,\$v18
0+0138 <[^>]*> 7ad26433 mull\.ob \$v12,\$v18
0+013c <[^>]*> 79926433 mull\.ob \$v12,\$v18\[6\]
0+0140 <[^>]*> 7ab26433 mull\.qh \$v12,\$v18
0+0144 <[^>]*> 7ab26433 mull\.qh \$v12,\$v18
0+0148 <[^>]*> 79326433 mull\.qh \$v12,\$v18\[2\]
0+014c <[^>]*> 7ad26032 muls\.ob \$v12,\$v18
0+0150 <[^>]*> 7ad26032 muls\.ob \$v12,\$v18
0+0154 <[^>]*> 79926032 muls\.ob \$v12,\$v18\[6\]
0+0158 <[^>]*> 7ab26032 muls\.qh \$v12,\$v18
0+015c <[^>]*> 7ab26032 muls\.qh \$v12,\$v18
0+0160 <[^>]*> 79326032 muls\.qh \$v12,\$v18\[2\]
0+0164 <[^>]*> 7ad26432 mulsl\.ob \$v12,\$v18
0+0168 <[^>]*> 7ad26432 mulsl\.ob \$v12,\$v18
0+016c <[^>]*> 79926432 mulsl\.ob \$v12,\$v18\[6\]
0+0170 <[^>]*> 7ab26432 mulsl\.qh \$v12,\$v18
0+0174 <[^>]*> 7ab26432 mulsl\.qh \$v12,\$v18
0+0178 <[^>]*> 79326432 mulsl\.qh \$v12,\$v18\[2\]
0+017c <[^>]*> 7ad2604f nor\.ob \$v1,\$v12,\$v18
0+0180 <[^>]*> 7ad2604f nor\.ob \$v1,\$v12,\$v18
0+0184 <[^>]*> 7992604f nor\.ob \$v1,\$v12,\$v18\[6\]
0+0188 <[^>]*> 7bb2604f nor\.qh \$v1,\$v12,0x12
0+018c <[^>]*> 7932604f nor\.qh \$v1,\$v12,\$v18\[2\]
0+0190 <[^>]*> 7bb2604f nor\.qh \$v1,\$v12,0x12
0+0194 <[^>]*> 7ad2604e or\.ob \$v1,\$v12,\$v18
0+0198 <[^>]*> 7ad2604e or\.ob \$v1,\$v12,\$v18
0+019c <[^>]*> 7992604e or\.ob \$v1,\$v12,\$v18\[6\]
0+01a0 <[^>]*> 7bb2604e or\.qh \$v1,\$v12,0x12
0+01a4 <[^>]*> 7932604e or\.qh \$v1,\$v12,\$v18\[2\]
0+01a8 <[^>]*> 7bb2604e or\.qh \$v1,\$v12,0x12
0+01ac <[^>]*> 7ad26042 pickf\.ob \$v1,\$v12,\$v18
0+01b0 <[^>]*> 7ad26042 pickf\.ob \$v1,\$v12,\$v18
0+01b4 <[^>]*> 79926042 pickf\.ob \$v1,\$v12,\$v18\[6\]
0+01b8 <[^>]*> 7bb26042 pickf\.qh \$v1,\$v12,0x12
0+01bc <[^>]*> 79326042 pickf\.qh \$v1,\$v12,\$v18\[2\]
0+01c0 <[^>]*> 7bb26042 pickf\.qh \$v1,\$v12,0x12
0+01c4 <[^>]*> 7ad26043 pickt\.ob \$v1,\$v12,\$v18
0+01c8 <[^>]*> 7ad26043 pickt\.ob \$v1,\$v12,\$v18
0+01cc <[^>]*> 79926043 pickt\.ob \$v1,\$v12,\$v18\[6\]
0+01d0 <[^>]*> 7bb26043 pickt\.qh \$v1,\$v12,0x12
0+01d4 <[^>]*> 79326043 pickt\.qh \$v1,\$v12,\$v18\[2\]
0+01d8 <[^>]*> 7bb26043 pickt\.qh \$v1,\$v12,0x12
0+01dc <[^>]*> 7a00007f rach\.ob \$v1
0+01e0 <[^>]*> 7a20007f rach\.qh \$v1
0+01e4 <[^>]*> 7800007f racl\.ob \$v1
0+01e8 <[^>]*> 7820007f racl\.qh \$v1
0+01ec <[^>]*> 7900007f racm\.ob \$v1
0+01f0 <[^>]*> 7920007f racm\.qh \$v1
0+01f4 <[^>]*> 7bb20065 rnas\.qh \$v1,0x12
0+01f8 <[^>]*> 79320065 rnas\.qh \$v1,\$v18\[2\]
0+01fc <[^>]*> 7bb20065 rnas\.qh \$v1,0x12
0+0200 <[^>]*> 7bd20061 rnau\.ob \$v1,0x12
0+0204 <[^>]*> 78920061 rnau\.ob \$v1,\$v18\[2\]
0+0208 <[^>]*> 7bd20061 rnau\.ob \$v1,0x12
0+020c <[^>]*> 7bb20061 rnau\.qh \$v1,0x12
0+0210 <[^>]*> 79320061 rnau\.qh \$v1,\$v18\[2\]
0+0214 <[^>]*> 7bb20061 rnau\.qh \$v1,0x12
0+0218 <[^>]*> 7bb20066 rnes\.qh \$v1,0x12
0+021c <[^>]*> 79320066 rnes\.qh \$v1,\$v18\[2\]
0+0220 <[^>]*> 7bb20066 rnes\.qh \$v1,0x12
0+0224 <[^>]*> 7bd20062 rneu\.ob \$v1,0x12
0+0228 <[^>]*> 78920062 rneu\.ob \$v1,\$v18\[2\]
0+022c <[^>]*> 7bd20062 rneu\.ob \$v1,0x12
0+0230 <[^>]*> 7bb20062 rneu\.qh \$v1,0x12
0+0234 <[^>]*> 79320062 rneu\.qh \$v1,\$v18\[2\]
0+0238 <[^>]*> 7bb20062 rneu\.qh \$v1,0x12
0+023c <[^>]*> 7bb20064 rzs\.qh \$v1,0x12
0+0240 <[^>]*> 79320064 rzs\.qh \$v1,\$v18\[2\]
0+0244 <[^>]*> 7bb20064 rzs\.qh \$v1,0x12
0+0248 <[^>]*> 7bd20060 rzu\.ob \$v1,0x12
0+024c <[^>]*> 78920060 rzu\.ob \$v1,\$v18\[2\]
0+0250 <[^>]*> 7bd20060 rzu\.ob \$v1,0x12
0+0254 <[^>]*> 7bb20060 rzu\.qh \$v1,0x12
0+0258 <[^>]*> 79320060 rzu\.qh \$v1,\$v18\[2\]
0+025c <[^>]*> 7bb20060 rzu\.qh \$v1,0x12
0+0260 <[^>]*> 7a32605f shfl\.bfla\.qh \$v1,\$v12,\$v18
0+0264 <[^>]*> 7992605f shfl\.mixh\.ob \$v1,\$v12,\$v18
0+0268 <[^>]*> 7832605f shfl\.mixh\.qh \$v1,\$v12,\$v18
0+026c <[^>]*> 79d2605f shfl\.mixl\.ob \$v1,\$v12,\$v18
0+0270 <[^>]*> 78b2605f shfl\.mixl\.qh \$v1,\$v12,\$v18
0+0274 <[^>]*> 7912605f shfl\.pach\.ob \$v1,\$v12,\$v18
0+0278 <[^>]*> 7932605f shfl\.pach\.qh \$v1,\$v12,\$v18
0+027c <[^>]*> 7b32605f shfl\.repa\.qh \$v1,\$v12,\$v18
0+0280 <[^>]*> 7bb2605f shfl\.repb\.qh \$v1,\$v12,\$v18
0+0284 <[^>]*> 78d2605f shfl\.upsl\.ob \$v1,\$v12,\$v18
0+0288 <[^>]*> 7ad26050 sll\.ob \$v1,\$v12,\$v18
0+028c <[^>]*> 7ad26050 sll\.ob \$v1,\$v12,\$v18
0+0290 <[^>]*> 79926050 sll\.ob \$v1,\$v12,\$v18\[6\]
0+0294 <[^>]*> 7bb26050 sll\.qh \$v1,\$v12,0x12
0+0298 <[^>]*> 79326050 sll\.qh \$v1,\$v12,\$v18\[2\]
0+029c <[^>]*> 7bb26050 sll\.qh \$v1,\$v12,0x12
0+02a0 <[^>]*> 7bb26053 sra\.qh \$v1,\$v12,0x12
0+02a4 <[^>]*> 79326053 sra\.qh \$v1,\$v12,\$v18\[2\]
0+02a8 <[^>]*> 7bb26053 sra\.qh \$v1,\$v12,0x12
0+02ac <[^>]*> 7ad26052 srl\.ob \$v1,\$v12,\$v18
0+02b0 <[^>]*> 7ad26052 srl\.ob \$v1,\$v12,\$v18
0+02b4 <[^>]*> 79926052 srl\.ob \$v1,\$v12,\$v18\[6\]
0+02b8 <[^>]*> 7bb26052 srl\.qh \$v1,\$v12,0x12
0+02bc <[^>]*> 79326052 srl\.qh \$v1,\$v12,\$v18\[2\]
0+02c0 <[^>]*> 7bb26052 srl\.qh \$v1,\$v12,0x12
0+02c4 <[^>]*> 7ad2604a sub\.ob \$v1,\$v12,\$v18
0+02c8 <[^>]*> 7ad2604a sub\.ob \$v1,\$v12,\$v18
0+02cc <[^>]*> 7992604a sub\.ob \$v1,\$v12,\$v18\[6\]
0+02d0 <[^>]*> 7bb2604a sub\.qh \$v1,\$v12,0x12
0+02d4 <[^>]*> 7932604a sub\.qh \$v1,\$v12,\$v18\[2\]
0+02d8 <[^>]*> 7bb2604a sub\.qh \$v1,\$v12,0x12
0+02dc <[^>]*> 7ad26036 suba\.ob \$v12,\$v18
0+02e0 <[^>]*> 7ad26036 suba\.ob \$v12,\$v18
0+02e4 <[^>]*> 79926036 suba\.ob \$v12,\$v18\[6\]
0+02e8 <[^>]*> 7ab26036 suba\.qh \$v12,\$v18
0+02ec <[^>]*> 7ab26036 suba\.qh \$v12,\$v18
0+02f0 <[^>]*> 79326036 suba\.qh \$v12,\$v18\[2\]
0+02f4 <[^>]*> 7ad26436 subl\.ob \$v12,\$v18
0+02f8 <[^>]*> 7ad26436 subl\.ob \$v12,\$v18
0+02fc <[^>]*> 79926436 subl\.ob \$v12,\$v18\[6\]
0+0300 <[^>]*> 7ab26436 subl\.qh \$v12,\$v18
0+0304 <[^>]*> 7ab26436 subl\.qh \$v12,\$v18
0+0308 <[^>]*> 79326436 subl\.qh \$v12,\$v18\[2\]
0+030c <[^>]*> 7a00603e wach\.ob \$v12
0+0310 <[^>]*> 7a20603e wach\.qh \$v12
0+0314 <[^>]*> 7812603e wacl\.ob \$v12,\$v18
0+0318 <[^>]*> 7832603e wacl\.qh \$v12,\$v18
0+031c <[^>]*> 7ad2604d xor\.ob \$v1,\$v12,\$v18
0+0320 <[^>]*> 7ad2604d xor\.ob \$v1,\$v12,\$v18
0+0324 <[^>]*> 7992604d xor\.ob \$v1,\$v12,\$v18\[6\]
0+0328 <[^>]*> 7bb2604d xor\.qh \$v1,\$v12,0x12
0+032c <[^>]*> 7932604d xor\.qh \$v1,\$v12,\$v18\[2\]
0+0330 <[^>]*> 7bb2604d xor\.qh \$v1,\$v12,0x12
\.\.\.

View file

@ -0,0 +1,299 @@
# source file to test assembly of MIPS64 MDMX ASE instructions
.set noreorder
.set noat
.globl text_label .text
text_label:
movf.l $v1, $v12, $fcc5
movn.l $v1, $v12, $18
movt.l $v1, $v12, $fcc5
movz.l $v1, $v12, $18
add.ob $v1, $v12, $v18
add.ob $v1, $v12, $v18
add.ob $v1, $v12, $v18[6]
add.qh $v1, $v12, 18
add.qh $v1, $v12, $v18[2]
add.qh $v1, $v12, 18
adda.ob $v12, $v18
adda.ob $v12, $v18
adda.ob $v12, $v18[6]
adda.qh $v12, $v18
adda.qh $v12, $v18
adda.qh $v12, $v18[2]
addl.ob $v12, $v18
addl.ob $v12, $v18
addl.ob $v12, $v18[6]
addl.qh $v12, $v18
addl.qh $v12, $v18
addl.qh $v12, $v18[2]
alni.ob $v1, $v12, $v18, 6
alni.qh $v1, $v12, $v18, 2
alnv.ob $v1, $v12, $v18, $21
alnv.qh $v1, $v12, $v18, $21
and.ob $v1, $v12, $v18
and.ob $v1, $v12, $v18
and.ob $v1, $v12, $v18[6]
and.qh $v1, $v12, 18
and.qh $v1, $v12, $v18[2]
and.qh $v1, $v12, 18
c.eq.ob $v12, $v18
c.eq.ob $v12, $v18
c.eq.ob $v12, $v18[6]
c.eq.qh $v12, $v18
c.eq.qh $v12, $v18
c.eq.qh $v12, $v18[2]
c.le.ob $v12, $v18
c.le.ob $v12, $v18
c.le.ob $v12, $v18[6]
c.le.qh $v12, $v18
c.le.qh $v12, $v18
c.le.qh $v12, $v18[2]
c.lt.ob $v12, $v18
c.lt.ob $v12, $v18
c.lt.ob $v12, $v18[6]
c.lt.qh $v12, $v18
c.lt.qh $v12, $v18
c.lt.qh $v12, $v18[2]
max.ob $v1, $v12, $v18
max.ob $v1, $v12, $v18
max.ob $v1, $v12, $v18[6]
max.qh $v1, $v12, 18
max.qh $v1, $v12, $v18[2]
max.qh $v1, $v12, 18
min.ob $v1, $v12, $v18
min.ob $v1, $v12, $v18
min.ob $v1, $v12, $v18[6]
min.qh $v1, $v12, 18
min.qh $v1, $v12, $v18[2]
min.qh $v1, $v12, 18
msgn.qh $v1, $v12, 18
msgn.qh $v1, $v12, $v18[2]
msgn.qh $v1, $v12, 18
mul.ob $v1, $v12, $v18
mul.ob $v1, $v12, $v18
mul.ob $v1, $v12, $v18[6]
mul.qh $v1, $v12, 18
mul.qh $v1, $v12, $v18[2]
mul.qh $v1, $v12, 18
mula.ob $v12, $v18
mula.ob $v12, $v18
mula.ob $v12, $v18[6]
mula.qh $v12, $v18
mula.qh $v12, $v18
mula.qh $v12, $v18[2]
mull.ob $v12, $v18
mull.ob $v12, $v18
mull.ob $v12, $v18[6]
mull.qh $v12, $v18
mull.qh $v12, $v18
mull.qh $v12, $v18[2]
muls.ob $v12, $v18
muls.ob $v12, $v18
muls.ob $v12, $v18[6]
muls.qh $v12, $v18
muls.qh $v12, $v18
muls.qh $v12, $v18[2]
mulsl.ob $v12, $v18
mulsl.ob $v12, $v18
mulsl.ob $v12, $v18[6]
mulsl.qh $v12, $v18
mulsl.qh $v12, $v18
mulsl.qh $v12, $v18[2]
nor.ob $v1, $v12, $v18
nor.ob $v1, $v12, $v18
nor.ob $v1, $v12, $v18[6]
nor.qh $v1, $v12, 18
nor.qh $v1, $v12, $v18[2]
nor.qh $v1, $v12, 18
or.ob $v1, $v12, $v18
or.ob $v1, $v12, $v18
or.ob $v1, $v12, $v18[6]
or.qh $v1, $v12, 18
or.qh $v1, $v12, $v18[2]
or.qh $v1, $v12, 18
pickf.ob $v1, $v12, $v18
pickf.ob $v1, $v12, $v18
pickf.ob $v1, $v12, $v18[6]
pickf.qh $v1, $v12, 18
pickf.qh $v1, $v12, $v18[2]
pickf.qh $v1, $v12, 18
pickt.ob $v1, $v12, $v18
pickt.ob $v1, $v12, $v18
pickt.ob $v1, $v12, $v18[6]
pickt.qh $v1, $v12, 18
pickt.qh $v1, $v12, $v18[2]
pickt.qh $v1, $v12, 18
rach.ob $v1
rach.qh $v1
racl.ob $v1
racl.qh $v1
racm.ob $v1
racm.qh $v1
rnas.qh $v1, 18
rnas.qh $v1, $v18[2]
rnas.qh $v1, 18
rnau.ob $v1, 18
rnau.ob $v1, $v18[2]
rnau.ob $v1, 18
rnau.qh $v1, 18
rnau.qh $v1, $v18[2]
rnau.qh $v1, 18
rnes.qh $v1, 18
rnes.qh $v1, $v18[2]
rnes.qh $v1, 18
rneu.ob $v1, 18
rneu.ob $v1, $v18[2]
rneu.ob $v1, 18
rneu.qh $v1, 18
rneu.qh $v1, $v18[2]
rneu.qh $v1, 18
rzs.qh $v1, 18
rzs.qh $v1, $v18[2]
rzs.qh $v1, 18
rzu.ob $v1, 18
rzu.ob $v1, $v18[2]
rzu.ob $v1, 18
rzu.qh $v1, 18
rzu.qh $v1, $v18[2]
rzu.qh $v1, 18
shfl.bfla.qh $v1, $v12, $v18
shfl.mixh.ob $v1, $v12, $v18
shfl.mixh.qh $v1, $v12, $v18
shfl.mixl.ob $v1, $v12, $v18
shfl.mixl.qh $v1, $v12, $v18
shfl.pach.ob $v1, $v12, $v18
shfl.pach.qh $v1, $v12, $v18
shfl.repa.qh $v1, $v12, $v18
shfl.repb.qh $v1, $v12, $v18
shfl.upsl.ob $v1, $v12, $v18
sll.ob $v1, $v12, $v18
sll.ob $v1, $v12, $v18
sll.ob $v1, $v12, $v18[6]
sll.qh $v1, $v12, 18
sll.qh $v1, $v12, $v18[2]
sll.qh $v1, $v12, 18
sra.qh $v1, $v12, 18
sra.qh $v1, $v12, $v18[2]
sra.qh $v1, $v12, 18
srl.ob $v1, $v12, $v18
srl.ob $v1, $v12, $v18
srl.ob $v1, $v12, $v18[6]
srl.qh $v1, $v12, 18
srl.qh $v1, $v12, $v18[2]
srl.qh $v1, $v12, 18
sub.ob $v1, $v12, $v18
sub.ob $v1, $v12, $v18
sub.ob $v1, $v12, $v18[6]
sub.qh $v1, $v12, 18
sub.qh $v1, $v12, $v18[2]
sub.qh $v1, $v12, 18
suba.ob $v12, $v18
suba.ob $v12, $v18
suba.ob $v12, $v18[6]
suba.qh $v12, $v18
suba.qh $v12, $v18
suba.qh $v12, $v18[2]
subl.ob $v12, $v18
subl.ob $v12, $v18
subl.ob $v12, $v18[6]
subl.qh $v12, $v18
subl.qh $v12, $v18
subl.qh $v12, $v18[2]
wach.ob $v12
wach.qh $v12
wacl.ob $v12, $v18
wacl.qh $v12, $v18
xor.ob $v1, $v12, $v18
xor.ob $v1, $v12, $v18
xor.ob $v1, $v12, $v18[6]
xor.qh $v1, $v12, 18
xor.qh $v1, $v12, $v18[2]
xor.qh $v1, $v12, 18
# Force at least 8 (non-delay-slot) zero bytes, to make 'objdump' print ...
.space 8

View file

@ -1,3 +1,11 @@
2002-05-30 Chris G. Demetriou <cgd@broadcom.com>
* mips.h (OP_SH_ALN, OP_MASK_ALN, OP_SH_VSEL, OP_MASK_VSEL)
(MDMX_FMTSEL_IMM_QH, MDMX_FMTSEL_IMM_OB, MDMX_FMTSEL_VEC_QH)
(MDMX_FMTSEL_VEC_OB, INSN_READ_MDMX_ACC, INSN_WRITE_MDMX_ACC)
(INSN_MDMX): New constants, for MDMX support.
(opcode character list): Add "O", "Q", "X", "Y", and "Z" for MDMX.
2002-05-28 Kuang Hwa Lin <kuang@sbcglobal.net>
* dlx.h: New file.

View file

@ -133,6 +133,16 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
#define OP_MASK_SEL 0x7 /* The sel field of mfcZ and mtcZ. */
#define OP_SH_CODE19 6 /* 19 bit wait code. */
#define OP_MASK_CODE19 0x7ffff
#define OP_SH_ALN 21
#define OP_MASK_ALN 0x7
#define OP_SH_VSEL 21
#define OP_MASK_VSEL 0x1f
/* Values in the 'VSEL' field. */
#define MDMX_FMTSEL_IMM_QH 0x1d
#define MDMX_FMTSEL_IMM_OB 0x1e
#define MDMX_FMTSEL_VEC_QH 0x15
#define MDMX_FMTSEL_VEC_OB 0x16
/* This structure holds information for a particular instruction. */
@ -220,13 +230,21 @@ struct mips_opcode
"f" 32 bit floating point constant
"l" 32 bit floating point constant in .lit4
MDMX instruction operands (note that while these use the FP register
fields, they accept both $fN and $vN names for the registers):
"O" MDMX alignment offset (OP_*_ALN)
"Q" MDMX vector/scalar/immediate source (OP_*_VSEL and OP_*_FT)
"X" MDMX destination register (OP_*_FD)
"Y" MDMX source register (OP_*_FS)
"Z" MDMX source register (OP_*_FT)
Other:
"()" parens surrounding optional value
"," separates operands
Characters used so far, for quick reference when adding more:
"<>(),"
"ABCDEFGHIJLMNPRSTUVW"
"ABCDEFGHIJLMNOPQRSTUVWXYZ"
"abcdfhijklopqrstuvwxz"
*/
@ -297,6 +315,10 @@ struct mips_opcode
#define INSN_MULT 0x40000000
/* Instruction synchronize shared memory. */
#define INSN_SYNC 0x80000000
/* Instruction reads MDMX accumulator. XXX FIXME: No bits left! */
#define INSN_READ_MDMX_ACC 0
/* Instruction writes MDMX accumulator. XXX FIXME: No bits left! */
#define INSN_WRITE_MDMX_ACC 0
/* Instruction is actually a macro. It should be ignored by the
disassembler, and requires special treatment by the assembler. */
@ -320,6 +342,8 @@ struct mips_opcode
/* MIPS-3D ASE */
#define INSN_MIPS3D 0x00004000
/* MDMX ASE */
#define INSN_MDMX 0x00008000
/* Chip specific instructions. These are bitmasks. */

View file

@ -1,3 +1,15 @@
2002-05-30 Chris G. Demetriou <cgd@broadcom.com>
Ed Satterthwaite <ehs@broadcom.com>
* mips-dis.c (print_insn_arg): Add support for 'O', 'Q', 'X', 'Y',
and 'Z' formats, for MDMX.
(mips_isa_type): Add MDMX instructions to the ISA
bit mask for bfd_mach_mipsisa64.
* mips-opc.c: Add support for MDMX instructions.
(MX): New definition.
* mips-dis.c: Update copyright years to include 2002.
2002-05-30 Diego Novillo <dnovillo@redhat.com>
* d10v-opc.c (d10v_opcodes): `btsti' does not modify its

View file

@ -284,6 +284,53 @@ print_insn_arg (d, l, pc, info)
(l >> OP_SH_SEL) & OP_MASK_SEL);
break;
case 'O':
(*info->fprintf_func) (info->stream, "%d",
(l >> OP_SH_ALN) & OP_MASK_ALN);
break;
case 'Q':
{
unsigned int vsel = (l >> OP_SH_VSEL) & OP_MASK_VSEL;
if ((vsel & 0x10) == 0)
{
int fmt;
vsel &= 0x0f;
for (fmt = 0; fmt < 3; fmt++, vsel >>= 1)
if ((vsel & 1) == 0)
break;
(*info->fprintf_func) (info->stream, "$v%d[%d]",
(l >> OP_SH_FT) & OP_MASK_FT,
vsel >> 1);
}
else if ((vsel & 0x08) == 0)
{
(*info->fprintf_func) (info->stream, "$v%d",
(l >> OP_SH_FT) & OP_MASK_FT);
}
else
{
(*info->fprintf_func) (info->stream, "0x%x",
(l >> OP_SH_FT) & OP_MASK_FT);
}
}
break;
case 'X':
(*info->fprintf_func) (info->stream, "$v%d",
(l >> OP_SH_FD) & OP_MASK_FD);
break;
case 'Y':
(*info->fprintf_func) (info->stream, "$v%d",
(l >> OP_SH_FS) & OP_MASK_FS);
break;
case 'Z':
(*info->fprintf_func) (info->stream, "$v%d",
(l >> OP_SH_FT) & OP_MASK_FT);
break;
default:
/* xgettext:c-format */
(*info->fprintf_func) (info->stream,
@ -378,8 +425,8 @@ mips_isa_type (mach, isa, cputype)
case bfd_mach_mipsisa32:
*cputype = CPU_MIPS32;
/* For stock MIPS32, disassemble all applicable MIPS-specified ASEs.
Note that MIPS-3D is not applicable to MIPS32. (See _MIPS32
Architecture For Programmers Volume I: Introduction to the
Note that MIPS-3D and MDMX are not applicable to MIPS32. (See
_MIPS32 Architecture For Programmers Volume I: Introduction to the
MIPS32 Architecture_ (MIPS Document Number MD00082, Revision 0.95),
page 1. */
*isa = ISA_MIPS32;
@ -387,7 +434,7 @@ mips_isa_type (mach, isa, cputype)
case bfd_mach_mipsisa64:
*cputype = CPU_MIPS64;
/* For stock MIPS64, disassemble all applicable MIPS-specified ASEs. */
*isa = ISA_MIPS64 | INSN_MIPS3D;
*isa = ISA_MIPS64 | INSN_MDMX | INSN_MIPS3D;
break;
default:

View file

@ -4,7 +4,7 @@
Contributed by Ralph Campbell and OSF
Commented and modified by Ian Lance Taylor, Cygnus Support
Extended for MIPS32 support by Anders Norlander, and by SiByte, Inc.
MIPS-3D support added by Broadcom Corporation (SiByte).
MIPS-3D and MDMX support added by Broadcom Corporation (SiByte).
This file is part of GDB, GAS, and the GNU binutils.
@ -75,6 +75,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
#define IS_M INSN_MULT
#define WR_MACC INSN_WRITE_MDMX_ACC
#define RD_MACC INSN_READ_MDMX_ACC
#define I1 INSN_ISA1
#define I2 INSN_ISA2
#define I3 INSN_ISA3
@ -86,6 +89,9 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
/* MIPS64 MIPS-3D ASE support. */
#define M3D INSN_MIPS3D
/* MIPS64 MDMX ASE support. */
#define MX INSN_MDMX
#define P3 INSN_4650
#define L1 INSN_4010
#define V1 INSN_4100
@ -144,15 +150,27 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"add", "t,r,I", 0, (int) M_ADD_I, INSN_MACRO, I1 },
{"add.s", "D,V,T", 0x46000000, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, I1 },
{"add.d", "D,V,T", 0x46200000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I1 },
{"add.ob", "X,Y,Q", 0x7800000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"add.ps", "D,V,T", 0x46c00000, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"add.qh", "X,Y,Q", 0x7820000b, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"adda.ob", "Y,Q", 0x78000037, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"adda.qh", "Y,Q", 0x78200037, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"addi", "t,r,j", 0x20000000, 0xfc000000, WR_t|RD_s, I1 },
{"addiu", "t,r,j", 0x24000000, 0xfc000000, WR_t|RD_s, I1 },
{"addl.ob", "Y,Q", 0x78000437, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"addl.qh", "Y,Q", 0x78200437, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"addr.ps", "D,S,T", 0x46c00018, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, M3D },
{"addu", "d,v,t", 0x00000021, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"addu", "t,r,I", 0, (int) M_ADDU_I, INSN_MACRO, I1 },
{"alni.ob", "X,Y,Z,O", 0x78000018, 0xff00003f, WR_D|RD_S|RD_T|FP_D, MX },
{"alni.qh", "X,Y,Z,O", 0x7800001a, 0xff00003f, WR_D|RD_S|RD_T|FP_D, MX },
{"alnv.ps", "D,V,T,s", 0x4c00001e, 0xfc00003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"alnv.ob", "X,Y,Z,s", 0x78000019, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, MX },
{"alnv.qh", "X,Y,Z,s", 0x7800001b, 0xfc00003f, WR_D|RD_S|RD_T|RD_s|FP_D, MX },
{"and", "d,v,t", 0x00000024, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"and", "t,r,I", 0, (int) M_AND_I, INSN_MACRO, I1 },
{"and.ob", "X,Y,Q", 0x7800000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"and.qh", "X,Y,Q", 0x7820000c, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"andi", "t,r,i", 0x30000000, 0xfc000000, WR_t|RD_s, I1 },
/* b is at the top of the table. */
/* bal is at the top of the table. */
@ -256,8 +274,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"c.eq.d", "M,S,T", 0x46200032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.eq.s", "S,T", 0x46000032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
{"c.eq.s", "M,S,T", 0x46000032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, I4|I32 },
{"c.eq.ob", "Y,Q", 0x78000001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.eq.ps", "S,T", 0x46c00032, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.eq.ps", "M,S,T", 0x46c00032, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.eq.qh", "Y,Q", 0x78200001, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.ueq.d", "S,T", 0x46200033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I1 },
{"c.ueq.d", "M,S,T", 0x46200033, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.ueq.s", "S,T", 0x46000033, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
@ -316,8 +336,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"c.lt.d", "M,S,T", 0x4620003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.lt.s", "S,T", 0x4600003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
{"c.lt.s", "M,S,T", 0x4600003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, I4|I32 },
{"c.lt.ob", "Y,Q", 0x78000004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.lt.ps", "S,T", 0x46c0003c, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.lt.ps", "M,S,T", 0x46c0003c, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.lt.qh", "Y,Q", 0x78200004, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.nge.d", "S,T", 0x4620003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I1 },
{"c.nge.d", "M,S,T", 0x4620003d, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.nge.s", "S,T", 0x4600003d, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
@ -328,8 +350,10 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"c.le.d", "M,S,T", 0x4620003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.le.s", "S,T", 0x4600003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
{"c.le.s", "M,S,T", 0x4600003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, I4|I32 },
{"c.le.ob", "Y,Q", 0x78000005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.le.ps", "S,T", 0x46c0003e, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.le.ps", "M,S,T", 0x46c0003e, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I5 },
{"c.le.qh", "Y,Q", 0x78200005, 0xfc2007ff, WR_CC|RD_S|RD_T|FP_D, MX },
{"c.ngt.d", "S,T", 0x4620003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, I1 },
{"c.ngt.d", "M,S,T", 0x4620003f, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, I4|I32 },
{"c.ngt.s", "S,T", 0x4600003f, 0xffe007ff, RD_S|RD_T|WR_CC|FP_S, I1 },
@ -626,6 +650,8 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"maddu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, G1 },
{"maddu", "d,s,t", 0x70000001, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1 },
{"madd16", "s,t", 0x00000028, 0xfc00ffff, RD_s|RD_t|MOD_HILO, V1 },
{"max.ob", "X,Y,Q", 0x78000007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"max.qh", "X,Y,Q", 0x78200007, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"mfpc", "t,P", 0x4000c801, 0xffe0ffc1, LCD|WR_t|RD_C0, M1 },
{"mfps", "t,P", 0x4000c800, 0xffe0ffc1, LCD|WR_t|RD_C0, M1 },
{"mfc0", "t,G", 0x40000000, 0xffe007ff, LCD|WR_t|RD_C0, I1 },
@ -638,28 +664,39 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"mfc3", "t,G,H", 0x4c000000, 0xffe007f8, LCD|WR_t|RD_C3, I32 },
{"mfhi", "d", 0x00000010, 0xffff07ff, WR_d|RD_HI, I1 },
{"mflo", "d", 0x00000012, 0xffff07ff, WR_d|RD_LO, I1 },
{"min.ob", "X,Y,Q", 0x78000006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"min.qh", "X,Y,Q", 0x78200006, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"mov.d", "D,S", 0x46200006, 0xffff003f, WR_D|RD_S|FP_D, I1 },
{"mov.s", "D,S", 0x46000006, 0xffff003f, WR_D|RD_S|FP_S, I1 },
{"mov.ps", "D,S", 0x46c00006, 0xffff003f, WR_D|RD_S|FP_D, I5 },
{"movf", "d,s,N", 0x00000001, 0xfc0307ff, WR_d|RD_s|RD_CC|FP_D|FP_S, I4|I32},
{"movf.d", "D,S,N", 0x46200011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, I4|I32 },
{"movf.l", "D,S,N", 0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, MX },
{"movf.l", "X,Y,N", 0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, MX },
{"movf.s", "D,S,N", 0x46000011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, I4|I32 },
{"movf.ps", "D,S,N", 0x46c00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, I5 },
{"movn", "d,v,t", 0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t, I4|I32 },
{"ffc", "d,v", 0x0000000b, 0xfc1f07ff, WR_d|RD_s, L1 },
{"movn.d", "D,S,t", 0x46200013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, I4|I32 },
{"movn.l", "D,S,t", 0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, MX },
{"movn.l", "X,Y,t", 0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, MX },
{"movn.s", "D,S,t", 0x46000013, 0xffe0003f, WR_D|RD_S|RD_t|FP_S, I4|I32 },
{"movn.ps", "D,S,t", 0x46c00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, I5 },
{"movt", "d,s,N", 0x00010001, 0xfc0307ff, WR_d|RD_s|RD_CC, I4|I32 },
{"movt.d", "D,S,N", 0x46210011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, I4|I32 },
{"movt.l", "D,S,N", 0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, MX },
{"movt.l", "X,Y,N", 0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, MX },
{"movt.s", "D,S,N", 0x46010011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, I4|I32 },
{"movt.ps", "D,S,N", 0x46c10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, I5 },
{"movz", "d,v,t", 0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t, I4|I32 },
{"ffs", "d,v", 0x0000000a, 0xfc1f07ff, WR_d|RD_s, L1 },
{"movz.d", "D,S,t", 0x46200012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, I4|I32 },
{"movz.l", "D,S,t", 0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, MX },
{"movz.l", "X,Y,t", 0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, MX },
{"movz.s", "D,S,t", 0x46000012, 0xffe0003f, WR_D|RD_S|RD_t|FP_S, I4|I32 },
{"movz.ps", "D,S,t", 0x46c00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, I5 },
/* move is at the top of the table. */
{"msgn.qh", "X,Y,Q", 0x78200000, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"msub.d", "D,R,S,T", 0x4c000029, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I4 },
{"msub.s", "D,R,S,T", 0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, I4 },
{"msub.ps", "D,R,S,T", 0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, I5 },
@ -681,15 +718,25 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"mtlo", "s", 0x00000013, 0xfc1fffff, RD_s|WR_LO, I1 },
{"mul.d", "D,V,T", 0x46200002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I1 },
{"mul.s", "D,V,T", 0x46000002, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, I1 },
{"mul.ob", "X,Y,Q", 0x78000030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"mul.ps", "D,V,T", 0x46c00002, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"mul.qh", "X,Y,Q", 0x78200030, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"mul", "d,v,t", 0x70000002, 0xfc0007ff, WR_d|RD_s|RD_t|WR_HILO, I32|P3 },
{"mul", "d,v,t", 0, (int) M_MUL, INSN_MACRO, I1 },
{"mul", "d,v,I", 0, (int) M_MUL_I, INSN_MACRO, I1 },
{"mula.ob", "Y,Q", 0x78000033, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mula.qh", "Y,Q", 0x78200033, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mull.ob", "Y,Q", 0x78000433, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mull.qh", "Y,Q", 0x78200433, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mulo", "d,v,t", 0, (int) M_MULO, INSN_MACRO, I1 },
{"mulo", "d,v,I", 0, (int) M_MULO_I, INSN_MACRO, I1 },
{"mulou", "d,v,t", 0, (int) M_MULOU, INSN_MACRO, I1 },
{"mulou", "d,v,I", 0, (int) M_MULOU_I, INSN_MACRO, I1 },
{"mulr.ps", "D,S,T", 0x46c0001a, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, M3D },
{"muls.ob", "Y,Q", 0x78000032, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"muls.qh", "Y,Q", 0x78200032, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mulsl.ob", "Y,Q", 0x78000432, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mulsl.qh", "Y,Q", 0x78200432, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"mult", "s,t", 0x00000018, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1 },
{"mult", "d,s,t", 0x00000018, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, G1 },
{"multu", "s,t", 0x00000019, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, I1 },
@ -708,19 +755,29 @@ const struct mips_opcode mips_builtin_opcodes[] =
/* nop is at the start of the table. */
{"nor", "d,v,t", 0x00000027, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"nor", "t,r,I", 0, (int) M_NOR_I, INSN_MACRO, I1 },
{"nor.ob", "X,Y,Q", 0x7800000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"nor.qh", "X,Y,Q", 0x7820000f, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"not", "d,v", 0x00000027, 0xfc1f07ff, WR_d|RD_s|RD_t, I1 },/*nor d,s,0*/
{"or", "d,v,t", 0x00000025, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"or", "t,r,I", 0, (int) M_OR_I, INSN_MACRO, I1 },
{"or.ob", "X,Y,Q", 0x7800000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"or.qh", "X,Y,Q", 0x7820000e, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"ori", "t,r,i", 0x34000000, 0xfc000000, WR_t|RD_s, I1 },
{"pickf.ob", "X,Y,Q", 0x78000002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"pickf.qh", "X,Y,Q", 0x78200002, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"pickt.ob", "X,Y,Q", 0x78000003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"pickt.qh", "X,Y,Q", 0x78200003, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"pll.ps", "D,V,T", 0x46c0002c, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"plu.ps", "D,V,T", 0x46c0002d, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
/* pref and prefx are at the start of the table. */
{"pul.ps", "D,V,T", 0x46c0002e, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"puu.ps", "D,V,T", 0x46c0002f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"rach.ob", "X", 0x7a00003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"rach.qh", "X", 0x7a20003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"racl.ob", "X", 0x7800003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"racl.qh", "X", 0x7820003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"racm.ob", "X", 0x7900003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"racm.qh", "X", 0x7920003f, 0xfffff83f, WR_D|RD_MACC|FP_D, MX },
{"recip.d", "D,S", 0x46200015, 0xffff003f, WR_D|RD_S|FP_D, I4 },
{"recip.ps","D,S", 0x46c00015, 0xffff003f, WR_D|RD_S|FP_D, SB1 },
{"recip.s", "D,S", 0x46000015, 0xffff003f, WR_D|RD_S|FP_S, I4 },
@ -737,6 +794,12 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"remu", "d,v,t", 0, (int) M_REMU_3, INSN_MACRO, I1 },
{"remu", "d,v,I", 0, (int) M_REMU_3I, INSN_MACRO, I1 },
{"rfe", "", 0x42000010, 0xffffffff, 0, I1|T3 },
{"rnas.qh", "X,Q", 0x78200025, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rnau.ob", "X,Q", 0x78000021, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rnau.qh", "X,Q", 0x78200021, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rnes.qh", "X,Q", 0x78200026, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rneu.ob", "X,Q", 0x78000022, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rneu.qh", "X,Q", 0x78200022, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rol", "d,v,t", 0, (int) M_ROL, INSN_MACRO, I1 },
{"rol", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, I1 },
{"ror", "d,v,t", 0, (int) M_ROR, INSN_MACRO, I1 },
@ -754,6 +817,9 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"rsqrt2.d", "D,S,T", 0x4620001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, M3D },
{"rsqrt2.ps", "D,S,T", 0x46c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, M3D },
{"rsqrt2.s", "D,S,T", 0x4600001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, M3D },
{"rzs.qh", "X,Q", 0x78200024, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rzu.ob", "X,Q", 0x78000020, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"rzu.qh", "X,Q", 0x78200020, 0xfc20f83f, WR_D|RD_MACC|RD_T|FP_D, MX },
{"sb", "t,o(b)", 0xa0000000, 0xfc000000, SM|RD_t|RD_b, I1 },
{"sb", "t,A(b)", 0, (int) M_SB_AB, INSN_MACRO, I1 },
{"sc", "t,o(b)", 0xe0000000, 0xfc000000, SM|RD_t|WR_t|RD_b, I2 },
@ -798,6 +864,16 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"sgtu", "d,v,I", 0, (int) M_SGTU_I, INSN_MACRO, I1 },
{"sh", "t,o(b)", 0xa4000000, 0xfc000000, SM|RD_t|RD_b, I1 },
{"sh", "t,A(b)", 0, (int) M_SH_AB, INSN_MACRO, I1 },
{"shfl.bfla.qh", "X,Y,Z", 0x7a20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.mixh.ob", "X,Y,Z", 0x7980001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.mixh.qh", "X,Y,Z", 0x7820001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.mixl.ob", "X,Y,Z", 0x79c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.mixl.qh", "X,Y,Z", 0x78a0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.pach.ob", "X,Y,Z", 0x7900001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.pach.qh", "X,Y,Z", 0x7920001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.repa.qh", "X,Y,Z", 0x7b20001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.repb.qh", "X,Y,Z", 0x7ba0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"shfl.upsl.ob", "X,Y,Z", 0x78c0001f, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, MX },
{"sle", "d,v,t", 0, (int) M_SLE, INSN_MACRO, I1 },
{"sle", "d,v,I", 0, (int) M_SLE_I, INSN_MACRO, I1 },
{"sleu", "d,v,t", 0, (int) M_SLEU, INSN_MACRO, I1 },
@ -805,6 +881,8 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"sllv", "d,t,s", 0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s, I1 },
{"sll", "d,w,s", 0x00000004, 0xfc0007ff, WR_d|RD_t|RD_s, I1 }, /* sllv */
{"sll", "d,w,<", 0x00000000, 0xffe0003f, WR_d|RD_t, I1 },
{"sll.ob", "X,Y,Q", 0x78000010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"sll.qh", "X,Y,Q", 0x78200010, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"slt", "d,v,t", 0x0000002a, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"slt", "d,v,I", 0, (int) M_SLT_I, INSN_MACRO, I1 },
{"slti", "t,r,j", 0x28000000, 0xfc000000, WR_t|RD_s, I1 },
@ -819,16 +897,25 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"srav", "d,t,s", 0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s, I1 },
{"sra", "d,w,s", 0x00000007, 0xfc0007ff, WR_d|RD_t|RD_s, I1 }, /* srav */
{"sra", "d,w,<", 0x00000003, 0xffe0003f, WR_d|RD_t, I1 },
{"sra.qh", "X,Y,Q", 0x78200013, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"srlv", "d,t,s", 0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s, I1 },
{"srl", "d,w,s", 0x00000006, 0xfc0007ff, WR_d|RD_t|RD_s, I1 }, /* srlv */
{"srl", "d,w,<", 0x00000002, 0xffe0003f, WR_d|RD_t, I1 },
{"srl.ob", "X,Y,Q", 0x78000012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"srl.qh", "X,Y,Q", 0x78200012, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
/* ssnop is at the start of the table. */
{"standby", "", 0x42000021, 0xffffffff, 0, V1 },
{"sub", "d,v,t", 0x00000022, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"sub", "d,v,I", 0, (int) M_SUB_I, INSN_MACRO, I1 },
{"sub.d", "D,V,T", 0x46200001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I1 },
{"sub.s", "D,V,T", 0x46000001, 0xffe0003f, WR_D|RD_S|RD_T|FP_S, I1 },
{"sub.ob", "X,Y,Q", 0x7800000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"sub.ps", "D,V,T", 0x46c00001, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, I5 },
{"sub.qh", "X,Y,Q", 0x7820000a, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"suba.ob", "Y,Q", 0x78000036, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"suba.qh", "Y,Q", 0x78200036, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"subl.ob", "Y,Q", 0x78000436, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"subl.qh", "Y,Q", 0x78200436, 0xfc2007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"subu", "d,v,t", 0x00000023, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"subu", "d,v,I", 0, (int) M_SUBU_I, INSN_MACRO, I1 },
{"suspend", "", 0x42000022, 0xffffffff, 0, V1 },
@ -919,11 +1006,18 @@ const struct mips_opcode mips_builtin_opcodes[] =
{"usw", "t,A(b)", 0, (int) M_USW_A, INSN_MACRO, I1 },
{"xor", "d,v,t", 0x00000026, 0xfc0007ff, WR_d|RD_s|RD_t, I1 },
{"xor", "t,r,I", 0, (int) M_XOR_I, INSN_MACRO, I1 },
{"xor.ob", "X,Y,Q", 0x7800000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"xor.qh", "X,Y,Q", 0x7820000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, MX },
{"xori", "t,r,i", 0x38000000, 0xfc000000, WR_t|RD_s, I1 },
{"wach.ob", "Y", 0x7a00003e, 0xffff07ff, WR_MACC|RD_S|FP_D, MX },
{"wach.qh", "Y", 0x7a20003e, 0xffff07ff, WR_MACC|RD_S|FP_D, MX },
{"wacl.ob", "Y,Z", 0x7800003e, 0xffe007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"wacl.qh", "Y,Z", 0x7820003e, 0xffe007ff, WR_MACC|RD_S|RD_T|FP_D, MX },
{"wait", "", 0x42000020, 0xffffffff, TRAP, I3|I32 },
{"wait", "J", 0x42000020, 0xfe00003f, TRAP, I32 },
{"waiti", "", 0x42000020, 0xffffffff, TRAP, L1 },
{"wb", "o(b)", 0xbc040000, 0xfc1f0000, SM|RD_b, L1 },
/* No hazard protection on coprocessor instructions--they shouldn't
change the state of the processor and if they do it's up to the
user to put in nops as necessary. These are at the end so that the