The current instruction-set reference manual is free online: MIPS® Architecture for Programmers
Volume II-A: The MIPS32® Instruction
Set Manual. That link is Revision 6.06
December 15, 2016. (i.e. it documents MIPS32 Release 6).
It documents all user and supervisor/kernel mode instructions, and all floating-point, in full detail including their machine-code encoding, and with an Operation section that shows what they do. It still documents all the instructions that were removed in MIPS32 release 6. (MIPS32 Release 6 also moved around a lot of opcodes, and this is well documented).
See https://www.mips.com/products/architectures/mips32/ for the latest version. mips.com has a section for "classic cores", but that still appears to only go back to MIPS32, not historical stuff.
Sample of the "availability and compatibility" section for balc
(Branch and Link Compact: no branch-delay slot, and GRP31 is the implicit destination, freeing up 26 bits for an offset<<2
):
This instruction is introduced by and required as of Release 6.
Release 6 instruction BALC
occupies the same encoding as pre-Release 6
instruction SWC2
. The SWC2
instruction has been moved to the COP2
major opcode in MIPS Release 6
Or for LDXC1 fd, index(base)
(Load Doubleword Indexed to Floating Point)
This instruction has been removed in Release 6.
Required in all versions of MIPS64 since MIPS64 Release 1. Not available in MIPS32 Release 1. Required in
MIPS32 Release 2 and all subsequent versions of MIPS32. When required, required whenever FPU is present,
whether a 32-bit or 64-bit FPU, whether in 32-bit or 64-bit FP Register Mode (FIRF64=0 or 1, StatusFR=0 or 1).
For historical stuff, I found the MIPS IV Instruction Set
Revision 3.2
September, 1995 on a cmu.edu web page. It lists when instructions were introduced, e.g. MIPS I for div
, MIPS III for dmult
and other 64-bit instructions, MIPS II for ll
/ sc
.
A good quick-reference with pseudocode for the effect of each instruction is https://inst.eecs.berkeley.edu/~cs61c/resources/MIPS_help.html. It doesn't include encoding details, but does accurately describe the effect of branch and jump instructions on the program counter. (Which is somewhat tricky: they're relative or section-absolute to the branch-delay slot.)
It's not complete even for MIPS I integer instructions, though: it's missing the unaligned-load helper instructions LWL and LWR and corresponding SWL/R stores which were present in MIPS I. It also doesn't include any FP stuff, or later MIPS instructions like mul
(only mult
). I don't know what else might be missing; I didn't cross reference it against a complete list.
The MIPS-IV manual linked above confirms that lwl
/lwr
were available in MIPS I (and documents that the load delay slot restriction applies to them).
syscall
transfers control to supervisor, but does not itself require privileges to execute, that of course being the point. I'm not sure MIPS IV (the manual I searched) had any instructions that always require privileges, or maybe that's because the MIPS IV manual I looked at says it only defines user-mode instructions. (But they may all be implemented as System Control Processor (same as coprocessor 0?) operations, not real CPU instructions. CoProc 0 access from user-mode depends on another bit setting, apparently, from a quick search on on "privilege".) – Peter Cordes