diff -Nbaur binutils-2.16.1/bfd/archures.c binutils-2.16.1-new/bfd/archures.c --- binutils-2.16.1/bfd/archures.c Mon Jan 17 14:08:03 2005 +++ binutils-2.16.1-new/bfd/archures.c Wed Jul 6 01:56:40 2005 @@ -155,6 +155,7 @@ .#define bfd_mach_mips16 16 .#define bfd_mach_mips5 5 .#define bfd_mach_mips_sb1 12310201 {* octal 'SB', 01 *} +.#define bfd_mach_mips_allegrex 10111431 {* octal 'AL', 31 *} .#define bfd_mach_mipsisa32 32 .#define bfd_mach_mipsisa32r2 33 .#define bfd_mach_mipsisa64 64 diff -Nbaur binutils-2.16.1/bfd/bfd-in2.h binutils-2.16.1-new/bfd/bfd-in2.h --- binutils-2.16.1/bfd/bfd-in2.h Wed Mar 2 21:23:20 2005 +++ binutils-2.16.1-new/bfd/bfd-in2.h Wed Jul 6 01:56:40 2005 @@ -1600,6 +1600,7 @@ #define bfd_mach_mips16 16 #define bfd_mach_mips5 5 #define bfd_mach_mips_sb1 12310201 /* octal 'SB', 01 */ +#define bfd_mach_mips_allegrex 10111431 /* octal 'AL', 31 */ #define bfd_mach_mipsisa32 32 #define bfd_mach_mipsisa32r2 33 #define bfd_mach_mipsisa64 64 diff -Nbaur binutils-2.16.1/bfd/cpu-mips.c binutils-2.16.1-new/bfd/cpu-mips.c --- binutils-2.16.1/bfd/cpu-mips.c Thu Mar 3 11:40:58 2005 +++ binutils-2.16.1-new/bfd/cpu-mips.c Wed Jul 6 01:56:40 2005 @@ -86,6 +86,7 @@ I_mipsisa64, I_mipsisa64r2, I_sb1, + I_allegrex, }; #define NN(index) (&arch_info_struct[(index) + 1]) @@ -118,7 +119,8 @@ N (32, 32, bfd_mach_mipsisa32r2,"mips:isa32r2", FALSE, NN(I_mipsisa32r2)), N (64, 64, bfd_mach_mipsisa64, "mips:isa64", FALSE, NN(I_mipsisa64)), N (64, 64, bfd_mach_mipsisa64r2,"mips:isa64r2", FALSE, NN(I_mipsisa64r2)), - N (64, 64, bfd_mach_mips_sb1, "mips:sb1", FALSE, 0), + N (64, 64, bfd_mach_mips_sb1, "mips:sb1", FALSE, NN(I_sb1)), + N (32, 32, bfd_mach_mips_allegrex, "mips:allegrex", FALSE, 0), }; /* The default architecture is mips:3000, but with a machine number of diff -Nbaur binutils-2.16.1/bfd/doc/chew.c binutils-2.16.1-new/bfd/doc/chew.c --- binutils-2.16.1/bfd/doc/chew.c Thu Mar 3 11:41:02 2005 +++ binutils-2.16.1-new/bfd/doc/chew.c Wed Jul 6 01:56:24 2005 @@ -91,6 +91,12 @@ #define DEF_SIZE 5000 #define STACK 50 +#ifdef __MINGW32__ +/* Prevent \r\n\ line endings */ +#include +unsigned int _CRT_fmode = _O_BINARY; +#endif + int internal_wanted; int internal_mode; diff -Nbaur binutils-2.16.1/bfd/elfxx-mips.c binutils-2.16.1-new/bfd/elfxx-mips.c --- binutils-2.16.1/bfd/elfxx-mips.c Sat May 28 22:58:29 2005 +++ binutils-2.16.1-new/bfd/elfxx-mips.c Wed Jul 6 01:56:40 2005 @@ -4669,6 +4669,9 @@ case E_MIPS_MACH_SB1: return bfd_mach_mips_sb1; + case E_MIPS_MACH_ALLEGREX: + return bfd_mach_mips_allegrex; + default: switch (flags & EF_MIPS_ARCH) { @@ -7941,6 +7944,10 @@ val = E_MIPS_ARCH_64 | E_MIPS_MACH_SB1; break; + case bfd_mach_mips_allegrex: + val = E_MIPS_ARCH_2 | E_MIPS_MACH_ALLEGREX; + break; + case bfd_mach_mipsisa32: val = E_MIPS_ARCH_32; break; @@ -9641,6 +9648,7 @@ /* MIPS II extensions. */ { bfd_mach_mips4000, bfd_mach_mips6000 }, { bfd_mach_mipsisa32, bfd_mach_mips6000 }, + { bfd_mach_mips_allegrex, bfd_mach_mips6000 }, /* MIPS I extensions. */ { bfd_mach_mips6000, bfd_mach_mips3000 }, diff -Nbaur binutils-2.16.1/binutils/readelf.c binutils-2.16.1-new/binutils/readelf.c --- binutils-2.16.1/binutils/readelf.c Wed Apr 20 19:43:36 2005 +++ binutils-2.16.1-new/binutils/readelf.c Wed Jul 6 01:56:41 2005 @@ -2043,6 +2043,7 @@ case E_MIPS_MACH_5500: strcat (buf, ", 5500"); break; case E_MIPS_MACH_SB1: strcat (buf, ", sb1"); break; case E_MIPS_MACH_9000: strcat (buf, ", 9000"); break; + case E_MIPS_MACH_ALLEGREX: strcat (buf, ", allegrex"); break; case 0: /* We simply ignore the field in this case to avoid confusion: MIPS ELF does not specify EF_MIPS_MACH, it is a GNU diff -Nbaur binutils-2.16.1/config.sub binutils-2.16.1-new/config.sub --- binutils-2.16.1/config.sub Wed Jan 19 00:34:56 2005 +++ binutils-2.16.1-new/config.sub Wed Jul 6 01:56:41 2005 @@ -219,6 +219,10 @@ basic_machine=m68k-atari os=-mint ;; + -gekko) + basic_machine=powerpc-eabi + os=-elf + ;; esac # Decode aliases for certain CPU-COMPANY combinations. @@ -253,6 +257,7 @@ | mipsisa64sb1 | mipsisa64sb1el \ | mipsisa64sr71k | mipsisa64sr71kel \ | mipstx39 | mipstx39el \ + | mipsallegrex | mipsallegrexel \ | mn10200 | mn10300 \ | msp430 \ | ns16k | ns32k \ @@ -326,6 +331,7 @@ | mipsisa64sb1-* | mipsisa64sb1el-* \ | mipsisa64sr71k-* | mipsisa64sr71kel-* \ | mipstx39-* | mipstx39el-* \ + | mipsallegrex-* | mipsallegrexel-* \ | mmix-* \ | msp430-* \ | none-* | np1-* | ns16k-* | ns32k-* \ @@ -664,6 +670,10 @@ *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) basic_machine=m68k-atari os=-mint + ;; + psp) + basic_machine=mipsallegrexel-psp + os=-elf ;; mips3*-*) basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` diff -Nbaur binutils-2.16.1/configure.in binutils-2.16.1-new/configure.in --- binutils-2.16.1/configure.in Sun Jun 12 20:33:06 2005 +++ binutils-2.16.1-new/configure.in Wed Jul 6 01:56:24 2005 @@ -242,7 +242,7 @@ # Some tools are only suitable for building in a "native" situation. # Remove these if host!=target. -native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff gprof target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" +native_only="autoconf automake libtool fileutils find gawk gettext gzip hello indent m4 rcs recode sed shellutils tar textutils uudecode wdiff target-groff guile perl time ash bash bzip2 prms gnuserv target-gperf" # Similarly, some are only suitable for cross toolchains. # Remove these if host=target. diff -Nbaur binutils-2.16.1/gas/config/tc-mips.c binutils-2.16.1-new/gas/config/tc-mips.c --- binutils-2.16.1/gas/config/tc-mips.c Sun Jun 12 19:07:03 2005 +++ binutils-2.16.1-new/gas/config/tc-mips.c Wed Jul 6 01:56:41 2005 @@ -365,11 +365,15 @@ #define CPU_HAS_MDMX(cpu) (FALSE \ ) +/* True if the given CPU belongs to the Allegrex family. */ +#define CPU_IS_ALLEGREX(CPU) ((CPU) == CPU_ALLEGREX \ + ) + /* True if CPU has a dror instruction. */ #define CPU_HAS_DROR(CPU) ((CPU) == CPU_VR5400 || (CPU) == CPU_VR5500) /* True if CPU has a ror instruction. */ -#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU) +#define CPU_HAS_ROR(CPU) CPU_HAS_DROR (CPU) || CPU_IS_ALLEGREX (CPU) /* True if mflo and mfhi can be immediately followed by instructions which write to the HI and LO registers. @@ -7817,6 +7821,30 @@ case '%': USE_BITS (OP_MASK_VECALIGN, OP_SH_VECALIGN); break; case '[': break; case ']': break; + case '?': + /* MRB TODO: Fix this for the VFPU extensions. */ + switch (c = *p++) + { + case 'f': + /* MRB HACK: Skip the next character. */ + p++; + break; + case 'd': + case 'm': + case 'n': + case 's': + case 't': + case 'v': + case 'x': + /* MRB HACK: Skip the next two characters. */ + p++; + p++; + break; + default: break; + } + /* MRB HACK: Set all used bits. */ + used_bits = 0xffffffff; + break; default: as_bad (_("internal: bad mips opcode (unknown operand type `%c'): %s %s"), c, opc->name, opc->args); @@ -8485,6 +8513,7 @@ if ((regno & 1) != 0 && HAVE_32BIT_FPRS + && ! CPU_IS_ALLEGREX (mips_opts.arch) && ! (strcmp (str, "mtc1") == 0 || strcmp (str, "mfc1") == 0 || strcmp (str, "lwc1") == 0 @@ -13743,6 +13772,8 @@ /* MIPS II */ { "r6000", 0, ISA_MIPS2, CPU_R6000 }, + /* Sony PSP "Allegrex" CPU core */ + { "allegrex", 0, ISA_MIPS2, CPU_ALLEGREX }, /* MIPS III */ { "r4000", 0, ISA_MIPS3, CPU_R4000 }, diff -Nbaur binutils-2.16.1/gas/config/tc-ppc.c binutils-2.16.1-new/gas/config/tc-ppc.c --- binutils-2.16.1/gas/config/tc-ppc.c Wed Mar 2 13:24:01 2005 +++ binutils-2.16.1-new/gas/config/tc-ppc.c Wed Jul 6 01:56:24 2005 @@ -310,6 +310,7 @@ sdr1 has the value 25 srr0 has the value 26 srr1 has the value 27 + gqr0..7 has the value 912..919 The table is sorted. Suitable for searching by a binary search. */ @@ -407,6 +408,15 @@ { "fpscr", 0 }, + { "gqr0", 912}, + { "gqr1", 913}, + { "gqr2", 914}, + { "gqr3", 915}, + { "gqr4", 916}, + { "gqr5", 917}, + { "gqr6", 918}, + { "gqr7", 919}, + { "lr", 8 }, /* Link Register */ { "pmr", 0 }, @@ -906,6 +916,9 @@ ppc_cpu = (PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_64 | PPC_OPCODE_POWER4); } + else if (strcmp (arg, "gekko") == 0) + ppc_cpu = PPC_OPCODE_CLASSIC | PPC_OPCODE_PPC | PPC_OPCODE_32 | PPC_OPCODE_GEKKO; + /* -mcom means assemble for the common intersection between Power and PowerPC. At present, we just allow the union, rather than the intersection. */ @@ -1107,7 +1120,9 @@ -me500, -me500x2 generate code for Motorola e500 core complex\n\ -mspe generate code for Motorola SPE instructions\n\ -mregnames Allow symbolic names for registers\n\ --mno-regnames Do not allow symbolic names for registers\n")); +-mno-regnames Do not allow symbolic names for registers\n\ +-mspe generate code for Motorola SPE instructions\n\ +-mgekko generate code for PowerPC Gekko\n")); #ifdef OBJ_ELF fprintf (stream, _("\ -mrelocatable support for GCC's -mrelocatble option\n\ @@ -1150,6 +1165,8 @@ else ppc_cpu |= PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32; } + else if (strcmp(default_cpu, "gekko") == 0) + ppc_cpu = PPC_OPCODE_PPC | PPC_OPCODE_CLASSIC | PPC_OPCODE_32 | PPC_OPCODE_GEKKO; else as_fatal (_("Unknown default cpu = %s, os = %s"), default_cpu, default_os); @@ -2570,6 +2587,26 @@ { endc = ')'; need_paren = 0; + if (opindex_ptr[1]) + { + /* do check here if we have further opcodes */ + if (*str != endc && (endc != ',' || *str != '\0')) + { + as_bad(_("syntax error; found `%c' but expected `%c'"),*str,endc); + break; + } + /* we have to move over whitespace ourselves */ + if (*str != '\0') + { + ++str; + while (ISSPACE(*str)) + { + ++str; + } + } + /* now we're looking for the comma */ + endc = ','; + } } else if ((operand->flags & PPC_OPERAND_PARENS) != 0) { @@ -2588,6 +2625,8 @@ break; } + /* The call to expression should have advanced str past any + whitespace. */ if (*str != '\0') ++str; } diff -Nbaur binutils-2.16.1/gas/configure binutils-2.16.1-new/gas/configure --- binutils-2.16.1/gas/configure Tue Mar 1 00:43:51 2005 +++ binutils-2.16.1-new/gas/configure Wed Jul 6 01:56:41 2005 @@ -4537,6 +4537,9 @@ mips64vr | mips64vrel) mips_cpu=vr4100 ;; + mipsallegrex | mipsallegrexel) + mips_cpu=allegrex + ;; mipsisa32r2* | mipsisa64r2*) mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'` ;; diff -Nbaur binutils-2.16.1/gas/configure.in binutils-2.16.1-new/gas/configure.in --- binutils-2.16.1/gas/configure.in Tue Mar 1 00:43:57 2005 +++ binutils-2.16.1-new/gas/configure.in Wed Jul 6 01:56:41 2005 @@ -222,6 +222,9 @@ mips64vr | mips64vrel) mips_cpu=vr4100 ;; + mipsallegrex | mipsallegrexel) + mips_cpu=allegrex + ;; mipsisa32r2* | mipsisa64r2*) changequote(,)dnl mips_cpu=`echo $target_cpu | sed -e 's/[a-z]*..r2//' -e 's/el$//'` diff -Nbaur binutils-2.16.1/include/elf/common.h binutils-2.16.1-new/include/elf/common.h --- binutils-2.16.1/include/elf/common.h Fri Oct 8 14:55:08 2004 +++ binutils-2.16.1-new/include/elf/common.h Wed Jul 6 01:56:41 2005 @@ -93,6 +93,7 @@ #define ET_HIOS 0xFEFF /* Operating system-specific */ #define ET_LOPROC 0xFF00 /* Processor-specific */ #define ET_HIPROC 0xFFFF /* Processor-specific */ +#define ET_PSPEXEC 0xFFA0 /* Sony PSP executable file */ /* Values for e_machine, which identifies the architecture. These numbers are officially assigned by registry@caldera.com. See below for a list of diff -Nbaur binutils-2.16.1/include/elf/mips.h binutils-2.16.1-new/include/elf/mips.h --- binutils-2.16.1/include/elf/mips.h Thu Mar 3 11:58:06 2005 +++ binutils-2.16.1-new/include/elf/mips.h Wed Jul 6 01:56:41 2005 @@ -212,6 +212,7 @@ #define E_MIPS_MACH_5400 0x00910000 #define E_MIPS_MACH_5500 0x00980000 #define E_MIPS_MACH_9000 0x00990000 +#define E_MIPS_MACH_ALLEGREX 0x00A20000 /* Processor specific section indices. These sections do not actually exist. Symbols with a st_shndx field corresponding to one of these diff -Nbaur binutils-2.16.1/include/opcode/mips.h binutils-2.16.1-new/include/opcode/mips.h --- binutils-2.16.1/include/opcode/mips.h Thu Mar 3 11:58:10 2005 +++ binutils-2.16.1-new/include/opcode/mips.h Wed Jul 6 01:56:41 2005 @@ -148,6 +148,19 @@ #define OP_MASK_EXTMSBD 0x1f /* "ext" MSBD. */ #define OP_SH_EXTMSBD 11 +#define OP_SH_VFPU_DELTA 0 +#define OP_MASK_VFPU_DELTA 0xfffc +#define OP_SH_VFPU_IMM3 16 +#define OP_MASK_VFPU_IMM3 0x7 +#define OP_SH_VFPU_IMM5 16 +#define OP_MASK_VFPU_IMM5 0x1f +#define OP_SH_VFPU_IMM8 16 +#define OP_MASK_VFPU_IMM8 0xff +#define OP_SH_VFPU_CC 18 +#define OP_MASK_VFPU_CC 0x7 +#define OP_SH_VFPU_CONST 16 +#define OP_MASK_VFPU_CONST 0x1f + #define OP_OP_COP0 0x10 #define OP_OP_COP1 0x11 #define OP_OP_COP2 0x12 @@ -442,6 +455,8 @@ #define INSN_5400 0x01000000 /* NEC VR5500 instruction. */ #define INSN_5500 0x02000000 +/* Sony Allegrex instruction. */ +#define INSN_ALLEGREX 0x10000000 /* MIPS ISA defines, use instead of hardcoding ISA level. */ @@ -489,6 +504,7 @@ #define CPU_MIPS64 64 #define CPU_MIPS64R2 65 #define CPU_SB1 12310201 /* octal 'SB', 01. */ +#define CPU_ALLEGREX 10111431 /* octal 'AL', 31. */ /* Test for membership in an ISA including chip specific ISAs. INSN is pointer to an element of the opcode table; ISA is the specified @@ -510,6 +526,7 @@ || (cpu == CPU_VR4120 && ((insn)->membership & INSN_4120) != 0) \ || (cpu == CPU_VR5400 && ((insn)->membership & INSN_5400) != 0) \ || (cpu == CPU_VR5500 && ((insn)->membership & INSN_5500) != 0) \ + || (cpu == CPU_ALLEGREX && ((insn)->membership & INSN_ALLEGREX) != 0) \ || 0) /* Please keep this term for easier source merging. */ /* This is a list of macro expanded instructions. diff -Nbaur binutils-2.16.1/include/opcode/ppc.h binutils-2.16.1-new/include/opcode/ppc.h --- binutils-2.16.1/include/opcode/ppc.h Thu Sep 9 13:42:37 2004 +++ binutils-2.16.1-new/include/opcode/ppc.h Wed Jul 6 01:56:24 2005 @@ -134,6 +134,9 @@ /* Opcode is supported by machine check APU. */ #define PPC_OPCODE_RFMCI 0x800000 +/* Opcode is only supported by the PowerPC Gekko processor. */ +#define PPC_OPCODE_GEKKO (040000000) + /* A macro to extract the major opcode from an instruction. */ #define PPC_OP(i) (((i) >> 26) & 0x3f) @@ -281,6 +284,10 @@ /* This operand is for the DQ field in a DQ form instruction. */ #define PPC_OPERAND_DQ (0100000) +/* This operand names a quantization register. The disassembler + prints these with a leading 'gqr'. */ +#define PPC_OPERAND_GQR (040000) + /* The POWER and PowerPC assemblers use a few macros. We keep them with the operands table for simplicity. The macro table is an array of struct powerpc_macro. */ diff -Nbaur binutils-2.16.1/ld/Makefile.am binutils-2.16.1-new/ld/Makefile.am --- binutils-2.16.1/ld/Makefile.am Thu Jan 20 19:37:49 2005 +++ binutils-2.16.1-new/ld/Makefile.am Wed Jul 6 01:56:41 2005 @@ -190,6 +190,7 @@ eelf_i386_chaos.o \ eelf_i386_fbsd.o \ eelf_i386_ldso.o \ + eelf_mipsallegrexel_psp.o \ eelf_s390.o \ egld960.o \ egld960coff.o \ @@ -864,6 +865,9 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" +eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" diff -Nbaur binutils-2.16.1/ld/Makefile.in binutils-2.16.1-new/ld/Makefile.in --- binutils-2.16.1/ld/Makefile.in Sun Jan 23 05:36:37 2005 +++ binutils-2.16.1-new/ld/Makefile.in Wed Jul 6 01:56:41 2005 @@ -315,6 +315,7 @@ eelf_i386_chaos.o \ eelf_i386_fbsd.o \ eelf_i386_ldso.o \ + eelf_mipsallegrexel_psp.o \ eelf_s390.o \ egld960.o \ egld960coff.o \ @@ -1601,6 +1602,9 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)" +eelf_mipsallegrexel_psp.c: $(srcdir)/emulparams/elf_mipsallegrexel_psp.sh \ + $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf_psp.sc ${GEN_DEPENDS} + ${GENSCRIPTS} elf_mipsallegrexel_psp "$(tdir_elf_mipsallegrexel_psp)" eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \ $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS} ${GENSCRIPTS} elf_s390 "$(tdir_elf_s390)" diff -Nbaur binutils-2.16.1/ld/configure.tgt binutils-2.16.1-new/ld/configure.tgt --- binutils-2.16.1/ld/configure.tgt Tue Feb 8 19:54:27 2005 +++ binutils-2.16.1-new/ld/configure.tgt Wed Jul 6 01:56:41 2005 @@ -428,6 +428,8 @@ mips*vr4100-*-elf*) targ_emul=elf32b4300 ;; mips*vr5000el-*-elf*) targ_emul=elf32l4300 ;; mips*vr5000-*-elf*) targ_emul=elf32b4300 ;; +mips*allegrexel-psp-elf*) targ_emul=elf_mipsallegrexel_psp + targ_extra_emuls="elf32elmip" ;; mips*el-*-elf*) targ_emul=elf32elmip ;; mips*-*-elf*) targ_emul=elf32ebmip ;; mips*el-*-rtems*) targ_emul=elf32elmip ;; diff -Nbaur binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh binutils-2.16.1-new/ld/emulparams/elf_mipsallegrexel_psp.sh --- binutils-2.16.1/ld/emulparams/elf_mipsallegrexel_psp.sh Thu Jan 1 00:00:00 1970 +++ binutils-2.16.1-new/ld/emulparams/elf_mipsallegrexel_psp.sh Wed Jul 6 01:56:41 2005 @@ -0,0 +1,19 @@ +# Based off of the default elf32 MIPS target. However, we use a seperate +# script template because the PSP architecture defines sections that normally +# cannot be overriden here and would normally get absorbed (i.e. +# .rodata.sceModuleInfo would be absorbed into .rodata). + +EMBEDDED=yes +. ${srcdir}/emulparams/elf32lmip.sh +unset NONPAGED_TEXT_START_ADDR +unset SHLIB_TEXT_START_ADDR +unset COMMONPAGESIZE + +SCRIPT_NAME=elf_psp +TEXT_START_ADDR=0x08900000 +MAXPAGESIZE=256 +ARCH="mips:allegrex" +MACHINE= +TEMPLATE_NAME=elf32 +GENERATE_SHLIB_SCRIPT=yes +DYNAMIC_LINK=FALSE diff -Nbaur binutils-2.16.1/ld/scripttempl/elf_psp.sc binutils-2.16.1-new/ld/scripttempl/elf_psp.sc --- binutils-2.16.1/ld/scripttempl/elf_psp.sc Thu Jan 1 00:00:00 1970 +++ binutils-2.16.1-new/ld/scripttempl/elf_psp.sc Wed Jul 6 01:56:42 2005 @@ -0,0 +1,496 @@ +# +# Unusual variables checked by this code: +# NOP - four byte opcode for no-op (defaults to 0) +# NO_SMALL_DATA - no .sbss/.sbss2/.sdata/.sdata2 sections if not +# empty. +# SMALL_DATA_CTOR - .ctors contains small data. +# SMALL_DATA_DTOR - .dtors contains small data. +# DATA_ADDR - if end-of-text-plus-one-page isn't right for data start +# INITIAL_READONLY_SECTIONS - at start of text segment +# OTHER_READONLY_SECTIONS - other than .text .init .rodata ... +# (e.g., .PARISC.milli) +# OTHER_TEXT_SECTIONS - these get put in .text when relocating +# OTHER_READWRITE_SECTIONS - other than .data .bss .ctors .sdata ... +# (e.g., .PARISC.global) +# OTHER_RELRO_SECTIONS - other than .data.rel.ro ... +# (e.g. PPC32 .fixup, .got[12]) +# OTHER_BSS_SECTIONS - other than .bss .sbss ... +# OTHER_SECTIONS - at the end +# EXECUTABLE_SYMBOLS - symbols that must be defined for an +# executable (e.g., _DYNAMIC_LINK) +# TEXT_START_ADDR - the first byte of the text segment, after any +# headers. +# TEXT_BASE_ADDRESS - the first byte of the text segment. +# TEXT_START_SYMBOLS - symbols that appear at the start of the +# .text section. +# DATA_START_SYMBOLS - symbols that appear at the start of the +# .data section. +# OTHER_GOT_SYMBOLS - symbols defined just before .got. +# OTHER_GOT_SECTIONS - sections just after .got. +# OTHER_SDATA_SECTIONS - sections just after .sdata. +# OTHER_BSS_SYMBOLS - symbols that appear at the start of the +# .bss section besides __bss_start. +# DATA_PLT - .plt should be in data segment, not text segment. +# PLT_BEFORE_GOT - .plt just before .got when .plt is in data segement. +# BSS_PLT - .plt should be in bss segment +# TEXT_DYNAMIC - .dynamic in text segment, not data segment. +# EMBEDDED - whether this is for an embedded system. +# SHLIB_TEXT_START_ADDR - if set, add to SIZEOF_HEADERS to set +# start address of shared library. +# INPUT_FILES - INPUT command of files to always include +# WRITABLE_RODATA - if set, the .rodata section should be writable +# INIT_START, INIT_END - statements just before and just after +# combination of .init sections. +# FINI_START, FINI_END - statements just before and just after +# combination of .fini sections. +# STACK_ADDR - start of a .stack section. +# OTHER_END_SYMBOLS - symbols to place right at the end of the script. +# SEPARATE_GOTPLT - if set, .got.plt should be separate output section, +# so that .got can be in the RELRO area. It should be set to +# the number of bytes in the beginning of .got.plt which can be +# in the RELRO area as well. +# +# When adding sections, do note that the names of some sections are used +# when specifying the start address of the next. +# + +# Many sections come in three flavours. There is the 'real' section, +# like ".data". Then there are the per-procedure or per-variable +# sections, generated by -ffunction-sections and -fdata-sections in GCC, +# and useful for --gc-sections, which for a variable "foo" might be +# ".data.foo". Then there are the linkonce sections, for which the linker +# eliminates duplicates, which are named like ".gnu.linkonce.d.foo". +# The exact correspondences are: +# +# Section Linkonce section +# .text .gnu.linkonce.t.foo +# .rodata .gnu.linkonce.r.foo +# .data .gnu.linkonce.d.foo +# .bss .gnu.linkonce.b.foo +# .sdata .gnu.linkonce.s.foo +# .sbss .gnu.linkonce.sb.foo +# .sdata2 .gnu.linkonce.s2.foo +# .sbss2 .gnu.linkonce.sb2.foo +# .debug_info .gnu.linkonce.wi.foo +# .tdata .gnu.linkonce.td.foo +# .tbss .gnu.linkonce.tb.foo +# +# Each of these can also have corresponding .rel.* and .rela.* sections. + +test -z "$ENTRY" && ENTRY=_start +test -z "${BIG_OUTPUT_FORMAT}" && BIG_OUTPUT_FORMAT=${OUTPUT_FORMAT} +test -z "${LITTLE_OUTPUT_FORMAT}" && LITTLE_OUTPUT_FORMAT=${OUTPUT_FORMAT} +if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH}; else OUTPUT_ARCH=${ARCH}:${MACHINE}; fi +test -z "${ELFSIZE}" && ELFSIZE=32 +test -z "${ALIGNMENT}" && ALIGNMENT="${ELFSIZE} / 8" +test "$LD_FLAG" = "N" && DATA_ADDR=. +test -n "$CREATE_SHLIB$CREATE_PIE" && test -n "$SHLIB_DATA_ADDR" && COMMONPAGESIZE="" +test -z "$CREATE_SHLIB$CREATE_PIE" && test -n "$DATA_ADDR" && COMMONPAGESIZE="" +test -n "$RELRO_NOW" && unset SEPARATE_GOTPLT +DATA_SEGMENT_ALIGN="ALIGN(${SEGMENT_SIZE}) + (. & (${MAXPAGESIZE} - 1))" +DATA_SEGMENT_RELRO_END="" +DATA_SEGMENT_RELRO_GOTPLT_END="" +DATA_SEGMENT_END="" +if test -n "${COMMONPAGESIZE}"; then + DATA_SEGMENT_ALIGN="ALIGN (${SEGMENT_SIZE}) - ((${MAXPAGESIZE} - .) & (${MAXPAGESIZE} - 1)); . = DATA_SEGMENT_ALIGN (${MAXPAGESIZE}, ${COMMONPAGESIZE})" + DATA_SEGMENT_END=". = DATA_SEGMENT_END (.);" + if test -n "${SEPARATE_GOTPLT}"; then + DATA_SEGMENT_RELRO_GOTPLT_END=". = DATA_SEGMENT_RELRO_END (${SEPARATE_GOTPLT}, .);" + else + DATA_SEGMENT_RELRO_END=". = DATA_SEGMENT_RELRO_END (0, .);" + fi +fi +INTERP=".interp ${RELOCATING-0} : { *(.interp) }" +PLT=".plt ${RELOCATING-0} : { *(.plt) }" +if test -z "$GOT"; then + if test -z "$SEPARATE_GOTPLT"; then + GOT=".got ${RELOCATING-0} : { *(.got.plt) *(.got) }" + else + GOT=".got ${RELOCATING-0} : { *(.got) }" + GOTPLT="${RELOCATING+${DATA_SEGMENT_RELRO_GOTPLT_END}} + .got.plt ${RELOCATING-0} : { *(.got.plt) }" + fi +fi +DYNAMIC=".dynamic ${RELOCATING-0} : { *(.dynamic) }" +RODATA=".rodata ${RELOCATING-0} : { *(.rodata${RELOCATING+ .rodata.* .gnu.linkonce.r.*}) }" +DATARELRO=".data.rel.ro : { *(.data.rel.ro.local) *(.data.rel.ro*) }" +STACKNOTE="/DISCARD/ : { *(.note.GNU-stack) }" +if test -z "${NO_SMALL_DATA}"; then + SBSS=".sbss ${RELOCATING-0} : + { + ${RELOCATING+PROVIDE (__sbss_start = .);} + ${RELOCATING+PROVIDE (___sbss_start = .);} + ${CREATE_SHLIB+*(.sbss2 .sbss2.* .gnu.linkonce.sb2.*)} + *(.dynsbss) + *(.sbss${RELOCATING+ .sbss.* .gnu.linkonce.sb.*}) + *(.scommon) + ${RELOCATING+PROVIDE (__sbss_end = .);} + ${RELOCATING+PROVIDE (___sbss_end = .);} + }" + SBSS2=".sbss2 ${RELOCATING-0} : { *(.sbss2${RELOCATING+ .sbss2.* .gnu.linkonce.sb2.*}) }" + SDATA="/* We want the small data sections together, so single-instruction offsets + can access them all, and initialized data all before uninitialized, so + we can shorten the on-disk segment size. */ + .sdata ${RELOCATING-0} : + { + ${RELOCATING+${SDATA_START_SYMBOLS}} + ${CREATE_SHLIB+*(.sdata2 .sdata2.* .gnu.linkonce.s2.*)} + *(.sdata${RELOCATING+ .sdata.* .gnu.linkonce.s.*}) + }" + SDATA2=".sdata2 ${RELOCATING-0} : { *(.sdata2${RELOCATING+ .sdata2.* .gnu.linkonce.s2.*}) }" + REL_SDATA=".rel.sdata ${RELOCATING-0} : { *(.rel.sdata${RELOCATING+ .rel.sdata.* .rel.gnu.linkonce.s.*}) } + .rela.sdata ${RELOCATING-0} : { *(.rela.sdata${RELOCATING+ .rela.sdata.* .rela.gnu.linkonce.s.*}) }" + REL_SBSS=".rel.sbss ${RELOCATING-0} : { *(.rel.sbss${RELOCATING+ .rel.sbss.* .rel.gnu.linkonce.sb.*}) } + .rela.sbss ${RELOCATING-0} : { *(.rela.sbss${RELOCATING+ .rela.sbss.* .rela.gnu.linkonce.sb.*}) }" + REL_SDATA2=".rel.sdata2 ${RELOCATING-0} : { *(.rel.sdata2${RELOCATING+ .rel.sdata2.* .rel.gnu.linkonce.s2.*}) } + .rela.sdata2 ${RELOCATING-0} : { *(.rela.sdata2${RELOCATING+ .rela.sdata2.* .rela.gnu.linkonce.s2.*}) }" + REL_SBSS2=".rel.sbss2 ${RELOCATING-0} : { *(.rel.sbss2${RELOCATING+ .rel.sbss2.* .rel.gnu.linkonce.sb2.*}) } + .rela.sbss2 ${RELOCATING-0} : { *(.rela.sbss2${RELOCATING+ .rela.sbss2.* .rela.gnu.linkonce.sb2.*}) }" +else + NO_SMALL_DATA=" " +fi +test -n "$SEPARATE_GOTPLT" && SEPARATE_GOTPLT=" " +CTOR=".ctors ${CONSTRUCTING-0} : + { + ${CONSTRUCTING+${CTOR_START}} + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + + KEEP (*crtbegin*.o(.ctors)) + + /* We don't want to include the .ctor section from + from the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + + KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + ${CONSTRUCTING+${CTOR_END}} + }" +DTOR=".dtors ${CONSTRUCTING-0} : + { + ${CONSTRUCTING+${DTOR_START}} + KEEP (*crtbegin*.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend*.o $OTHER_EXCLUDE_FILES) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + ${CONSTRUCTING+${DTOR_END}} + }" +STACK=" .stack ${RELOCATING-0}${RELOCATING+${STACK_ADDR}} : + { + ${RELOCATING+_stack = .;} + *(.stack) + }" + +# if this is for an embedded system, don't add SIZEOF_HEADERS. +if [ -z "$EMBEDDED" ]; then + test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR} + SIZEOF_HEADERS" +else + test -z "${TEXT_BASE_ADDRESS}" && TEXT_BASE_ADDRESS="${TEXT_START_ADDR}" +fi + +cat <fprintf_func) (info->stream, "$v%d", (l >> OP_SH_FT) & OP_MASK_FT); + break; + + case '?': + /* VFPU extensions. */ + d++; + switch (*d) + { + case '\0': + /* xgettext:c-format */ + (*info->fprintf_func) (info->stream, + _("# internal error, incomplete extension sequence (?)")); + return; + + case 'o': + delta = (l >> OP_SH_VFPU_DELTA) & OP_MASK_VFPU_DELTA; + if (delta & 0x8000) + delta |= ~0xffff; + (*info->fprintf_func) (info->stream, "%d", + delta); + break; + + case '0': + case '1': + case '2': + case '3': + break; + + case '4': + case '5': + case '6': + case '7': + break; + + case 'a': + { + unsigned int c = (l >> OP_SH_VFPU_CONST) & OP_MASK_VFPU_CONST; + if (c < vfpu_num_constants) + { + (*info->fprintf_func) (info->stream, "%s", + vfpu_const_names[c]); + } + break; + } + + case 'b': + /* 5-bit immediate value. */ + (*info->fprintf_func) (info->stream, "%d", + (l >> OP_SH_VFPU_IMM5) & OP_MASK_VFPU_IMM5); + break; + + case 'c': + /* VFPU condition code. */ + (*info->fprintf_func) (info->stream, "%d", + (l >> OP_SH_VFPU_CC) & OP_MASK_VFPU_CC); + break; + + case 'e': + /* 3-bit immediate value. */ + (*info->fprintf_func) (info->stream, "%d", + (l >> OP_SH_VFPU_IMM3) & OP_MASK_VFPU_IMM3); + break; + + case 'f': + /* Conditional compare. */ + (*info->fprintf_func) (info->stream, "%s", + vfpu_cond_names[l & 0x0f]); + /* Apparently this specifier is unused. */ + d++; + break; + + case 'i': + /* 8-bit immediate value. */ + (*info->fprintf_func) (info->stream, "0x%02x", + (l >> OP_SH_VFPU_IMM8) & OP_MASK_VFPU_IMM8); + break; + + case 'q': + /* VFPU control register (vmtvc). */ + (*info->fprintf_func) (info->stream, "$%d", + l & 0xff); + break; + + case 'r': + /* VFPU control register (vmfvc). */ + (*info->fprintf_func) (info->stream, "$%d", + (l >> 8) & 0xff); + break; + + case 'u': + break; + + case 'w': + break; + + case 'd': + case 'm': + case 'n': + case 's': + case 't': + case 'v': + case 'x': + break; + + case 'z': + (*info->fprintf_func) (info->stream, "%s", + vfpu_rwb_names[(l >> 1) & 0x1]); + break; + + default: + /* xgettext:c-format */ + (*info->fprintf_func) (info->stream, + _("# internal error, undefined extension sequence (?%c)"), + *d); + return; + } break; default: diff -Nbaur binutils-2.16.1/opcodes/mips-opc.c binutils-2.16.1-new/opcodes/mips-opc.c --- binutils-2.16.1/opcodes/mips-opc.c Thu Mar 3 11:49:50 2005 +++ binutils-2.16.1-new/opcodes/mips-opc.c Wed Jul 6 01:56:42 2005 @@ -109,6 +109,7 @@ #define N5 (INSN_5400 | INSN_5500) #define N54 INSN_5400 #define N55 INSN_5500 +#define AL INSN_ALLEGREX #define G1 (T3 \ ) @@ -271,6 +272,7 @@ {"bnel", "s,t,p", 0x54000000, 0xfc000000, CBL|RD_s|RD_t, 0, I2|T3 }, {"bnel", "s,I,p", 0, (int) M_BNEL_I, INSN_MACRO, 0, I2|T3 }, {"break", "", 0x0000000d, 0xffffffff, TRAP, 0, I1 }, +{"break", "B", 0x0000000d, 0xfc00003f, TRAP, 0, I32|AL }, {"break", "c", 0x0000000d, 0xfc00ffff, TRAP, 0, I1 }, {"break", "c,q", 0x0000000d, 0xfc00003f, TRAP, 0, I1 }, {"c.f.d", "S,T", 0x46200030, 0xffe007ff, RD_S|RD_T|WR_CC|FP_D, 0, I1 }, @@ -432,7 +434,7 @@ {"cabs.un.d", "M,S,T", 0x46200071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, {"cabs.un.ps", "M,S,T", 0x46c00071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_D, 0, M3D }, {"cabs.un.s", "M,S,T", 0x46000071, 0xffe000ff, RD_S|RD_T|WR_CC|FP_S, 0, M3D }, -{"cache", "k,o(b)", 0xbc000000, 0xfc000000, RD_b, 0, I3|I32|T3}, +{"cache", "k,o(b)", 0xbc000000, 0xfc000000, RD_b, 0, I3|I32|T3|AL}, {"ceil.l.d", "D,S", 0x4620000a, 0xffff003f, WR_D|RD_S|FP_D, 0, I3 }, {"ceil.l.s", "D,S", 0x4600000a, 0xffff003f, WR_D|RD_S|FP_S, 0, I3 }, {"ceil.w.d", "D,S", 0x4620000e, 0xffff003f, WR_D|RD_S|FP_D, 0, I2 }, @@ -443,7 +445,9 @@ /* cfc2 is at the bottom of the table. */ {"cfc3", "t,G", 0x4c400000, 0xffe007ff, LCD|WR_t|RD_C3, 0, I1 }, {"clo", "U,s", 0x70000021, 0xfc0007ff, WR_d|WR_t|RD_s, 0, I32|N55 }, +{"clo", "d,s", 0x00000017, 0xfc1f07ff, WR_d|RD_s, 0, AL }, {"clz", "U,s", 0x70000020, 0xfc0007ff, WR_d|WR_t|RD_s, 0, I32|N55 }, +{"clz", "d,s", 0x00000016, 0xfc1f07ff, WR_d|RD_s, 0, AL }, {"ctc0", "t,G", 0x40c00000, 0xffe007ff, COD|RD_t|WR_CC, 0, I1 }, {"ctc1", "t,G", 0x44c00000, 0xffe007ff, COD|RD_t|WR_CC|FP_S, 0, I1 }, {"ctc1", "t,S", 0x44c00000, 0xffe007ff, COD|RD_t|WR_CC|FP_S, 0, I1 }, @@ -465,10 +469,12 @@ {"cvt.ps.s","D,V,T", 0x46000026, 0xffe0003f, WR_D|RD_S|RD_T|FP_D, 0, I5 }, {"cvt.pw.ps", "D,S", 0x46c00024, 0xffff003f, WR_D|RD_S|FP_S|FP_D, 0, M3D }, {"dabs", "d,v", 0, (int) M_DABS, INSN_MACRO, 0, I3 }, +{"max", "d,v,t", 0x0000002c, 0xfc0007ff, WR_d|RD_s|RD_t, 0, AL }, {"dadd", "d,v,t", 0x0000002c, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, {"dadd", "t,r,I", 0, (int) M_DADD_I, INSN_MACRO, 0, I3 }, {"daddi", "t,r,j", 0x60000000, 0xfc000000, WR_t|RD_s, 0, I3 }, {"daddiu", "t,r,j", 0x64000000, 0xfc000000, WR_t|RD_s, 0, I3 }, +{"min", "d,v,t", 0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t, 0, AL }, {"daddu", "d,v,t", 0x0000002d, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I3 }, {"daddu", "t,r,I", 0, (int) M_DADDU_I, INSN_MACRO, 0, I3 }, {"dbreak", "", 0x7000003f, 0xffffffff, 0, 0, N5 }, @@ -595,8 +601,8 @@ {"dsubu", "d,v,I", 0, (int) M_DSUBU_I, INSN_MACRO, 0, I3 }, {"ei", "", 0x41606020, 0xffffffff, WR_t|WR_C0, 0, I33 }, {"ei", "t", 0x41606020, 0xffe0ffff, WR_t|WR_C0, 0, I33 }, -{"eret", "", 0x42000018, 0xffffffff, 0, 0, I3|I32 }, -{"ext", "t,r,+A,+C", 0x7c000000, 0xfc00003f, WR_t|RD_s, 0, I33 }, +{"eret", "", 0x42000018, 0xffffffff, 0, 0, I3|I32|AL }, +{"ext", "t,r,+A,+C", 0x7c000000, 0xfc00003f, WR_t|RD_s, 0, I33|AL }, {"floor.l.d", "D,S", 0x4620000b, 0xffff003f, WR_D|RD_S|FP_D, 0, I3 }, {"floor.l.s", "D,S", 0x4600000b, 0xffff003f, WR_D|RD_S|FP_S, 0, I3 }, {"floor.w.d", "D,S", 0x4620000f, 0xffff003f, WR_D|RD_S|FP_D, 0, I2 }, @@ -605,7 +611,7 @@ {"flushd", "", 0xbc020000, 0xffffffff, 0, 0, L1 }, {"flushid", "", 0xbc030000, 0xffffffff, 0, 0, L1 }, {"hibernate","", 0x42000023, 0xffffffff, 0, 0, V1 }, -{"ins", "t,r,+A,+B", 0x7c000004, 0xfc00003f, WR_t|RD_s, 0, I33 }, +{"ins", "t,r,+A,+B", 0x7c000004, 0xfc00003f, WR_t|RD_s, 0, I33|AL }, {"jr", "s", 0x00000008, 0xfc1fffff, UBD|RD_s, 0, I1 }, {"jr.hb", "s", 0x00000408, 0xfc1fffff, UBD|RD_s, 0, I33 }, {"j", "s", 0x00000008, 0xfc1fffff, UBD|RD_s, 0, I1 }, /* jr */ @@ -639,18 +645,11 @@ {"ld", "t,o(b)", 0xdc000000, 0xfc000000, WR_t|RD_b, 0, I3 }, {"ld", "t,o(b)", 0, (int) M_LD_OB, INSN_MACRO, 0, I1 }, {"ld", "t,A(b)", 0, (int) M_LD_AB, INSN_MACRO, 0, I1 }, -{"ldc1", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, -{"ldc1", "E,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, -{"ldc1", "T,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, -{"ldc1", "E,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, -{"l.d", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, /* ldc1 */ -{"l.d", "T,o(b)", 0, (int) M_L_DOB, INSN_MACRO, 0, I1 }, -{"l.d", "T,A(b)", 0, (int) M_L_DAB, INSN_MACRO, 0, I1 }, -{"ldc2", "E,o(b)", 0xd8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I2 }, -{"ldc2", "E,A(b)", 0, (int) M_LDC2_AB, INSN_MACRO, 0, I2 }, +/* ldc1 is at the bottom of the table. */ +/* ldc2 is at the bottom of the table. */ {"ldc3", "E,o(b)", 0xdc000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I2 }, {"ldc3", "E,A(b)", 0, (int) M_LDC3_AB, INSN_MACRO, 0, I2 }, -{"ldl", "t,o(b)", 0x68000000, 0xfc000000, LDD|WR_t|RD_b, 0, I3 }, +{"ldl", "t,o(b)", 0x68000000, 0xfc000000, LDD|WR_t|RD_b, 0, I3|AL }, {"ldl", "t,A(b)", 0, (int) M_LDL_AB, INSN_MACRO, 0, I3 }, {"ldr", "t,o(b)", 0x6c000000, 0xfc000000, LDD|WR_t|RD_b, 0, I3 }, {"ldr", "t,A(b)", 0, (int) M_LDR_AB, INSN_MACRO, 0, I3 }, @@ -680,8 +679,7 @@ {"lwc1", "E,A(b)", 0, (int) M_LWC1_AB, INSN_MACRO, 0, I1 }, {"l.s", "T,o(b)", 0xc4000000, 0xfc000000, CLD|RD_b|WR_T|FP_S, 0, I1 }, /* lwc1 */ {"l.s", "T,A(b)", 0, (int) M_LWC1_AB, INSN_MACRO, 0, I1 }, -{"lwc2", "E,o(b)", 0xc8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, -{"lwc2", "E,A(b)", 0, (int) M_LWC2_AB, INSN_MACRO, 0, I1 }, +/* lwc2 is at the bottom of the table. */ {"lwc3", "E,o(b)", 0xcc000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, {"lwc3", "E,A(b)", 0, (int) M_LWC3_AB, INSN_MACRO, 0, I1 }, {"lwl", "t,o(b)", 0x88000000, 0xfc000000, LDD|RD_b|WR_t, 0, I1 }, @@ -713,10 +711,12 @@ {"madd.s", "D,R,S,T", 0x4c000020, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4 }, {"madd.ps", "D,R,S,T", 0x4c000026, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5 }, {"madd", "s,t", 0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, +{"madd", "s,t", 0x0000001c, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, AL }, {"madd", "s,t", 0x70000000, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55}, {"madd", "s,t", 0x70000000, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, G1 }, {"madd", "d,s,t", 0x70000000, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, {"maddu", "s,t", 0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, +{"maddu", "s,t", 0x0000001d, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, AL }, {"maddu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55}, {"maddu", "s,t", 0x70000001, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, G1 }, {"maddu", "d,s,t", 0x70000001, 0xfc0007ff, RD_s|RD_t|WR_HILO|WR_d|IS_M, 0, G1 }, @@ -756,7 +756,7 @@ {"movf.l", "X,Y,N", 0x46a00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, {"movf.s", "D,S,N", 0x46000011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, 0, I4|I32 }, {"movf.ps", "D,S,N", 0x46c00011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I5 }, -{"movn", "d,v,t", 0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32 }, +{"movn", "d,v,t", 0x0000000b, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32|AL }, {"ffc", "d,v", 0x0000000b, 0xfc1f07ff, WR_d|RD_s, 0, L1 }, {"movn.d", "D,S,t", 0x46200013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I4|I32 }, {"movn.l", "D,S,t", 0x46a00013, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, @@ -769,7 +769,7 @@ {"movt.l", "X,Y,N", 0x46a10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, MX|SB1 }, {"movt.s", "D,S,N", 0x46010011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_S, 0, I4|I32 }, {"movt.ps", "D,S,N", 0x46c10011, 0xffe3003f, WR_D|RD_S|RD_CC|FP_D, 0, I5 }, -{"movz", "d,v,t", 0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32 }, +{"movz", "d,v,t", 0x0000000a, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I4|I32|AL }, {"ffs", "d,v", 0x0000000a, 0xfc1f07ff, WR_d|RD_s, 0, L1 }, {"movz.d", "D,S,t", 0x46200012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, I4|I32 }, {"movz.l", "D,S,t", 0x46a00012, 0xffe0003f, WR_D|RD_S|RD_t|FP_D, 0, MX|SB1 }, @@ -786,8 +786,10 @@ {"msub.s", "D,R,S,T", 0x4c000028, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_S, 0, I4 }, {"msub.ps", "D,R,S,T", 0x4c00002e, 0xfc00003f, RD_R|RD_S|RD_T|WR_D|FP_D, 0, I5 }, {"msub", "s,t", 0x0000001e, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, +{"msub", "s,t", 0x0000002e, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, AL }, {"msub", "s,t", 0x70000004, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, {"msubu", "s,t", 0x0000001f, 0xfc00ffff, RD_s|RD_t|WR_HILO, 0, L1 }, +{"msubu", "s,t", 0x0000002f, 0xfc00ffff, RD_s|RD_t|WR_HILO|IS_M, 0, AL }, {"msubu", "s,t", 0x70000005, 0xfc00ffff, RD_s|RD_t|MOD_HILO, 0, I32|N55 }, {"mtpc", "t,P", 0x4080c801, 0xffe0ffc1, COD|RD_t|WR_C0, 0, M1|N5 }, {"mtps", "t,P", 0x4080c800, 0xffe0ffc1, COD|RD_t|WR_C0, 0, M1|N5 }, @@ -936,13 +938,13 @@ {"rol", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, 0, I1 }, {"ror", "d,v,t", 0, (int) M_ROR, INSN_MACRO, 0, I1 }, {"ror", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, 0, I1 }, -{"ror", "d,w,<", 0x00200002, 0xffe0003f, WR_d|RD_t, 0, N5|I33 }, -{"rorv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, N5|I33 }, -{"rotl", "d,v,t", 0, (int) M_ROL, INSN_MACRO, 0, I33 }, -{"rotl", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, 0, I33 }, -{"rotr", "d,v,t", 0, (int) M_ROR, INSN_MACRO, 0, I33 }, -{"rotr", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, 0, I33 }, -{"rotrv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, I33 }, +{"ror", "d,w,<", 0x00200002, 0xffe0003f, WR_d|RD_t, 0, N5|I33|AL }, +{"rorv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, N5|I33|AL }, +{"rotl", "d,v,t", 0, (int) M_ROL, INSN_MACRO, 0, I33|AL }, +{"rotl", "d,v,I", 0, (int) M_ROL_I, INSN_MACRO, 0, I33|AL }, +{"rotr", "d,v,t", 0, (int) M_ROR, INSN_MACRO, 0, I33|AL }, +{"rotr", "d,v,I", 0, (int) M_ROR_I, INSN_MACRO, 0, I33|AL }, +{"rotrv", "d,t,s", 0x00000046, 0xfc0007ff, RD_t|RD_s|WR_d, 0, I33|AL }, {"round.l.d", "D,S", 0x46200008, 0xffff003f, WR_D|RD_S|FP_D, 0, I3 }, {"round.l.s", "D,S", 0x46000008, 0xffff003f, WR_D|RD_S|FP_S, 0, I3 }, {"round.w.d", "D,S", 0x4620000c, 0xffff003f, WR_D|RD_S|FP_D, 0, I2 }, @@ -974,24 +976,18 @@ {"sdbbp", "c,q", 0x0000000e, 0xfc00003f, TRAP, 0, G2 }, {"sdbbp", "", 0x7000003f, 0xffffffff, TRAP, 0, I32 }, {"sdbbp", "B", 0x7000003f, 0xfc00003f, TRAP, 0, I32 }, -{"sdc1", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, -{"sdc1", "E,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, -{"sdc1", "T,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, -{"sdc1", "E,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, -{"sdc2", "E,o(b)", 0xf8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I2 }, -{"sdc2", "E,A(b)", 0, (int) M_SDC2_AB, INSN_MACRO, 0, I2 }, +/* sdc1 is at the bottom of the table. */ +/* sdc2 is at the bottom of the table. */ {"sdc3", "E,o(b)", 0xfc000000, 0xfc000000, SM|RD_C3|RD_b, 0, I2 }, {"sdc3", "E,A(b)", 0, (int) M_SDC3_AB, INSN_MACRO, 0, I2 }, -{"s.d", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, -{"s.d", "T,o(b)", 0, (int) M_S_DOB, INSN_MACRO, 0, I1 }, -{"s.d", "T,A(b)", 0, (int) M_S_DAB, INSN_MACRO, 0, I1 }, -{"sdl", "t,o(b)", 0xb0000000, 0xfc000000, SM|RD_t|RD_b, 0, I3 }, +/* s.d (sdc1 is at the bottom of the table. */ +{"sdl", "t,o(b)", 0xb0000000, 0xfc000000, SM|RD_t|RD_b, 0, I3|AL }, {"sdl", "t,A(b)", 0, (int) M_SDL_AB, INSN_MACRO, 0, I3 }, {"sdr", "t,o(b)", 0xb4000000, 0xfc000000, SM|RD_t|RD_b, 0, I3 }, {"sdr", "t,A(b)", 0, (int) M_SDR_AB, INSN_MACRO, 0, I3 }, {"sdxc1", "S,t(b)", 0x4c000009, 0xfc0007ff, SM|RD_S|RD_t|RD_b, 0, I4 }, -{"seb", "d,w", 0x7c000420, 0xffe007ff, WR_d|RD_t, 0, I33 }, -{"seh", "d,w", 0x7c000620, 0xffe007ff, WR_d|RD_t, 0, I33 }, +{"seb", "d,w", 0x7c000420, 0xffe007ff, WR_d|RD_t, 0, I33|AL }, +{"seh", "d,w", 0x7c000620, 0xffe007ff, WR_d|RD_t, 0, I33|AL }, {"selsl", "d,v,t", 0x00000005, 0xfc0007ff, WR_d|RD_s|RD_t, 0, L1 }, {"selsr", "d,v,t", 0x00000001, 0xfc0007ff, WR_d|RD_s|RD_t, 0, L1 }, {"seq", "d,v,t", 0, (int) M_SEQ, INSN_MACRO, 0, I1 }, @@ -1083,8 +1079,7 @@ {"swc1", "E,A(b)", 0, (int) M_SWC1_AB, INSN_MACRO, 0, I1 }, {"s.s", "T,o(b)", 0xe4000000, 0xfc000000, SM|RD_T|RD_b|FP_S, 0, I1 }, /* swc1 */ {"s.s", "T,A(b)", 0, (int) M_SWC1_AB, INSN_MACRO, 0, I1 }, -{"swc2", "E,o(b)", 0xe8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I1 }, -{"swc2", "E,A(b)", 0, (int) M_SWC2_AB, INSN_MACRO, 0, I1 }, +/* swc2 is at the bottom of the table. */ {"swc3", "E,o(b)", 0xec000000, 0xfc000000, SM|RD_C3|RD_b, 0, I1 }, {"swc3", "E,A(b)", 0, (int) M_SWC3_AB, INSN_MACRO, 0, I1 }, {"swl", "t,o(b)", 0xa8000000, 0xfc000000, SM|RD_t|RD_b, 0, I1 }, @@ -1169,7 +1164,8 @@ {"waiti", "", 0x42000020, 0xffffffff, TRAP, 0, L1 }, {"wb", "o(b)", 0xbc040000, 0xfc1f0000, SM|RD_b, 0, L1 }, {"wrpgpr", "d,w", 0x41c00000, 0xffe007ff, RD_t, 0, I33 }, -{"wsbh", "d,w", 0x7c0000a0, 0xffe007ff, WR_d|RD_t, 0, I33 }, +{"wsbh", "d,w", 0x7c0000a0, 0xffe007ff, WR_d|RD_t, 0, I33|AL }, +{"wsbw", "d,t", 0x7c0000e0, 0xffe007ff, WR_d|RD_t, 0, AL }, {"xor", "d,v,t", 0x00000026, 0xfc0007ff, WR_d|RD_s|RD_t, 0, I1 }, {"xor", "t,r,I", 0, (int) M_XOR_I, INSN_MACRO, 0, I1 }, {"xor.ob", "X,Y,Q", 0x7800000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX|SB1 }, @@ -1179,6 +1175,320 @@ {"xor.qh", "X,Y,Q", 0x7820000d, 0xfc20003f, WR_D|RD_S|RD_T|FP_D, 0, MX }, {"xori", "t,r,i", 0x38000000, 0xfc000000, WR_t|RD_s, 0, I1 }, +/* Sony Allegrex CPU core. */ +{"bitrev", "d,t", 0x7c000520, 0xffe007ff, WR_d|RD_t, 0, AL }, + +/* Sony Allegrex VFPU instructions. */ +/* MRB: I don't know all of the instructions that should be using WR_C2/RD_C2 (they're just synonyms + for INSN_COP). It's not that important and more for reference, but someone should fill them in later. */ +/* MRB: I don't know the real macro names either, so they are assumed from the opcode's name. */ +{"bvf", "?c,p", 0x49000000, 0xffe30000, CBD|RD_CC, 0, AL }, +{"bvfl", "?c,p", 0x49020000, 0xffe30000, CBL|RD_CC, 0, AL }, +{"bvt", "?c,p", 0x49010000, 0xffe30000, CBD|RD_CC, 0, AL }, +{"bvtl", "?c,p", 0x49030000, 0xffe30000, CBL|RD_CC, 0, AL }, +{"lv.s", "?m0x,?o(b)", 0xc8000000, 0xfc000000, CLD|RD_s|WR_CC, 0, AL }, +{"lv.s", "?m0x,A(b)", 0 , 0x00000073, INSN_MACRO, 0, AL }, +{"ulv.s", "?m0x,o(b)", 0 , 0x000000da, INSN_MACRO, 0, AL }, +{"lv.q", "?n3x,?o(b)", 0xd8000000, 0xfc000002, CLD|RD_s|WR_CC, 0, AL }, +{"lv.q", "?n3x,A(b)", 0 , 0x00000074, INSN_MACRO, 0, AL }, +{"ulv.q", "?n3x,?o(b)", 0 , 0x000000dc, INSN_MACRO, 0, AL }, +{"ulv.q", "?n3x,A(b)", 0 , 0x000000dd, INSN_MACRO, 0, AL }, +{"lvi.s", "?t0x,l?y0", 0 , 0x00000062, INSN_MACRO, 0, AL }, +{"lvi.p", "?t1x,?[l?y0,l?y1?]", 0 , 0x00000063, INSN_MACRO, 0, AL }, +{"lvi.t", "?t2x,?[l?y0,l?y1,l?y2?]", 0 , 0x00000064, INSN_MACRO, 0, AL }, +{"lvi.q", "?t3x,?[l?y0,l?y1,l?y2,l?y3?]", 0 , 0x00000065, INSN_MACRO, 0, AL }, +{"lvhi.s", "?t0x,?[?u?y0,?u?y1?]", 0 , 0x00000060, INSN_MACRO, 0, AL }, +{"lvhi.p", "?t1x,?[?u?y0,?u?y1,?u?y2,?u?y3?]", 0 , 0x00000061, INSN_MACRO, 0, AL }, +{"sv.s", "?m0x,?o(b)", 0xe8000000, 0xfc000000, SM|RD_s|RD_C0, 0, AL }, +{"sv.s", "?m0x,A(b)", 0 , 0x000000bf, INSN_MACRO, 0, AL }, +{"usv.s", "?m0x,o(b)", 0 , 0x000000e4, INSN_MACRO, 0, AL }, +{"sv.q", "?n3x,?o(b)", 0xf8000000, 0xfc000002, SM|RD_s|RD_C0, 0, AL }, +{"sv.q", "?n3x,?o(b),?z", 0xf8000000, 0xfc000000, SM|RD_s|RD_C0, 0, AL }, +{"sv.q", "?n3x,A(b)", 0 , 0x000000c0, INSN_MACRO, 0, AL }, +{"sv.q", "?n3x,A(b),?z", 0 , 0x000000c0, INSN_MACRO, 0, AL }, +{"sv.q", "?n3x,A,?z", 0 , 0x000000c0, INSN_MACRO, 0, AL }, +{"usv.q", "?n3x,?o(b)", 0 , 0x000000e6, INSN_MACRO, 0, AL }, +{"usv.q", "?n3x,A(b)", 0 , 0x000000e7, INSN_MACRO, 0, AL }, +{"vwb.q", "?n3x,?o(b)", 0xf8000002, 0xfc000002, SM|RD_s|RD_C0, 0, AL }, +{"lvl.q", "?n3x,?o(b)", 0xd4000000, 0xfc000002, CLD|RD_s|WR_CC, 0, AL }, +{"lvl.q", "?n3x,A(b)", 0 , 0x00000075, INSN_MACRO, 0, AL }, +{"lvr.q", "?n3x,?o(b)", 0xd4000002, 0xfc000002, CLD|RD_s|WR_CC, 0, AL }, +{"lvr.q", "?n3x,A(b)", 0 , 0x00000076, INSN_MACRO, 0, AL }, +{"svl.q", "?n3x,?o(b)", 0xf4000000, 0xfc000002, SM|RD_s|RD_C0, 0, AL }, +{"svl.q", "?n3x,A(b)", 0 , 0x000000c1, INSN_MACRO, 0, AL }, +{"svr.q", "?n3x,?o(b)", 0xf4000002, 0xfc000002, SM|RD_s|RD_C0, 0, AL }, +{"svr.q", "?n3x,A(b)", 0 , 0x000000c2, INSN_MACRO, 0, AL }, +{"mtv", "t,?d0z", 0x48e00000, 0xffe0ff80, LCD|WR_t|RD_C0, 0, AL }, +{"mfv", "t,?d0z", 0x48600000, 0xffe0ff80, COD|RD_t|WR_CC|RD_C0, 0, AL }, +{"mtvc", "t,?q", 0x48e00000, 0xffe0ff00, LCD|WR_t|RD_C0, 0, AL }, +{"mfvc", "t,?q", 0x48600000, 0xffe0ff00, COD|RD_t|WR_CC|RD_C0, 0, AL }, +{"vmtvc", "?q,?s0y", 0xd0510000, 0xffff8000, RD_C0, 0, AL }, +{"vmfvc", "?d0z,?r", 0xd0500000, 0xffff0080, RD_C0, 0, AL }, +{"vadd.q", "?d3d,?s3s,?t3t", 0x60008080, 0xff808080, RD_C0, 0, AL }, +{"vsub.q", "?d3d,?s3s,?t3t", 0x60808080, 0xff808080, RD_C0, 0, AL }, +{"vdiv.q", "?x3z,?s3y,?t3x", 0x63808080, 0xff808080, RD_C0, 0, AL }, +{"vmul.q", "?d3d,?s3s,?t3t", 0x64008080, 0xff808080, RD_C0, 0, AL }, +{"vdot.q", "?d0d,?s3s,?t3t", 0x64808080, 0xff808080, RD_C0, 0, AL }, +{"vscl.q", "?d3d,?s3s,?t0x", 0x65008080, 0xff808080, RD_C0, 0, AL }, +{"vhdp.q", "?d0d,?s3y,?t3t", 0x66008080, 0xff808080, RD_C0, 0, AL }, +{"vcmp.q", "?f2,?s3s,?t3t", 0x6c008080, 0xff8080f0, RD_C0, 0, AL }, +{"vcmp.q", "?f1,?s3s", 0x6c008080, 0xffff80f0, RD_C0, 0, AL }, +{"vcmp.q", "?f0", 0x6c008080, 0xfffffff0, RD_C0, 0, AL }, +{"vmin.q", "?d3d,?s3s,?t3t", 0x6d008080, 0xff808080, RD_C0, 0, AL }, +{"vmax.q", "?d3d,?s3s,?t3t", 0x6d808080, 0xff808080, RD_C0, 0, AL }, +{"vsgn.q", "?d3d,?s3s", 0xd04a8080, 0xffff8080, RD_C0, 0, AL }, +{"vcst.q", "?d3d,?a", 0xd0608080, 0xffe0ff80, RD_C0, 0, AL }, +{"vscmp.q", "?d3d,?s3s,?t3t", 0x6e808080, 0xff808080, RD_C0, 0, AL }, +{"vsge.q", "?d3d,?s3s,?t3t", 0x6f008080, 0xff808080, RD_C0, 0, AL }, +{"vslt.q", "?d3d,?s3s,?t3t", 0x6f808080, 0xff808080, RD_C0, 0, AL }, +{"vi2uc.q", "?d0m,?s3w", 0xd03c8080, 0xffff8080, RD_C0, 0, AL }, +{"vi2c.q", "?d0m,?s3w", 0xd03d8080, 0xffff8080, RD_C0, 0, AL }, +{"vi2us.q", "?d1m,?s3w", 0xd03e8080, 0xffff8080, RD_C0, 0, AL }, +{"vi2s.q", "?d1m,?s3w", 0xd03f8080, 0xffff8080, RD_C0, 0, AL }, +{"vmov.q", "?d3d,?s3s", 0xd0008080, 0xffff8080, RD_C0, 0, AL }, +{"vabs.q", "?d3d,?s3w", 0xd0018080, 0xffff8080, RD_C0, 0, AL }, +{"vneg.q", "?d3d,?s3w", 0xd0028080, 0xffff8080, RD_C0, 0, AL }, +{"vidt.q", "?d3d", 0xd0038080, 0xffffff80, RD_C0, 0, AL }, +{"vsat0.q", "?d3z,?s3s", 0xd0048080, 0xffff8080, RD_C0, 0, AL }, +{"vsat1.q", "?d3z,?s3s", 0xd0058080, 0xffff8080, RD_C0, 0, AL }, +{"vzero.q", "?d3d", 0xd0068080, 0xffffff80, RD_C0, 0, AL }, +{"vone.q", "?d3d", 0xd0078080, 0xffffff80, RD_C0, 0, AL }, +{"vrcp.q", "?x3z,?s3y", 0xd0108080, 0xffff8080, RD_C0, 0, AL }, +{"vrsq.q", "?x3z,?s3y", 0xd0118080, 0xffff8080, RD_C0, 0, AL }, +{"vsin.q", "?x3z,?s3y", 0xd0128080, 0xffff8080, RD_C0, 0, AL }, +{"vcos.q", "?x3z,?s3y", 0xd0138080, 0xffff8080, RD_C0, 0, AL }, +{"vexp2.q", "?x3z,?s3y", 0xd0148080, 0xffff8080, RD_C0, 0, AL }, +{"vlog2.q", "?x3z,?s3y", 0xd0158080, 0xffff8080, RD_C0, 0, AL }, +{"vsqrt.q", "?x3z,?s3y", 0xd0168080, 0xffff8080, RD_C0, 0, AL }, +{"vasin.q", "?x3z,?s3y", 0xd0178080, 0xffff8080, RD_C0, 0, AL }, +{"vnrcp.q", "?x3z,?s3y", 0xd0188080, 0xffff8080, RD_C0, 0, AL }, +{"vnsin.q", "?x3z,?s3y", 0xd01a8080, 0xffff8080, RD_C0, 0, AL }, +{"vrexp2.q", "?x3z,?s3y", 0xd01c8080, 0xffff8080, RD_C0, 0, AL }, +{"vrndi.q", "?d3z", 0xd0218080, 0xffffff80, RD_C0, 0, AL }, +{"vrndf1.q", "?d3z", 0xd0228080, 0xffffff80, RD_C0, 0, AL }, +{"vrndf2.q", "?d3z", 0xd0238080, 0xffffff80, RD_C0, 0, AL }, +{"vf2h.q", "?d1m,?s3s", 0xd0328080, 0xffff8080, RD_C0, 0, AL }, +{"vsrt1.q", "?d3d,?s3s", 0xd0408080, 0xffff8080, RD_C0, 0, AL }, +{"vsrt2.q", "?d3d,?s3s", 0xd0418080, 0xffff8080, RD_C0, 0, AL }, +{"vsrt3.q", "?d3d,?s3s", 0xd0488080, 0xffff8080, RD_C0, 0, AL }, +{"vsrt4.q", "?d3d,?s3s", 0xd0498080, 0xffff8080, RD_C0, 0, AL }, +{"vbfy1.q", "?d3d,?s3s", 0xd0428080, 0xffff8080, RD_C0, 0, AL }, +{"vbfy2.q", "?d3d,?s3s", 0xd0438080, 0xffff8080, RD_C0, 0, AL }, +{"vocp.q", "?d3d,?s3y", 0xd0448080, 0xffff8080, RD_C0, 0, AL }, +{"vfad.q", "?d0d,?s3s", 0xd0468080, 0xffff8080, RD_C0, 0, AL }, +{"vavg.q", "?d0d,?s3s", 0xd0478080, 0xffff8080, RD_C0, 0, AL }, +{"vf2in.q", "?d3m,?s3s,?b", 0xd2008080, 0xffe08080, RD_C0, 0, AL }, +{"vf2iz.q", "?d3m,?s3s,?b", 0xd2208080, 0xffe08080, RD_C0, 0, AL }, +{"vf2iu.q", "?d3m,?s3s,?b", 0xd2408080, 0xffe08080, RD_C0, 0, AL }, +{"vf2id.q", "?d3m,?s3s,?b", 0xd2608080, 0xffe08080, RD_C0, 0, AL }, +{"vi2f.q", "?d3d,?s3w,?b", 0xd2808080, 0xffe08080, RD_C0, 0, AL }, +{"vcmov.q", "?d3d,?s3s,?e", 0 , 0x000000e9, INSN_MACRO, 0, AL }, +{"vcmovt.q", "?d3d,?s3s,?e", 0xd2a08080, 0xfff88080, RD_C0, 0, AL }, +{"vcmovf.q", "?d3d,?s3s,?e", 0xd2a88080, 0xfff88080, RD_C0, 0, AL }, +{"vmmul.q", "?v7z,?s7y,?t7x", 0xf0008080, 0xff808080, RD_C0, 0, AL }, +{"vtfm4.q", "?v3z,?s7y,?t3x", 0xf1808080, 0xff808080, RD_C0, 0, AL }, +{"vhtfm4.q", "?v3z,?s7y,?t3x", 0xf1808000, 0xff808080, RD_C0, 0, AL }, +{"vmscl.q", "?x7z,?s7y,?t0x", 0xf2008080, 0xff808080, RD_C0, 0, AL }, +{"vqmul.q", "?v3z,?s3y,?t3x", 0xf2808080, 0xff808080, RD_C0, 0, AL }, +{"vmmov.q", "?x7z,?s7y", 0xf3808080, 0xffff8080, RD_C0, 0, AL }, +{"vmidt.q", "?d7z", 0xf3838080, 0xffffff80, RD_C0, 0, AL }, +{"vmzero.q", "?d7z", 0xf3868080, 0xffffff80, RD_C0, 0, AL }, +{"vmone.q", "?d7z", 0xf3878080, 0xffffff80, RD_C0, 0, AL }, +{"vrot.q", "?x3z,?s0y,?w", 0xf3a08080, 0xffe08080, RD_C0, 0, AL }, +{"vt4444.q", "?d1z,?s3w", 0xd0598080, 0xffff8080, RD_C0, 0, AL }, +{"vt5551.q", "?d1z,?s3w", 0xd05a8080, 0xffff8080, RD_C0, 0, AL }, +{"vt5650.q", "?d1z,?s3w", 0xd05b8080, 0xffff8080, RD_C0, 0, AL }, +{"vadd.t", "?d2d,?s2s,?t2t", 0x60008000, 0xff808080, RD_C0, 0, AL }, +{"vsub.t", "?d2d,?s2s,?t2t", 0x60808000, 0xff808080, RD_C0, 0, AL }, +{"vdiv.t", "?x2z,?s2y,?t2x", 0x63808000, 0xff808080, RD_C0, 0, AL }, +{"vmul.t", "?d2d,?s2s,?t2t", 0x64008000, 0xff808080, RD_C0, 0, AL }, +{"vdot.t", "?d0d,?s2s,?t2t", 0x64808000, 0xff808080, RD_C0, 0, AL }, +{"vscl.t", "?d2d,?s2s,?t0x", 0x65008000, 0xff808080, RD_C0, 0, AL }, +{"vhdp.t", "?d0d,?s2y,?t2t", 0x66008000, 0xff808080, RD_C0, 0, AL }, +{"vcrs.t", "?d2d,?s2y,?t2x", 0x66808000, 0xff808080, RD_C0, 0, AL }, +{"vcmp.t", "?f2,?s2s,?t2t", 0x6c008000, 0xff8080f0, RD_C0, 0, AL }, +{"vcmp.t", "?f1,?s2s", 0x6c008000, 0xffff80f0, RD_C0, 0, AL }, +{"vcmp.t", "?f0", 0x6c008000, 0xfffffff0, RD_C0, 0, AL }, +{"vmin.t", "?d2d,?s2s,?t2t", 0x6d008000, 0xff808080, RD_C0, 0, AL }, +{"vmax.t", "?d2d,?s2s,?t2t", 0x6d808000, 0xff808080, RD_C0, 0, AL }, +{"vsgn.t", "?d2d,?s2s", 0xd04a8000, 0xffff8080, RD_C0, 0, AL }, +{"vcst.t", "?d2d,?a", 0xd0608000, 0xffe0ff80, RD_C0, 0, AL }, +{"vscmp.t", "?d2d,?s2s,?t2t", 0x6e808000, 0xff808080, RD_C0, 0, AL }, +{"vsge.t", "?d2d,?s2s,?t2t", 0x6f008000, 0xff808080, RD_C0, 0, AL }, +{"vslt.t", "?d2d,?s2s,?t2t", 0x6f808000, 0xff808080, RD_C0, 0, AL }, +{"vmov.t", "?d2d,?s2s", 0xd0008000, 0xffff8080, RD_C0, 0, AL }, +{"vabs.t", "?d2d,?s2w", 0xd0018000, 0xffff8080, RD_C0, 0, AL }, +{"vneg.t", "?d2d,?s2w", 0xd0028000, 0xffff8080, RD_C0, 0, AL }, +{"vsat0.t", "?d2z,?s2s", 0xd0048000, 0xffff8080, RD_C0, 0, AL }, +{"vsat1.t", "?d2z,?s2s", 0xd0058000, 0xffff8080, RD_C0, 0, AL }, +{"vzero.t", "?d2d", 0xd0068000, 0xffffff80, RD_C0, 0, AL }, +{"vone.t", "?d2d", 0xd0078000, 0xffffff80, RD_C0, 0, AL }, +{"vrcp.t", "?x2z,?s2y", 0xd0108000, 0xffff8080, RD_C0, 0, AL }, +{"vrsq.t", "?x2z,?s2y", 0xd0118000, 0xffff8080, RD_C0, 0, AL }, +{"vsin.t", "?x2z,?s2y", 0xd0128000, 0xffff8080, RD_C0, 0, AL }, +{"vcos.t", "?x2z,?s2y", 0xd0138000, 0xffff8080, RD_C0, 0, AL }, +{"vexp2.t", "?x2z,?s2y", 0xd0148000, 0xffff8080, RD_C0, 0, AL }, +{"vlog2.t", "?x2z,?s2y", 0xd0158000, 0xffff8080, RD_C0, 0, AL }, +{"vsqrt.t", "?x2z,?s2y", 0xd0168000, 0xffff8080, RD_C0, 0, AL }, +{"vasin.t", "?x2z,?s2y", 0xd0178000, 0xffff8080, RD_C0, 0, AL }, +{"vnrcp.t", "?x2z,?s2y", 0xd0188000, 0xffff8080, RD_C0, 0, AL }, +{"vnsin.t", "?x2z,?s2y", 0xd01a8000, 0xffff8080, RD_C0, 0, AL }, +{"vrexp2.t", "?x2z,?s2y", 0xd01c8000, 0xffff8080, RD_C0, 0, AL }, +{"vrndi.t", "?d2z", 0xd0218000, 0xffffff80, RD_C0, 0, AL }, +{"vrndf1.t", "?d2z", 0xd0228000, 0xffffff80, RD_C0, 0, AL }, +{"vrndf2.t", "?d2z", 0xd0238000, 0xffffff80, RD_C0, 0, AL }, +{"vocp.t", "?d2d,?s2y", 0xd0448000, 0xffff8080, RD_C0, 0, AL }, +{"vfad.t", "?d0d,?s2s", 0xd0468000, 0xffff8080, RD_C0, 0, AL }, +{"vavg.t", "?d0d,?s2s", 0xd0478000, 0xffff8080, RD_C0, 0, AL }, +{"vf2in.t", "?d2m,?s2s,?b", 0xd2008000, 0xffe08080, RD_C0, 0, AL }, +{"vf2iz.t", "?d2m,?s2s,?b", 0xd2208000, 0xffe08080, RD_C0, 0, AL }, +{"vf2iu.t", "?d2m,?s2s,?b", 0xd2408000, 0xffe08080, RD_C0, 0, AL }, +{"vf2id.t", "?d2m,?s2s,?b", 0xd2608000, 0xffe08080, RD_C0, 0, AL }, +{"vi2f.t", "?d2d,?s2w,?b", 0xd2808000, 0xffe08080, RD_C0, 0, AL }, +{"vcmov.t", "?d2d,?s2s,?e", 0 , 0x000000eb, INSN_MACRO, 0, AL }, +{"vcmovt.t", "?d2d,?s2s,?e", 0xd2a08000, 0xfff88080, RD_C0, 0, AL }, +{"vcmovf.t", "?d2d,?s2s,?e", 0xd2a88000, 0xfff88080, RD_C0, 0, AL }, +{"vmmul.t", "?v6z,?s6y,?t6x", 0xf0008000, 0xff808080, RD_C0, 0, AL }, +{"vtfm3.t", "?v2z,?s6y,?t2x", 0xf1008000, 0xff808080, RD_C0, 0, AL }, +{"vhtfm3.t", "?v2z,?s6y,?t2x", 0xf1000080, 0xff808080, RD_C0, 0, AL }, +{"vmscl.t", "?x6z,?s6y,?t0x", 0xf2008000, 0xff808080, RD_C0, 0, AL }, +{"vmmov.t", "?x6z,?s6y", 0xf3808000, 0xffff8080, RD_C0, 0, AL }, +{"vmidt.t", "?d6z", 0xf3838000, 0xffffff80, RD_C0, 0, AL }, +{"vmzero.t", "?d6z", 0xf3868000, 0xffffff80, RD_C0, 0, AL }, +{"vmone.t", "?d6z", 0xf3878000, 0xffffff80, RD_C0, 0, AL }, +{"vrot.t", "?x2z,?s0y,?w", 0xf3a08000, 0xffe08080, RD_C0, 0, AL }, +{"vcrsp.t", "?d2z,?s2y,?t2x", 0xf2808000, 0xff808080, RD_C0, 0, AL }, +{"vadd.p", "?d1d,?s1s,?t1t", 0x60000080, 0xff808080, RD_C0, 0, AL }, +{"vsub.p", "?d1d,?s1s,?t1t", 0x60800080, 0xff808080, RD_C0, 0, AL }, +{"vdiv.p", "?x1z,?s1y,?t1x", 0x63800080, 0xff808080, RD_C0, 0, AL }, +{"vmul.p", "?d1d,?s1s,?t1t", 0x64000080, 0xff808080, RD_C0, 0, AL }, +{"vdot.p", "?d0d,?s1s,?t1t", 0x64800080, 0xff808080, RD_C0, 0, AL }, +{"vscl.p", "?d1d,?s1s,?t0x", 0x65000080, 0xff808080, RD_C0, 0, AL }, +{"vhdp.p", "?d0d,?s1y,?t1t", 0x66000080, 0xff808080, RD_C0, 0, AL }, +{"vdet.p", "?d0d,?s1s,?t1x", 0x67000080, 0xff808080, RD_C0, 0, AL }, +{"vcmp.p", "?f2,?s1s,?t1t", 0x6c000080, 0xff8080f0, RD_C0, 0, AL }, +{"vcmp.p", "?f1,?s1s", 0x6c000080, 0xffff80f0, RD_C0, 0, AL }, +{"vcmp.p", "?f0", 0x6c000080, 0xfffffff0, RD_C0, 0, AL }, +{"vmin.p", "?d1d,?s1s,?t1t", 0x6d000080, 0xff808080, RD_C0, 0, AL }, +{"vmax.p", "?d1d,?s1s,?t1t", 0x6d800080, 0xff808080, RD_C0, 0, AL }, +{"vsgn.p", "?d1d,?s1s", 0xd04a0080, 0xffff8080, RD_C0, 0, AL }, +{"vcst.p", "?d1d,?a", 0xd0600080, 0xffe0ff80, RD_C0, 0, AL }, +{"vscmp.p", "?d1d,?s1s,?t1t", 0x6e800080, 0xff808080, RD_C0, 0, AL }, +{"vsge.p", "?d1d,?s1s,?t1t", 0x6f000080, 0xff808080, RD_C0, 0, AL }, +{"vslt.p", "?d1d,?s1s,?t1t", 0x6f800080, 0xff808080, RD_C0, 0, AL }, +{"vus2i.p", "?d3m,?s1y", 0xd03a0080, 0xffff8080, RD_C0, 0, AL }, +{"vs2i.p", "?d3m,?s1y", 0xd03b0080, 0xffff8080, RD_C0, 0, AL }, +{"vi2us.p", "?d0m,?s1w", 0xd03e0080, 0xffff8080, RD_C0, 0, AL }, +{"vi2s.p", "?d0m,?s1w", 0xd03f0080, 0xffff8080, RD_C0, 0, AL }, +{"vmov.p", "?d1d,?s1s", 0xd0000080, 0xffff8080, RD_C0, 0, AL }, +{"vabs.p", "?d1d,?s1w", 0xd0010080, 0xffff8080, RD_C0, 0, AL }, +{"vneg.p", "?d1d,?s1w", 0xd0020080, 0xffff8080, RD_C0, 0, AL }, +{"vidt.p", "?d1d", 0xd0030080, 0xffffff80, RD_C0, 0, AL }, +{"vsat0.p", "?d1z,?s1s", 0xd0040080, 0xffff8080, RD_C0, 0, AL }, +{"vsat1.p", "?d1z,?s1s", 0xd0050080, 0xffff8080, RD_C0, 0, AL }, +{"vzero.p", "?d1d", 0xd0060080, 0xffffff80, RD_C0, 0, AL }, +{"vone.p", "?d1d", 0xd0070080, 0xffffff80, RD_C0, 0, AL }, +{"vrcp.p", "?x1z,?s1y", 0xd0100080, 0xffff8080, RD_C0, 0, AL }, +{"vrsq.p", "?x1z,?s1y", 0xd0110080, 0xffff8080, RD_C0, 0, AL }, +{"vsin.p", "?x1z,?s1y", 0xd0120080, 0xffff8080, RD_C0, 0, AL }, +{"vcos.p", "?x1z,?s1y", 0xd0130080, 0xffff8080, RD_C0, 0, AL }, +{"vexp2.p", "?x1z,?s1y", 0xd0140080, 0xffff8080, RD_C0, 0, AL }, +{"vlog2.p", "?x1z,?s1y", 0xd0150080, 0xffff8080, RD_C0, 0, AL }, +{"vsqrt.p", "?x1z,?s1y", 0xd0160080, 0xffff8080, RD_C0, 0, AL }, +{"vasin.p", "?x1z,?s1y", 0xd0170080, 0xffff8080, RD_C0, 0, AL }, +{"vnrcp.p", "?x1z,?s1y", 0xd0180080, 0xffff8080, RD_C0, 0, AL }, +{"vnsin.p", "?x1z,?s1y", 0xd01a0080, 0xffff8080, RD_C0, 0, AL }, +{"vrexp2.p", "?x1z,?s1y", 0xd01c0080, 0xffff8080, RD_C0, 0, AL }, +{"vrndi.p", "?d1z", 0xd0210080, 0xffffff80, RD_C0, 0, AL }, +{"vrndf1.p", "?d1z", 0xd0220080, 0xffffff80, RD_C0, 0, AL }, +{"vrndf2.p", "?d1z", 0xd0230080, 0xffffff80, RD_C0, 0, AL }, +{"vf2h.p", "?d0m,?s1s", 0xd0320080, 0xffff8080, RD_C0, 0, AL }, +{"vh2f.p", "?d3d,?s1y", 0xd0330080, 0xffff8080, RD_C0, 0, AL }, +{"vbfy1.p", "?d1d,?s1s", 0xd0420080, 0xffff8080, RD_C0, 0, AL }, +{"vocp.p", "?d1d,?s1y", 0xd0440080, 0xffff8080, RD_C0, 0, AL }, +{"vsocp.p", "?d3z,?s1y", 0xd0450080, 0xffff8080, RD_C0, 0, AL }, +{"vfad.p", "?d0d,?s1s", 0xd0460080, 0xffff8080, RD_C0, 0, AL }, +{"vavg.p", "?d0d,?s1s", 0xd0470080, 0xffff8080, RD_C0, 0, AL }, +{"vf2in.p", "?d1m,?s1s,?b", 0xd2000080, 0xffe08080, RD_C0, 0, AL }, +{"vf2iz.p", "?d1m,?s1s,?b", 0xd2200080, 0xffe08080, RD_C0, 0, AL }, +{"vf2iu.p", "?d1m,?s1s,?b", 0xd2400080, 0xffe08080, RD_C0, 0, AL }, +{"vf2id.p", "?d1m,?s1s,?b", 0xd2600080, 0xffe08080, RD_C0, 0, AL }, +{"vi2f.p", "?d1d,?s1w,?b", 0xd2800080, 0xffe08080, RD_C0, 0, AL }, +{"vcmov.p", "?d1d,?s1s,?e", 0 , 0x000000e8, INSN_MACRO, 0, AL }, +{"vcmovt.p", "?d1d,?s1s,?e", 0xd2a00080, 0xfff88080, RD_C0, 0, AL }, +{"vcmovf.p", "?d1d,?s1s,?e", 0xd2a80080, 0xfff88080, RD_C0, 0, AL }, +{"vmmul.p", "?v5z,?s5y,?t5x", 0xf0000080, 0xff808080, RD_C0, 0, AL }, +{"vtfm2.p", "?v1z,?s5y,?t1x", 0xf0800080, 0xff808080, RD_C0, 0, AL }, +{"vhtfm2.p", "?v1z,?s5y,?t1x", 0xf0800000, 0xff808080, RD_C0, 0, AL }, +{"vmscl.p", "?x5z,?s5y,?t0x", 0xf2000080, 0xff808080, RD_C0, 0, AL }, +{"vmmov.p", "?x5z,?s5y", 0xf3800080, 0xffff8080, RD_C0, 0, AL }, +{"vmidt.p", "?d5z", 0xf3830080, 0xffffff80, RD_C0, 0, AL }, +{"vmzero.p", "?d5z", 0xf3860080, 0xffffff80, RD_C0, 0, AL }, +{"vmone.p", "?d5z", 0xf3870080, 0xffffff80, RD_C0, 0, AL }, +{"vrot.p", "?x1z,?s0y,?w", 0xf3a00080, 0xffe08080, RD_C0, 0, AL }, +{"vadd.s", "?d0d,?s0s,?t0t", 0x60000000, 0xff808080, RD_C0, 0, AL }, +{"vsub.s", "?d0d,?s0s,?t0t", 0x60800000, 0xff808080, RD_C0, 0, AL }, +{"vdiv.s", "?x0d,?s0s,?t0t", 0x63800000, 0xff808080, RD_C0, 0, AL }, +{"vmul.s", "?d0d,?s0s,?t0t", 0x64000000, 0xff808080, RD_C0, 0, AL }, +{"vcmp.s", "?f2,?s0s,?t0t", 0x6c000000, 0xff8080f0, RD_C0, 0, AL }, +{"vcmp.s", "?f1,?s0s", 0x6c000000, 0xffff80f0, RD_C0, 0, AL }, +{"vcmp.s", "?f0", 0x6c000000, 0xfffffff0, RD_C0, 0, AL }, +{"vmin.s", "?d0d,?s0s,?t0t", 0x6d000000, 0xff808080, RD_C0, 0, AL }, +{"vmax.s", "?d0d,?s0s,?t0t", 0x6d800000, 0xff808080, RD_C0, 0, AL }, +{"vsgn.s", "?d0d,?s0s", 0xd04a0000, 0xffff8080, RD_C0, 0, AL }, +{"vcst.s", "?d0d,?a", 0xd0600000, 0xffe0ff80, RD_C0, 0, AL }, +{"vscmp.s", "?d0d,?s0s,?t0t", 0x6e800000, 0xff808080, RD_C0, 0, AL }, +{"vsge.s", "?d0d,?s0s,?t0t", 0x6f000000, 0xff808080, RD_C0, 0, AL }, +{"vslt.s", "?d0d,?s0s,?t0t", 0x6f800000, 0xff808080, RD_C0, 0, AL }, +{"vus2i.s", "?d1m,?s0y", 0xd03a0000, 0xffff8080, RD_C0, 0, AL }, +{"vs2i.s", "?d1m,?s0y", 0xd03b0000, 0xffff8080, RD_C0, 0, AL }, +{"vmov.s", "?d0d,?s0s", 0xd0000000, 0xffff8080, RD_C0, 0, AL }, +{"vabs.s", "?d0d,?s0w", 0xd0010000, 0xffff8080, RD_C0, 0, AL }, +{"vneg.s", "?d0d,?s0w", 0xd0020000, 0xffff8080, RD_C0, 0, AL }, +{"vsat0.s", "?d0z,?s0s", 0xd0040000, 0xffff8080, RD_C0, 0, AL }, +{"vsat1.s", "?d0z,?s0s", 0xd0050000, 0xffff8080, RD_C0, 0, AL }, +{"vzero.s", "?d0d", 0xd0060000, 0xffffff80, RD_C0, 0, AL }, +{"vone.s", "?d0d", 0xd0070000, 0xffffff80, RD_C0, 0, AL }, +{"vrcp.s", "?x0d,?s0s", 0xd0100000, 0xffff8080, RD_C0, 0, AL }, +{"vrsq.s", "?x0d,?s0s", 0xd0110000, 0xffff8080, RD_C0, 0, AL }, +{"vsin.s", "?x0d,?s0s", 0xd0120000, 0xffff8080, RD_C0, 0, AL }, +{"vcos.s", "?x0d,?s0s", 0xd0130000, 0xffff8080, RD_C0, 0, AL }, +{"vexp2.s", "?x0d,?s0s", 0xd0140000, 0xffff8080, RD_C0, 0, AL }, +{"vlog2.s", "?x0d,?s0s", 0xd0150000, 0xffff8080, RD_C0, 0, AL }, +{"vsqrt.s", "?x0d,?s0s", 0xd0160000, 0xffff8080, RD_C0, 0, AL }, +{"vasin.s", "?x0d,?s0s", 0xd0170000, 0xffff8080, RD_C0, 0, AL }, +{"vnrcp.s", "?x0d,?s0y", 0xd0180000, 0xffff8080, RD_C0, 0, AL }, +{"vnsin.s", "?x0d,?s0y", 0xd01a0000, 0xffff8080, RD_C0, 0, AL }, +{"vrexp2.s", "?x0d,?s0y", 0xd01c0000, 0xffff8080, RD_C0, 0, AL }, +{"vrnds.s", "?s0y", 0xd0200000, 0xffff80ff, RD_C0, 0, AL }, +{"vrndi.s", "?d0d", 0xd0210000, 0xffffff80, RD_C0, 0, AL }, +{"vrndf1.s", "?d0d", 0xd0220000, 0xffffff80, RD_C0, 0, AL }, +{"vrndf2.s", "?d0d", 0xd0230000, 0xffffff80, RD_C0, 0, AL }, +{"vh2f.s", "?d1d,?s0y", 0xd0330000, 0xffff8080, RD_C0, 0, AL }, +{"vsbz.s", "?d0d,?s0s", 0xd0360000, 0xffff8080, RD_C0, 0, AL }, +{"vsbn.s", "?d0d,?s0s,?t0t", 0x61000000, 0xff808080, RD_C0, 0, AL }, +{"vlgb.s", "?d0d,?s0s", 0xd0370000, 0xffff8080, RD_C0, 0, AL }, +{"vocp.s", "?d0d,?s0y", 0xd0440000, 0xffff8080, RD_C0, 0, AL }, +{"vsocp.s", "?d1z,?s0y", 0xd0450000, 0xffff8080, RD_C0, 0, AL }, +{"vf2in.s", "?d0m,?s0s,?b", 0xd2000000, 0xffe08080, RD_C0, 0, AL }, +{"vf2iz.s", "?d0m,?s0s,?b", 0xd2200000, 0xffe08080, RD_C0, 0, AL }, +{"vf2iu.s", "?d0m,?s0s,?b", 0xd2400000, 0xffe08080, RD_C0, 0, AL }, +{"vf2id.s", "?d0m,?s0s,?b", 0xd2600000, 0xffe08080, RD_C0, 0, AL }, +{"vi2f.s", "?d0d,?s0w,?b", 0xd2800000, 0xffe08080, RD_C0, 0, AL }, +{"vcmov.s", "?d0d,?s0s,?e", 0 , 0x000000ea, INSN_MACRO, 0, AL }, +{"vcmovt.s", "?d0d,?s0s,?e", 0xd2a00000, 0xfff88080, RD_C0, 0, AL }, +{"vcmovf.s", "?d0d,?s0s,?e", 0xd2a80000, 0xfff88080, RD_C0, 0, AL }, +{"vwbn.s", "?d0d,?s0s,?i", 0xd3000000, 0xff008080, RD_C0, 0, AL }, +{"vpfxs", "?0,?1,?2,?3", 0xdc000000, 0xff000000, RD_C0, 0, AL }, +{"vpfxt", "?0,?1,?2,?3", 0xdd000000, 0xff000000, RD_C0, 0, AL }, +{"vpfxd", "?4,?5,?6,?7", 0xde000000, 0xff000000, RD_C0, 0, AL }, +{"viim.s", "?t0d,j", 0xdf000000, 0xff800000, RD_C0, 0, AL }, +{"vfim.s", "?t0d,?u", 0xdf800000, 0xff800000, RD_C0, 0, AL }, +{"vnop", "", 0xffff0000, 0xffffffff, RD_C0, 0, AL }, +{"vflush", "", 0xffff040d, 0xffffffff, RD_C0, 0, AL }, +{"vsync", "", 0xffff0320, 0xffffffff, RD_C0, 0, AL }, +{"vsync", "i", 0xffff0000, 0xffff0000, RD_C0, 0, AL }, + /* Coprocessor 2 move/branch operations overlap with VR5400 .ob format instructions so they are here for the latters to take precedence. */ {"bc2f", "p", 0x49000000, 0xffff0000, CBD|RD_CC, 0, I1 }, @@ -1197,6 +1507,32 @@ {"mtc2", "t,G", 0x48800000, 0xffe007ff, COD|RD_t|WR_C2|WR_CC, 0, I1 }, {"mtc2", "t,G,H", 0x48800000, 0xffe007f8, COD|RD_t|WR_C2|WR_CC, 0, I32 }, {"mthc2", "t,i", 0x48e00000, 0xffe00000, COD|RD_t|WR_C2|WR_CC, 0, I33 }, + +/* Coprocessor 2 load/store operations overlap with the Allegrex VFPU + instructions so they are here for the latters to take precedence. */ +/* Coprocessor 1 ldc1 and sdc1 also overlap with the VFPU. */ +{"ldc1", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, +{"ldc1", "E,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, +{"ldc1", "T,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, +{"ldc1", "E,A(b)", 0, (int) M_LDC1_AB, INSN_MACRO, 0, I2 }, +{"l.d", "T,o(b)", 0xd4000000, 0xfc000000, CLD|RD_b|WR_T|FP_D, 0, I2 }, /* ldc1 */ +{"l.d", "T,o(b)", 0, (int) M_L_DOB, INSN_MACRO, 0, I1 }, +{"l.d", "T,A(b)", 0, (int) M_L_DAB, INSN_MACRO, 0, I1 }, +{"ldc2", "E,o(b)", 0xd8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I2 }, +{"ldc2", "E,A(b)", 0, (int) M_LDC2_AB, INSN_MACRO, 0, I2 }, +{"lwc2", "E,o(b)", 0xc8000000, 0xfc000000, CLD|RD_b|WR_CC, 0, I1 }, +{"lwc2", "E,A(b)", 0, (int) M_LWC2_AB, INSN_MACRO, 0, I1 }, +{"sdc1", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, +{"sdc1", "E,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, +{"sdc1", "T,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, +{"sdc1", "E,A(b)", 0, (int) M_SDC1_AB, INSN_MACRO, 0, I2 }, +{"s.d", "T,o(b)", 0xf4000000, 0xfc000000, SM|RD_T|RD_b|FP_D, 0, I2 }, +{"s.d", "T,o(b)", 0, (int) M_S_DOB, INSN_MACRO, 0, I1 }, +{"s.d", "T,A(b)", 0, (int) M_S_DAB, INSN_MACRO, 0, I1 }, +{"sdc2", "E,o(b)", 0xf8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I2 }, +{"sdc2", "E,A(b)", 0, (int) M_SDC2_AB, INSN_MACRO, 0, I2 }, +{"swc2", "E,o(b)", 0xe8000000, 0xfc000000, SM|RD_C2|RD_b, 0, I1 }, +{"swc2", "E,A(b)", 0, (int) M_SWC2_AB, INSN_MACRO, 0, I1 }, /* No hazard protection on coprocessor instructions--they shouldn't change the state of the processor and if they do it's up to the diff -Nbaur binutils-2.16.1/opcodes/ppc-dis.c binutils-2.16.1-new/opcodes/ppc-dis.c --- binutils-2.16.1/opcodes/ppc-dis.c Tue Mar 22 15:31:19 2005 +++ binutils-2.16.1-new/opcodes/ppc-dis.c Wed Jul 6 01:56:25 2005 @@ -64,6 +64,13 @@ && strstr (info->disassembler_options, "efs") != NULL) dialect |= PPC_OPCODE_EFS; else + if (info->disassembler_options + && (strstr (info->disassembler_options, "gekko") == 0)) + { + dialect |= PPC_OPCODE_GEKKO; + dialect &= ~PPC_OPCODE_ALTIVEC; + } + else dialect |= (PPC_OPCODE_403 | PPC_OPCODE_601 | PPC_OPCODE_CLASSIC | PPC_OPCODE_COMMON | PPC_OPCODE_ALTIVEC); @@ -239,6 +246,8 @@ (*info->print_address_func) (memaddr + value, info); else if ((operand->flags & PPC_OPERAND_ABSOLUTE) != 0) (*info->print_address_func) ((bfd_vma) value & 0xffffffff, info); + else if ((operand->flags & PPC_OPERAND_GQR) != 0) + (*info->fprintf_func) (info->stream, "gqr%ld", value); else if ((operand->flags & PPC_OPERAND_CR) == 0 || (dialect & PPC_OPCODE_PPC) == 0) (*info->fprintf_func) (info->stream, "%ld", value); @@ -304,4 +313,5 @@ fprintf (stream, " power4 Disassemble the Power4 instructions\n"); fprintf (stream, " 32 Do not disassemble 64-bit instructions\n"); fprintf (stream, " 64 Allow disassembly of 64-bit instructions\n"); + fprintf (stream, " gekko Disassemble the Gamecube Gekko instructions\n"); } diff -Nbaur binutils-2.16.1/opcodes/ppc-opc.c binutils-2.16.1-new/opcodes/ppc-opc.c --- binutils-2.16.1/opcodes/ppc-opc.c Tue Apr 19 18:09:56 2005 +++ binutils-2.16.1-new/opcodes/ppc-opc.c Wed Jul 6 01:56:25 2005 @@ -93,6 +93,13 @@ static unsigned long insert_ev8 (unsigned long, long, int, const char **); static long extract_ev8 (unsigned long, int, int *); +static unsigned long insert_psq_gd (unsigned long, long, int, const char **); +static long extract_psq_gd (unsigned long, int, int *); +static unsigned long insert_psq_gx (unsigned long, long, int, const char **); +static long extract_psq_gx (unsigned long, int, int *); + + + /* The operands table. The fields are bits, shift, insert, extract, flags. @@ -558,6 +565,25 @@ #define MTMSRD_L WS + 1 { 1, 16, NULL, NULL, PPC_OPERAND_OPTIONAL }, + /* I Field in psq_ instructions */ +#define PSQ_DD MTMSRD_L + 1 + { 12, 0, 0, 0, PPC_OPERAND_PARENS|PPC_OPERAND_SIGNED }, + + /* W Field in psq_ instructions */ +#define PSQ_WD PSQ_DD + 1 + { 1, 15, 0, 0, 0 }, + + /* d Field in psq_ instructions */ +#define PSQ_GD PSQ_WD + 1 + { 10, 12, insert_psq_gd, extract_psq_gd, PPC_OPERAND_GQR }, + + /* I Field in psq_ instructions A*/ +#define PSQ_WX PSQ_GD + 1 + { 1, 10, 0, 0, 0 }, + + /* W Field in psq_ instructions */ +#define PSQ_GX PSQ_WX + 1 + { 10, 7, insert_psq_gx, extract_psq_gx, PPC_OPERAND_GQR }, }; /* The functions used to insert and extract complicated operands. */ @@ -1432,6 +1458,48 @@ return ret; } +static unsigned long +insert_psq_gd (unsigned long insn, + long value, + int dialect ATTRIBUTE_UNUSED, + const char **errmsg) +{ + if (value >= 912 && value <= 919) + value -= 912; + if (value < 0 || value > 7) + *errmsg = _("invalid quantization register"); + return insn | ((value & 7) << 12); +} + +static long +extract_psq_gd (unsigned long insn, + int dialect ATTRIBUTE_UNUSED, + int *invalid ATTRIBUTE_UNUSED) +{ + return ((insn & 0x7000) >> 12); +} + +static unsigned long +insert_psq_gx (unsigned long insn, + long value, + int dialect ATTRIBUTE_UNUSED, + const char **errmsg) +{ + if (value >= 912 && value <= 919) + value -= 912; + if (value < 0 || value > 7) + *errmsg = _("invalid quantization register"); + return insn | ((value & 7) << 7); +} + +static long +extract_psq_gx (unsigned long insn, + int dialect ATTRIBUTE_UNUSED, + int *invalid ATTRIBUTE_UNUSED) +{ + return ((insn & 0x380) >> 7); +} + /* Macros used to form opcodes. */ /* The main opcode. */ @@ -1715,6 +1783,10 @@ #define XUC(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x1f)) #define XUC_MASK XUC(0x3f, 0x1f) +/* A PSQ style load/store indexed */ +#define PSQX(op, xop) (OP (op) | (((unsigned long)(xop)) & 0x7f)) +#define PSQX_MASK PSQX(0x3f,0x7f) + /* The BO encodings used in extended conditional branch mnemonics. */ #define BODNZF (0x0) #define BODNZFP (0x1) @@ -1805,6 +1877,7 @@ #define PPCCHLK PPC_OPCODE_CACHELCK #define PPCCHLK64 PPC_OPCODE_CACHELCK | PPC_OPCODE_BOOKE64 #define PPCRFMCI PPC_OPCODE_RFMCI +#define PPCGEKKO PPC_OPCODE_GEKKO /* The opcode table. @@ -4612,6 +4685,99 @@ { "fcfid", XRC(63,846,0), XRA_MASK, PPC64, { FRT, FRB } }, { "fcfid.", XRC(63,846,1), XRA_MASK, PPC64, { FRT, FRB } }, + +/* GEKKO specific stuff */ +{ "dcbz_l", X(4,1014), XRT_MASK, PPCGEKKO, { RA, RB }}, + +{ "ps_abs", XRC(4,264,0), XRA_MASK, PPCGEKKO, { FRT,FRB }}, +{ "ps_abs.", XRC(4,264,1), XRA_MASK, PPCGEKKO, { FRT,FRB }}, + +{ "ps_add", A(4,21,0), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, +{ "ps_add.", A(4,21,1), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, + +{ "ps_cmpo0", X(4,32), X_MASK|(3<<21), PPCGEKKO, { BF, FRA, FRB }}, +{ "ps_cmpo1", X(4,96), X_MASK|(3<<21), PPCGEKKO, { BF, FRA, FRB }}, + +{ "ps_cmpu0", X(4,0), X_MASK|(3<<21), PPCGEKKO, { BF, FRA, FRB }}, +{ "ps_cmpu1", X(4,64), X_MASK|(3<<21), PPCGEKKO, { BF, FRA, FRB }}, + +{ "ps_div", A(4,18,0), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, +{ "ps_div.", A(4,18,1), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, + +{ "ps_madd", A(4,29,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_madd.", A(4,29,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_madds0", A(4,14,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_madds0.", A(4,14,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_madds1", A(4,15,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_madds1.", A(4,15,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_merge00", XRC(4,528,0), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, +{ "ps_merge00.", XRC(4,528,1), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, + +{ "ps_merge01", XRC(4,560,0), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, +{ "ps_merge01.", XRC(4,560,1), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, + +{ "ps_merge10", XRC(4,592,0), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, +{ "ps_merge10.", XRC(4,592,1), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, + +{ "ps_merge11", XRC(4,624,0), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, +{ "ps_merge11.", XRC(4,624,1), X_MASK, PPCGEKKO, { FRT,FRA,FRB }}, + +{ "ps_mr", XRC(4,72,0), XRA_MASK, PPCGEKKO, { FRT, FRB }}, +{ "ps_mr.", XRC(4,72,1), XRA_MASK, PPCGEKKO, { FRT, FRB }}, + +{ "ps_msub", A(4,28,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_msub.", A(4,28,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_mul", A(4,25,0), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, +{ "ps_mul.", A(4,25,1), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, + +{ "ps_muls0", A(4,12,0), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, +{ "ps_muls0.", A(4,12,1), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, + +{ "ps_muls1", A(4,13,0), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, +{ "ps_muls1.", A(4,13,1), AFRB_MASK, PPCGEKKO, { FRT,FRA,FRC }}, + +{ "ps_nabs", XRC(4,136,0), XRA_MASK, PPCGEKKO, { FRT, FRB }}, +{ "ps_nabs.", XRC(4,136,1), XRA_MASK, PPCGEKKO, { FRT, FRB }}, + +{ "ps_neg", XRC(4,40,0), XRA_MASK, PPCGEKKO, { FRT, FRB }}, +{ "ps_neg.", XRC(4,40,1), XRA_MASK, PPCGEKKO, { FRT, FRB }}, + +{ "ps_nmadd", A(4,31,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_nmadd.", A(4,31,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_nmsub", A(4,30,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_nmsub.", A(4,30,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_res", A(4,13,0), AFRAFRC_MASK, PPCGEKKO, { FRT,FRB }}, +{ "ps_res.", A(4,13,1), AFRAFRC_MASK, PPCGEKKO, { FRT,FRB }}, + +{ "ps_rsqrte", A(4,26,0), AFRAFRC_MASK, PPCGEKKO, { FRT,FRB }}, +{ "ps_rsqrte.", A(4,26,1), AFRAFRC_MASK, PPCGEKKO, { FRT,FRB }}, + +{ "ps_sel", A(4,23,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_sel.", A(4,23,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_sub", A(4,20,0), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, +{ "ps_sub.", A(4,20,1), AFRC_MASK, PPCGEKKO, { FRT, FRA, FRB }}, + +{ "ps_sum0", A(4,10,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_sum0.", A(4,10,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "ps_sum1", A(4,11,0), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, +{ "ps_sum1.", A(4,11,1), A_MASK, PPCGEKKO, { FRT,FRA,FRC,FRB }}, + +{ "psq_l", OP(56), OP_MASK, PPCGEKKO, { FRT,PSQ_DD,RA,PSQ_WD,PSQ_GD }}, +{ "psq_lu", OP(57), OP_MASK, PPCGEKKO, { FRT,PSQ_DD,RA,PSQ_WD,PSQ_GD }}, +{ "psq_lux", PSQX(4,76),PSQX_MASK, PPCGEKKO, { FRT,RA,RB,PSQ_WX,PSQ_GX }}, +{ "psq_lx", PSQX(4,12),PSQX_MASK, PPCGEKKO, { FRT,RA,RB,PSQ_WX,PSQ_GX }}, +{ "psq_st", OP(60), OP_MASK, PPCGEKKO, { FRT,PSQ_DD,RA,PSQ_WD,PSQ_GD }}, +{ "psq_stu", OP(61), OP_MASK, PPCGEKKO, { FRT,PSQ_DD,RA,PSQ_WD,PSQ_GD }}, +{ "psq_stux", PSQX(4,78), PSQX_MASK, PPCGEKKO, { FRT,RA,RB,PSQ_WX,PSQ_GX }}, +{ "psq_stx", PSQX(4,14), PSQX_MASK, PPCGEKKO, { FRT,RA,RB,PSQ_WX,PSQ_GX }}, };