Created
October 19, 2022 02:56
-
-
Save scarletcafe/1fc9165562d673a9fd691d1c4d99844e to your computer and use it in GitHub Desktop.
N64 ops: mirrored from https://www.zophar.net/fileuploads/2/10655uytsm/N64ops03.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Nintendo 64 opcodes v0.3 by anarko <[email protected]> | |
Nintendo 64 opcodes v0.3 by anarko <[email protected]> | |
Part A: Brief list released on 98-02-19 | |
---------------------------------------------------------------------------- | |
**************************************************************************** | |
** Load and Store Instructions ** | |
**************************************************************************** | |
LB rt,offset(base) Load Byte | |
LBU rt,offset(base) Load Byte Unsigned | |
LD rt,offset(base) Load Doubleword | |
LDL rt,offset(base) Load Doubleword Left | |
LDR rt,offset(base) Load Doubleword Right | |
LH rt,offset(base) Load Halfword | |
LHU rt,offset(base) Load Halfword Unsigned | |
LL rt,offset(base) Load Linked word | |
LLD rt,offset(base) Load Linked Doubleword | |
LW rt,offset(base) Load Word | |
LWL rt,offset(base) Load Word Left | |
LWR rt,offset(base) Load Word Right | |
LWU rt,offset(base) Load Word Unsigned | |
SB rt,offset(base) Store Byte | |
SC rt,offset(base) Store Conditional word | |
SCD rt,offset(base) Store Conditional Doubleword | |
SD rt,offset(base) Store Doubleword | |
SDL rt,offset(base) Store Doubleword Left | |
SDR rt,offset(base) Store Doubleword Right | |
SH rt,offset(base) Store Halfword | |
SW rt,offset(base) Store Word | |
SWL rt,offset(base) Store Word Left | |
SWR rt,offset(base) Store Word Right | |
SYNC SYNChronize shared memory | |
**************************************************************************** | |
** Atithmetic Instructions ** | |
**************************************************************************** | |
ADD rd,rs,rt ADD word | |
ADDI rt,rs,immediate ADD Immediate word | |
ADDIU rt,rs,immediate Add Immediate Unsigned word | |
ADDU rd,rs,rt Add Unsigned word | |
AND rd,rs,rt AND | |
ANDI rt,rs,immediate AND Immediate | |
DADD rd,rs,rt Doubleword ADD | |
DADDI rt,rs,immediate Doubleword ADD Immediate | |
DADDIU rt,rs,immediate Doubleword ADD Immediate Unsigned | |
DADDU rd,rs,rt Doubleword ADD Unsigned | |
DDIV rs,rt Doubleword DIVide | |
DDIVU rs,rt Doubleword DIVide Unsigned | |
DIV rs,rt DIVide word | |
DIVU rs,rt DIVide Unsigned word | |
DMULT rs,rt Doubleword MULTiply | |
DMULTU rs,rt Doubleword MULTiply Unsigned | |
DSLL rd,rt,sa Doubleword Shift Left Logical | |
DSLL32 rd,rt,sa Doubleword Shift Left Logical +32 | |
DSLLV rd,rt,rs Doubleword Shift Left Logical Variable | |
DSRA rd,rt,sa Doubleword Shift Right Arithmetic | |
DSRA32 rd,rt,sa Doubleword Shift Right Arithmetic +32 | |
DSRAV rd,rt,rs Doubleword Shift Right Arithmetic Variable | |
DSRL rd,rt,sa Doubleword Shift Right Logical | |
DSRL32 rd,rt,sa Doubleword Shift Right Logical +32 | |
DSRLV rd,rt,rs Doubleword Shift Right Logical Variable | |
DSUB rd,rs,rt Doubleword SUBtract | |
DSUBU rd,rs,rt Doubleword SUBtract Unsigned | |
LUI rt,immediate Load Upper Immediate | |
MFHI rd Move From HI register | |
MFLO rd Move From LO register | |
MTHI rd Move To HI register | |
MTLO rd Move To LO register | |
MULT rs,rt MULTiply word | |
MULTU rs,rt MULTiply Unsigned word | |
NOR rd,rs,rt Not OR | |
OR rd,rs,rt OR | |
ORI rt,rs,immediate OR Immediate | |
SLL rd,rt,sa Shift word Left Logical | |
SLLV rd,rt,rs Shift word Left Logical Variable | |
SLT rd,rs,rt Set on Less Than | |
SLTI rt,rs,immediate Set on Less Than Immediate | |
SLTIU rt,rs,immediate Set on Less Than Immediate Unsigned | |
SLTU rd,rs,rt Set on Less Than Unsigned | |
SRA rd,rt,sa Shift word Right Arithmetic | |
SRAV rd,rt,rs Shift word Right Arithmetic Variable | |
SRL rd,rt,sa Shift word Right Logical | |
SRLV rd,rt,rs Shift word Right Logical Variable | |
SUB rd,rs,rt SUBtract word | |
SUBU rd,rs,rt SUBtract Unsigned word | |
XOR rd,rs,rt eXclusive OR | |
XORI rt,rs,immediate eXclusive OR Immediate | |
**************************************************************************** | |
** Jump and Branch Instructions ** | |
**************************************************************************** | |
BEQ rs,rt,offset Branch on EQual | |
BEQL rs,rt,offset Branch on EQual Likely | |
BGEZ rs,offset Branch on Greater than or Equal to Zero | |
BGEZAL rs,offset Branch on Greater than or Equal to Zero And Link | |
BGEZALL rs,offset Branch on Greater than or Equal to Zero And Link Likely | |
BGEZL rs,offset Branch on Greater than or Equal to Zero Likely | |
BGTZ rs,offset Branch on Greater than Zero | |
BGTZL rs,offset Branch on Greater than Zero Likely | |
BLEZ rs,offset Branch on Less than or Equal to Zero | |
BLEZL rs,offset Branch on Less than or Equal to Zero Likely | |
BLTZ rs,offset Branch on Less than Zero | |
BLTZAL rs,offset Branch on Less than Zero And Link | |
BLTZALL rs,offset Branch on Less than Zero And Link Likely | |
BLTZL rs,offset Branch on Less than Zero Likely | |
BNE rs,rt,offset Branch on Not Equal | |
BNEL rs,rt,offset Branch on Not Equal Likely | |
J target Jump | |
JAL target Jump And Link | |
JALR rs,rd Jump And Link Register | |
JR rs Jump Register | |
**************************************************************************** | |
** Special Instructions ** | |
**************************************************************************** | |
BREAK offset BREAKpoint | |
SYSCALL offset SYStem CALL | |
**************************************************************************** | |
** Exception Instructions ** | |
**************************************************************************** | |
TEQ rs,rt Trap if EQual | |
TEQI rs,immediate Trap if EQual Immediate | |
TGE rs,rt Trap if Greater Than or Equal | |
TGEI rs,immediate Trap if Greater Than or Equal Immediate | |
TGEIU rs,immediate Trap if Greater Than or Equal Immediate Unsigned | |
TGEU rs,rt Trap if Greater Than or Equal Unsigned | |
TLT rs,rt Trap if Less Than | |
TLTI rs,immediate Trap if Less Than Immediate | |
TLTIU rs,immediate Trap if Less Than Immediate Unsigned | |
TLTU rs,rt Trap if Less Than Unsigned | |
TNE rs,rt Trap if not Equal | |
TNEI rs,immediate Trap if not Equal Immediate | |
**************************************************************************** | |
** System Control Processor (COP0) Instructions ** | |
**************************************************************************** | |
CACHE op,offset(base) CACHE | |
DMFC0 rt,fs Doubleword Move From CP0 | |
DMTC0 rt,fs Doubleword Move To CP0 | |
ERET Return from Exception | |
MFC0 rt,fs Move Word From CP0 | |
MTC0 rt,fs Move Word To CP0 | |
TLBP Probe TLB for Matching Entry | |
TLBR Read Indexed TLB Entry | |
TLBWI Write Indexed TLB Entry | |
TLBWR Write Random TLB Entry | |
**************************************************************************** | |
** Floating-point Unit (COP1) instructions ** | |
**************************************************************************** | |
ABS.fmt fd,fs floating-point ABSolute value | |
ADD.fmt fd,fs,ft floating-point ADD | |
BC1F offset Branch on FP False | |
BC1FL offset Branch on FP False Likely | |
BC1T offset Branch on FP True | |
BC1TL offset Branch on FP True Likely | |
C.cond.fmt fs,ft floating-point floating point Compare | |
CEIL.L.fmt fd,fs floating-point CEILing convert to Long fixed-point | |
CEIL.W.fmt fd,fs floating-point CEILing convert to Word fixed-point | |
CFC1 rt,fs Move control word From Floating-Point | |
CTC1 rt,fs Move control word To Floating-Point | |
CVT.D.fmt fd,fs floating-point ConVerT to Double floating-point | |
CVT.L.fmt fd,fs floating-point ConVerT to Long fixed-point | |
CVT.S.fmt fd,fs floating-point ConVerT to Single floating-point | |
CVT.W.fmt fd,fs floating-point ConVerT to Word fixed-point | |
DIV.fmt fd,fs,ft floating-point DIVide | |
DMFC1 rt,fs Doubleword Move From Floating-Point | |
DMTC1 rt,fs Doubleword Move To Floating-Point | |
FLOOR.L.fmt fd,fs floating-point FLOOR convert to Long fixed-point | |
FLOOR.W.fmt fd,fs floating-point FLOOR convert to Word fixed-point | |
LDC1 rt,offset(base) Load Doubleword to Floating-Point | |
LWC1 rt,offset(base) Load Word to Floating-Point | |
MFC1 rt,fs Move Word From Floating-Point | |
MOV.fmt fd,fs floating-point MOVe | |
MTC1 rt,fs Move Word To Floating-Point | |
MUL.fmt fd,fs,ft floating-point MULtiply | |
NEG.fmt fd,fs floating-point NEGate | |
ROUND.L.fmt fd,fs floating-point ROUND to Long fixed-point | |
ROUND.W.fmt fd,fs floating-point ROUND to Word fixed-point | |
SDC1 rt,offset(base) Store Doubleword from Floating-Point | |
SQRT.fmt fd,fs floating-point SQuare RooT | |
SUB.fmt fd,fs,ft floating-point SUBtract | |
SWC1 rt,offset(base) Store Word from Floating-Point | |
TRUNC.L.fmt fd,fs floating-point TRUNCate to Long fixed-point | |
TRUNC.W.fmt fd,fs floating-point TRUNCate to Word fixed-point | |
Part B: Detailed list released on 98-02-19 | |
---------------------------------------------------------------------------- | |
I need information/answers about the following: | |
* Info about COP1 registers. | |
* Information about COP2!!! instructions, anything!! | |
* How do i correctly decode address of 26-bit Jump instructions (J, JAL) ? | |
* How do i correctly decode address of 16-bit Branch instructions? | |
If you can help, please mail me at [email protected] | |
---------------------------------------------------------------------------- | |
COP0 registers: | |
--------------- | |
00h = Index 08h = BadVAddr 10h = Config 18h = *RESERVED* | |
01h = Random 09h = Count 11h = LLAddr 19h = *RESERVED* | |
02h = EntryLo0 0Ah = EntryHi 12h = WatchLo 1Ah = PErr | |
03h = EntryLo1 0Bh = Compare 13h = WatchHi 1Bh = CacheErr | |
04h = Context 0Ch = Status 14h = XContext 1Ch = TagLo | |
05h = PageMask 0Dh = Cause 15h = *RESERVED* 1Dh = TagHi | |
06h = Wired 0Eh = EPC 16h = *RESERVED* 1Eh = ErrorEPC | |
07h = *RESERVED* 0Fh = PRevID 17h = *RESERVED* 1Fh = *RESERVED* | |
Main CPU registers: | |
------------------- | |
00h = r0/reg0 08h = t0/reg8 10h = s0/reg16 18h = t8/reg24 | |
01h = at/reg1 09h = t1/reg9 11h = s1/reg17 19h = t9/reg25 | |
02h = v0/reg2 0Ah = t2/reg10 12h = s2/reg18 1Ah = k0/reg26 | |
03h = v1/reg3 0Bh = t3/reg11 13h = s3/reg19 1Bh = k1/reg27 | |
04h = a0/reg4 0Ch = t4/reg12 14h = s4/reg20 1Ch = gp/reg28 | |
05h = a1/reg5 0Dh = t5/reg13 15h = s5/reg21 1Dh = sp/reg29 | |
06h = a2/reg6 0Eh = t6/reg14 16h = s6/reg22 1Eh = s8/reg30 | |
07h = a3/reg7 0Fh = t7/reg15 17h = s7/reg23 1Fh = ra/reg31 | |
**************************************************************************** | |
** Load and Store Instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| LB | Load Byte | | |
|-----------|---------------------------------------------------| | |
|100000 (32)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LBU rt, offset(base) | |
Purpose: To load a byte from memory as a signed value. | |
Descrip: rt = byte[base+offset] | |
----------------------------------------------------------------- | |
| LBU | Load Byte Unsigned | | |
|-----------|---------------------------------------------------| | |
|100100 (36)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LBU rt, offset(base) | |
Purpose: To load a byte from memory as an unsigned value. | |
Descrip: rt = byte[base+offset] | |
----------------------------------------------------------------- | |
| LD | Load Doubleword | | |
|-----------|---------------------------------------------------| | |
|110111 (55)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LD rt, offset(base) | |
Purpose: To load a doubleword from memory. | |
Descrip: rt = doubleword[base+offset] | |
----------------------------------------------------------------- | |
| LDL | Load Doubleword Left | | |
|-----------|---------------------------------------------------| | |
|011010 (26)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LDL rt, offset(base) | |
Purpose: To load the most-significant part of a doubleword from | |
an unaligned memory address. | |
Descrip: left(rt) = right[base+offset] | |
----------------------------------------------------------------- | |
| LDR | Load Doubleword Right | | |
|-----------|---------------------------------------------------| | |
|011011 (27)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LDR rt, offset(base) | |
Purpose: To load the least-significant part of a doubleword from | |
an unaligned memory address. | |
Descrip: right(rt) = left[base+offset] | |
----------------------------------------------------------------- | |
| LH | Load Halfword | | |
|-----------|---------------------------------------------------| | |
|100001 (33)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LH rt, offset(base) | |
Purpose: To load a halfword from memory as a signed value. | |
Descrip: rt = halfword[base+offset] | |
----------------------------------------------------------------- | |
| LHU | Load Halfword Unsigned | | |
|-----------|---------------------------------------------------| | |
|100101 (37)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LHU rt, offset(base) | |
Purpose: To load a halfword from memory as an unsigned value. | |
Descrip: rt = halfword[base+offset] | |
----------------------------------------------------------------- | |
| LL | Load Linked Word | | |
|-----------|---------------------------------------------------| | |
|110000 (48)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LL rt, offset(base) | |
Purpose: To load a word from memory for an atomic read-modify-write. | |
----------------------------------------------------------------- | |
| LLD | Load Linked Doubleword | | |
|-----------|---------------------------------------------------| | |
|110100 (52)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LLD rt, offset(base) | |
Purpose: To load a doubleword from memory for an atomic read-modify-write. | |
----------------------------------------------------------------- | |
| LW | Load Word | | |
|-----------|---------------------------------------------------| | |
|100011 (35)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LW rt, offset(base) | |
Purpose: To load a word from memory as a signed value. | |
Descrip: rt = word[base+offset] | |
----------------------------------------------------------------- | |
| LWL | Load Word Left | | |
|-----------|---------------------------------------------------| | |
|100010 (34)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LWL rt, offset(base) | |
Purpose: To load the most-significant part of a word as a | |
signed value from an unaligned memory address. | |
Descrip: left(rt) = right[base+offset] | |
----------------------------------------------------------------- | |
| LWR | Load Word Right | | |
|-----------|---------------------------------------------------| | |
|100110 (38)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LWR rt, offset(base) | |
Purpose: To load the least-significant part of a word from an | |
unaligned memory address as a signed value. | |
Descrip: right(rt) = left[base+offset] | |
----------------------------------------------------------------- | |
| LWU | Load Word Unsigned | | |
|-----------|---------------------------------------------------| | |
|100111 (39)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LWU rt, offset(base) | |
Purpose: To load a word from memory as an unsigned value. | |
Descrip: rt = word[base+offset] | |
----------------------------------------------------------------- | |
| SB | Store Byte | | |
|-----------|---------------------------------------------------| | |
|101000 (40)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SB rt, offset(base) | |
Purpose: To store a byte to memory. | |
Descrip: byte[base+offset] = rt | |
----------------------------------------------------------------- | |
| SC | Store Conditional Word | | |
|-----------|---------------------------------------------------| | |
|111000 (56)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SC rt, offset(base) | |
Purpose: To store a word to memory to complete an atomic read-modify-write. | |
----------------------------------------------------------------- | |
| SCD | Store Conditional Doubleword | | |
|-----------|---------------------------------------------------| | |
|111100 (60)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SCD rt, offset(base) | |
Purpose: To store a doubleword to memory to complete an atomic | |
read-modify-write. | |
----------------------------------------------------------------- | |
| SD | Store Doubleword | | |
|-----------|---------------------------------------------------| | |
|111111 (63)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SD rt, offset(base) | |
Purpose: To store a doubleword to memory. | |
Descrip: doulbeword[base+offset] = rt | |
----------------------------------------------------------------- | |
| SDL | Store Doubleword Left | | |
|-----------|---------------------------------------------------| | |
|101100 (44)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SDL rt, offset(base) | |
Purpose: To store the most-significant part of a doubleword to | |
an unaligned memory address. | |
Descrip: right[base+offset] = left(rt) | |
----------------------------------------------------------------- | |
| SDR | Store Doubleword Right | | |
|-----------|---------------------------------------------------| | |
|101101 (45)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SDR rt, offset(base) | |
Purpose: To store the least-significant part of a doubleword to | |
an unaligned memory address. | |
Descrip: left[base+offset] = right(rt) | |
----------------------------------------------------------------- | |
| SH | Store Halfword | | |
|-----------|---------------------------------------------------| | |
|101001 (41)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SH rt, offset(base) | |
Purpose: To store a halfword to memory. | |
Descrip: halfword[base+offset] = rt | |
----------------------------------------------------------------- | |
| SW | Store Word | | |
|-----------|---------------------------------------------------| | |
|101011 (43)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SW rt, offset(base) | |
Purpose: To store a word to memory. | |
Descrip: word[base+offset] = rt | |
----------------------------------------------------------------- | |
| SWL | Store Word Left | | |
|-----------|---------------------------------------------------| | |
|101010 (42)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SWL rt, offset(base) | |
Purpose: To store the most-significant part of a word to an | |
unaligned memory address. | |
Descrip: right[base+offset] = left(rt) | |
----------------------------------------------------------------- | |
| SWR | Store Word Right | | |
|-----------|---------------------------------------------------| | |
|101110 (46)| base | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SWR rt, offset(base) | |
Purpose: To store the least-significant part of a word to an | |
unaligned memory address. | |
Descrip: left[base+offset] = right(rt) | |
----------------------------------------------------------------- | |
| SYNC | SYNChronize shared memory | | |
|-----------|---------------------------------------------------| | |
| 000000 | 0000 0000 0000 000 | stype |001111 (15)| | |
------6-------------------15-------------------5---------6------- | |
Format: SYNC (stype = 0 implied) | |
Purpose: To order loads and stores to shared memory in a | |
multiprocessor system. | |
**************************************************************************** | |
** Atithmetic Instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| ADD | ADD word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100000 (32)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ADD rd, rs, rt | |
Purpose: To add 32-bit integers. If overflow occurs, then trap. | |
Descrip: rd = rs + rt | |
----------------------------------------------------------------- | |
| ADDI | ADD Immediate word | | |
|-----------|---------------------------------------------------| | |
|001000 (8) | rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: ADDI rt, rs, immediate | |
Purpose: To add a constant to a 32-bit integer. | |
If overflow occurs, then trap. | |
Descrip: rt = rs + immediate | |
----------------------------------------------------------------- | |
| ADDIU | ADD Immediate Unsigned word | | |
|-----------|---------------------------------------------------| | |
|001001 (9) | rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: ADDIU rt, rs, immediate | |
Purpose: To add a constant to a 32-bit integer. | |
Descrip: rt = rs + immediate | |
----------------------------------------------------------------- | |
| ADDU | ADD Unsigned word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100001 (33)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ADDU rd, rs, rt | |
Purpose: To add 32-bit integers. | |
Descrip: rd = rs + rt | |
----------------------------------------------------------------- | |
| AND | AND | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100100 (36)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: AND rd, rs, rt | |
Purpose: To do a bitwise logical AND. | |
Descrip: rd = (rs AND rt) | |
----------------------------------------------------------------- | |
| ANDI | AND Immediate | | |
|-----------|---------------------------------------------------| | |
|001100 (12)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: ANDI rt, rs, immediate | |
Purpose: To do a bitwise logical AND with a constant. | |
Descrip: rd = (rs AND immediate) | |
----------------------------------------------------------------- | |
| DADD | Doubleword ADD | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101100 (44)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DADD rd, rs, rt | |
Purpose: To add 64-bit integers. If overflow occurs, then trap. | |
Descrip: rd = rs + rt | |
----------------------------------------------------------------- | |
| DADDI | Doubleword ADD Immediate | | |
|-----------|---------------------------------------------------| | |
|011000 (24)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: DADDI rt, rs, immediate | |
Purpose: To add a constant to a 64-bit integer. | |
If overflow occurs, then trap. | |
Descrip: rt = rs + immediate | |
----------------------------------------------------------------- | |
| DADDIU | Doubleword ADD Immediate Unsigned | | |
|-----------|---------------------------------------------------| | |
|011001 (25)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: DADDIU rt, rs, immediate | |
Purpose: To add a constant to a 64-bit integer. | |
Descrip: rt = rs + immediate | |
----------------------------------------------------------------- | |
| DADDU | Doubleword ADD Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101101 (45)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DADDU rd, rs, rt | |
Purpose: To add 64-bit integers. | |
Descrip: rd = rs + rt | |
----------------------------------------------------------------- | |
| DDIV | Doubleword DIVide | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011110 (30)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DDIV rs, rt | |
Purpose: To divide 64-bit signed integers. | |
Descrip: LO = rs / rt; HI = rs MOD rt | |
----------------------------------------------------------------- | |
| DDIVU | Doubleword DIVide Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011111 (31)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DDIVU rs, rt | |
Purpose: To divide 64-bit unsigned integers. | |
Descrip: LO = rs / rt; HI = rs MOD rt | |
----------------------------------------------------------------- | |
| DIV | DIVide word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011010 (26)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DIV rs, rt | |
Purpose: To divide 32-bit signed integers. | |
Descrip: LO = rs / rt; HI = rs MOD rt | |
----------------------------------------------------------------- | |
| DIVU | DIVide Unsigned word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011011 (27)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DIVU rs, rt | |
Purpose: To divide 32-bit unsigned integers. | |
Descrip: LO = rs / rt; HI = rs MOD rt | |
----------------------------------------------------------------- | |
| DMULT | Doubleword MULTiply | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011100 (28)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DMULT rs, rt | |
Purpose: To multiply 64-bit signed integers. | |
Descrip: LO = low(rs*rt); HI = high(rs*rt) | |
----------------------------------------------------------------- | |
| DMULTU | Doubleword MULTiply Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011101 (28)| | |
------6----------5---------5--------------10--------------6------ | |
Format: DMULTU rs, rt | |
Purpose: To multiply 64-bit unsigned integers. | |
Descrip: LO = low(rs*rt); HI = high(rs*rt) | |
----------------------------------------------------------------- | |
| DSLL | Doubleword Shift Left Logical | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111000 (56)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSLL rd, rt, sa | |
Purpose: To left shift a doubleword by a fixed amount -- 0 to 31 bits. | |
Descrip: rd = rt << sa | |
----------------------------------------------------------------- | |
| DSLL32 | Doubleword Shift Left Logical +32 | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111100 (60)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSLL32 rd, rt, sa | |
Purpose: To left shift a doubleword by a fixed amount -- 32 to 63 bits. | |
Descrip: rd = rt << (sa+32) | |
----------------------------------------------------------------- | |
| DSLLV | Doubleword Shift Left Logical Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |010100 (20)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSLLV rd, rt, rs | |
Purpose: To left shift a doubleword by a variable number of bits. | |
Descrip: rd = rt << rs | |
----------------------------------------------------------------- | |
| DSRA | Doubleword Shift Right Arithmetic | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111011 (59)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRA rd, rt, sa | |
Purpose: To arithmetic right shift a doubleword by a fixed | |
amount -- 0 to 31 bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| DSRA32 | Doubleword Shift Right Arithmetic +32 | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111111 (63)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRA32 rd, rt, sa | |
Purpose: To arithmetic right shift a doubleword by a fixed | |
amount -- 32-63 bits. | |
Descrip: rd = rt >> (sa+32) | |
----------------------------------------------------------------- | |
| DSRAV | Doubleword Shift Right Arithmetic Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |010111 (23)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRAV rd, rt, rs | |
Purpose: To arithmetic right shift a doubleword by a variable | |
number of bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| DSRL | Doubleword Shift Right Logical | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111010 (58)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRL rd, rt, sa | |
Purpose: To logical right shift a doubleword by a fixed amount | |
-- 0 to 31 bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| DSRL32 | Doubleword Shift Right Logical +32 | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |111110 (62)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRL32 rd, rt, sa | |
Purpose: To logical right shift a doubleword by a fixed amount | |
-- 32 to 63 bits. | |
Descrip: rd = rt >> (sa+32) | |
----------------------------------------------------------------- | |
| DSRLV | Doubleword Shift Right Logical Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |010110 (22)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSRLV rd, rt, rs | |
Purpose: To logical right shift a doubleword by a variable number of bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| DSUB | Doubleword SUBtract | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101110 (46)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSUB rd, rs, rt | |
Purpose: To subtract 64-bit integers; trap if overflow. | |
Descrip: rd = rs - rt | |
----------------------------------------------------------------- | |
| DSUBU | Doubleword SUBtract Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101111 (47)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DSUBU rd, rs, rt | |
Purpose: To subtract 64-bit integers. | |
Descrip: rd = rs - rt | |
----------------------------------------------------------------- | |
| LUI | Load Upper Immediate | | |
|-----------|---------------------------------------------------| | |
|001111 (15)| 00000 | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: LUI rt, immediate | |
Purpose: To load a constant into the upper half of a word. | |
Descrip: rt = immediate * 10000h | |
----------------------------------------------------------------- | |
| MFHI | Move From HI register | | |
|-----------|---------------------------------------------------| | |
| 000000 | 0000 0000 00 | rd | 00000 |010000 (16)| | |
------6---------------10-------------5---------5----------6------ | |
Format: MFHI rd | |
Purpose: To copy the special purpose HI register to a GPR. | |
Descrip: rd = HI | |
----------------------------------------------------------------- | |
| MFLO | Move From LO register | | |
|-----------|---------------------------------------------------| | |
| 000000 | 0000 0000 00 | rd | 00000 |010010 (18)| | |
------6---------------10-------------5---------5----------6------ | |
Format: MFLO rd | |
Purpose: To copy the special purpose LO register to a GPR. | |
Descrip: rd = LO | |
----------------------------------------------------------------- | |
| MTHI | Move To HI register | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | 0000 0000 0000 000 |010001 (17)| | |
------6----------5------------------15--------------------6------ | |
Format: MTHI rs | |
Purpose: To copy a GPR to the special purpose HI register. | |
----------------------------------------------------------------- | |
| MTLO | Move To LO register | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | 0000 0000 0000 000 |010011 (19)| | |
------6----------5------------------15--------------------6------ | |
Format: MTLO rs | |
Purpose: To copy a GPR to the special purpose LO register. | |
----------------------------------------------------------------- | |
| MULT | MULTiply word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011000 (24)| | |
------6----------5---------5--------------10--------------6------ | |
Format: MULT rs, rt | |
Purpose: To multiply 32-bit signed integers. | |
Descrip: LO = low(rs*rt); HI = high(rs*rt) | |
----------------------------------------------------------------- | |
| MULTU | MULTiply Unsigned word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | 0000 0000 00 |011001 (25)| | |
------6----------5---------5--------------10--------------6------ | |
Format: MULTU rs, rt | |
Purpose: To multiply 32-bit unsigned integers. | |
Descrip: LO = low(rs*rt); HI = high(rs*rt) | |
----------------------------------------------------------------- | |
| NOR | Not OR | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100111 (39)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: NOR rd, rs, rt | |
Purpose: To do a bitwise logical NOT OR. | |
Descrip: rd = (rs NOR rt) | |
----------------------------------------------------------------- | |
| OR | OR | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100101 (37)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: OR rd, rs, rt | |
Purpose: To do a bitwise logical OR. | |
Descrip: rd = (rs OR rt) | |
----------------------------------------------------------------- | |
| ORI | OR Immediate | | |
|-----------|---------------------------------------------------| | |
|001101 (13)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: ORI rt, rs, immediate | |
Purpose: To do a bitwise logical OR with a constant. | |
Descrip: rt = (rs NOR immediate) | |
----------------------------------------------------------------- | |
| SLL | Shift word Left Logical | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |000000 (0) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SLL rd, rt, sa | |
Purpose: To left shift a word by a fixed number of bits. | |
Comment: SLL r0, r0, r0 is equal to a NOP (No OPeration) | |
Descrip: rd = rt << sa | |
----------------------------------------------------------------- | |
| SLLV | Shift word Left Logical Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |000100 (4) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SLLV rd, rt, rs | |
Purpose: To left shift a word by a variable number of bits. | |
Descrip: rd = rt << sa | |
----------------------------------------------------------------- | |
| SLT | Set on Less Than | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101010 (42)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SLT rd, rs, rt | |
Purpose: To record the result of a less-than comparison. | |
Descrip: if rs < rt then rd = 1 else rd = 0 | |
----------------------------------------------------------------- | |
| SLTI | Set on Less Than Immediate | | |
|-----------|---------------------------------------------------| | |
|001010 (10)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: SLTI rt, rs, immediate | |
Purpose: To record the result of a less-than comparison with a constant. | |
Descrip: if rs < immediate then rd = 1 else rd = 0 | |
----------------------------------------------------------------- | |
| SLTIU | Set on Less Than Immediate Unsigned | | |
|-----------|---------------------------------------------------| | |
|001011 (11)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: SLTIU rt, rs, immediate | |
Purpose: To record the result of an unsigned less-than | |
comparison with a constant. | |
Descrip: if rs < immediate then rd = 1 else rd = 0 | |
----------------------------------------------------------------- | |
| SLTU | Set on Less Than Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |101011 (43)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SLTU rd, rs, rt | |
Purpose: To record the result of an unsigned less-than comparison. | |
Descrip: if rs < rt then rd = 1 else rd = 0 | |
----------------------------------------------------------------- | |
| SRA | Shift word Right Arithmetic | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |000011 (3) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SRA rd, rt, sa | |
Purpose: To arithmetic right shift a word by a fixed number of bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| SRAV | Shift word Right Arithmetic Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |000111 (7) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SRAV rd, rt, rs | |
Purpose: To arithmetic right shift a word by a variable number of bits. | |
Descrip: rd = rt >> rs | |
----------------------------------------------------------------- | |
| SRL | Shift word Right Logical | | |
|-----------|---------------------------------------------------| | |
| 000000 | 00000 | rt | rd | sa |000010 (2) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SRL rd, rt, sa | |
Purpose: To logical right shift a word by a fixed number of bits. | |
Descrip: rd = rt >> sa | |
----------------------------------------------------------------- | |
| SRLV | Shift word Right Logical Variable | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |000110 (6) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: SRLV rd, rt, rs | |
Purpose: To logical right shift a word by a variable number of bits. | |
Descrip: rd = rt >> rs | |
----------------------------------------------------------------- | |
| SUB | SUBtract word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100010 (34)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SUB rd, rs, rt | |
Purpose: To subtract 32-bit integers. If overflow occurs, then trap. | |
Descrip: rd = rs - rt | |
----------------------------------------------------------------- | |
| SUBU | SUBtract Unsigned word | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100011 (35)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SUBU rd, rs, rt | |
Purpose: To subtract 32-bit integers. No trap on overflow. | |
Descrip: rd = rs - rt | |
----------------------------------------------------------------- | |
| XOR | eXclusive OR | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | rd | 00000 |100110 (38)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: XOR rd, rs, rt | |
Purpose: To do a bitwise logical EXCLUSIVE OR. | |
Descrip: rd = (rs XOR rt) | |
----------------------------------------------------------------- | |
| XORI | eXclusive OR Immediate | | |
|-----------|---------------------------------------------------| | |
|001110 (14)| rs | rt | immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: XORI rt, rs, immediate | |
Purpose: To do a bitwise logical EXCLUSIVE OR with a constant. | |
Descrip: rd = (rs XOR immediate) | |
**************************************************************************** | |
** Jump and Branch Instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| BEQ | Branch on EQual | | |
|-----------|---------------------------------------------------| | |
|000100 (4) | rs | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BEQ rs, rt, offset | |
Purpose: To compare GPRs then do a PC-relative conditional branch. | |
Descrip: branch if rs = rt | |
----------------------------------------------------------------- | |
| BEQL | Branch on EQual Likley | | |
|-----------|---------------------------------------------------| | |
|010100 (20)| rs | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BEQL rs, rt, offset | |
Purpose: To compare GPRs then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs = rt | |
----------------------------------------------------------------- | |
| BGEZ | Branch on Greater than or Equal to Zero | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |00001 (1)| offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGEZ rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch. | |
Descrip: branch if rs >= 0 (signed) | |
----------------------------------------------------------------- | |
| BGEZAL | Branch on Greater than or Equal to Zero And Link | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |10001(17)| offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGEZAL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional procedure call. | |
Descrip: branch if rs >= 0 (signed) (return address in ra) | |
----------------------------------------------------------------- | |
| BGEZALL | Branch on Greater than or Equal to Zero And Link Likley | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |10011(19)| offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGEZALL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional procedure call; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs >= 0 (signed) (return address in ra) | |
----------------------------------------------------------------- | |
| BGEZL | Branch on Greater than or Equal to Zero Likley | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |00011 (3)| offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGEZL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs >= 0 (signed) | |
----------------------------------------------------------------- | |
| BGTZ | Branch on Greater than Zero | | |
|-----------|---------------------------------------------------| | |
|000111 (7) | rs | 00000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGTZ rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch. | |
Descrip: branch if rs > 0 (signed) | |
----------------------------------------------------------------- | |
| BGTZL | Branch on Greater Than Zero Likley | | |
|-----------|---------------------------------------------------| | |
|010111 (23)| rs | 00000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BGTZL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs > 0 (signed) | |
----------------------------------------------------------------- | |
| BLEZ | Branch on Less than or Equal to Zero | | |
|-----------|---------------------------------------------------| | |
|000110 (6) | rs | 00000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLEZ rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch. | |
Descrip: branch if rs <= 0 (signed) | |
----------------------------------------------------------------- | |
| BLEZL | Branch on Less than or Equal to Zero Likley | | |
|-----------|---------------------------------------------------| | |
|010110 (22)| rs | 00000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLEZL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs <= 0 (signed) | |
----------------------------------------------------------------- | |
| BLTZ | Branch on Less Than Zero | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs | 00000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLTZ rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch. | |
Descrip: branch if rs < 0 (signed) | |
----------------------------------------------------------------- | |
| BLTZAL | Branch on Less Than Zero And Link | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs | 10000 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLTZAL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional procedure call. | |
Descrip: branch if rs < 0 (signed) (return address in ra) | |
----------------------------------------------------------------- | |
| BLTZALL | Branch on Less Than Zero And Link Likley | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs | 10010 | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLTZALL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional procedure | |
call; execute the delay slot only if the branch is taken. | |
Descrip: branch if rs < 0 (signed) (return address in ra) | |
----------------------------------------------------------------- | |
| BLTZL | Branch on Less Than Zero Likley | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |00010 (2)| offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BLTZL rs, offset | |
Purpose: To test a GPR then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs < 0 (signed) | |
----------------------------------------------------------------- | |
| BNE | Branch on Not Equal | | |
|-----------|---------------------------------------------------| | |
|000101 (5) | rs | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BNE rs, rt, offset | |
Purpose: To compare GPRs then do a PC-relative conditional branch. | |
Descrip: branch if rs <> rt | |
----------------------------------------------------------------- | |
| BNEL | Branch on Not Equal Likley | | |
|-----------|---------------------------------------------------| | |
|010101 (21)| rs | rt | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: BNEL rs, rt, offset | |
Purpose: To compare GPRs then do a PC-relative conditional branch; | |
execute the delay slot only if the branch is taken. | |
Descrip: branch if rs <> rt | |
----------------------------------------------------------------- | |
| J | Jump | | |
|-----------|---------------------------------------------------| | |
|000010 (2) | instr_index | | |
------6-------------------------------26------------------------- | |
Format: J target | |
Purpose: To branch within the current 256 MB aligned region. | |
----------------------------------------------------------------- | |
| JAL | Jump And Link | | |
|-----------|---------------------------------------------------| | |
|000011 (3) | instr_index | | |
------6-------------------------------26------------------------- | |
Format: JAL target | |
Purpose: To procedure call within the current 256 MB aligned region. | |
Descrip: return address in ra | |
----------------------------------------------------------------- | |
| JALR | Jump And Link Register | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | 00000 | rd | 00000 |001001 (9) | | |
------6----------5---------5---------5---------5----------6------ | |
Format: JALR rs, rd | |
Purpose: To procedure call to an instruction address in a register. | |
Descrip: return address in rd | |
----------------------------------------------------------------- | |
| JR | Jump Register | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | 0000 0000 0000 000 |001000 (8) | | |
------6----------5------------------15--------------------6------ | |
Format: JR rs | |
Purpose: To branch to an instruction address in a register. | |
**************************************************************************** | |
** Special instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| BREAK | BREAKpoint | | |
|-----------|---------------------------------------------------| | |
| 000000 | code |001101 (13)| | |
------6--------------------------20-----------------------6------ | |
Format: BREAK offset | |
Purpose: To cause a Breakpoint exception. | |
----------------------------------------------------------------- | |
| SYSCALL | SYStem CALL | | |
|-----------|---------------------------------------------------| | |
| 000000 | code |001100 (12)| | |
------6--------------------------20-----------------------6------ | |
Format: SYSCALL offset | |
Purpose: To cause a System Call exception. | |
**************************************************************************** | |
** Exception Instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| TEQ | Trap if EQual | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110100 (52)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TEQ rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs = rt then trap | |
----------------------------------------------------------------- | |
| TEQI | Trap if EQual Immediate | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01100(12)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TEQI rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs = immediate then trap | |
----------------------------------------------------------------- | |
| TGE | Trap if Greater or Equal | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110000 (48)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TGE rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs >= rt then trap | |
----------------------------------------------------------------- | |
| TGEI | Trap if Greater or Equal Immediate | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01000 (8)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TGEI rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs >= immediate then trap | |
----------------------------------------------------------------- | |
| TGEIU | Trap if Greater or Equal Immediate Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01001 (9)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TGEIU rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs >= immediate then trap | |
----------------------------------------------------------------- | |
| TGEU | Trap if Greater or Equal Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110001 (49)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TGEU rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs >= rt then trap | |
----------------------------------------------------------------- | |
| TLT | Trap if Less Than | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110010 (50)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TLT rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs < rt then trap | |
----------------------------------------------------------------- | |
| TLTI | Trap if Less Than Immediate | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01010(10)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TLTI rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs < immediate then trap (signed) | |
----------------------------------------------------------------- | |
| TLTIU | Trap if Less Than Immediate Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01011(11)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TLTIU rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs < immediate then trap | |
----------------------------------------------------------------- | |
| TLTU | Trap if Less Than Unsigned | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110011 (51)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TLTU rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs < rt then trap | |
----------------------------------------------------------------- | |
| TNE | Trap if Not Equal | | |
|-----------|---------------------------------------------------| | |
| 000000 | rs | rt | code |110110 (54)| | |
------6----------5---------5--------------10--------------6------ | |
Format: TNE rs, rt | |
Purpose: To compare GPRs and do a conditional Trap. | |
Descrip: if rs <> rt then trap | |
----------------------------------------------------------------- | |
| TNEI | Trap if Not Equal Immediate | | |
|-----------|---------------------------------------------------| | |
| 000001 | rs |01110(14)| immediate | | |
------6----------5---------5-------------------16---------------- | |
Format: TNEI rs, immediate | |
Purpose: To compare a GPR to a constant and do a conditional Trap. | |
Descrip: if rs <> immediate then trap | |
**************************************************************************** | |
** System Control Processor (COP0) Instructions ** | |
**************************************************************************** | |
----------------------------------------------------------------- | |
| CACHE | CACHE | | |
|-----------|---------------------------------------------------| | |
|101111 (47)| base | op | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: CACHE op, offset(base) | |
Purpose: The 16-bit offset is sign-extended and added to the contents of | |
general register base to form a virtual address. The virtual | |
address is translated to a physical address using the TLB, and the | |
5-bit sub-opcode specifies a cache operation for that address. | |
----------------------------------------------------------------- | |
| DMFC0 | Doubleword Move From CP0 | | |
|-----------|---------------------------------------------------| | |
| 010000 |00001 (1)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: DMFC0 rt, rd | |
Purpose: To copy a doubleword from an FPR to a GPR. | |
----------------------------------------------------------------- | |
| DMTC0 | Doubleword Move To CP0 | | |
|-----------|---------------------------------------------------| | |
| 010000 |00101 (5)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: DMTC0 rt, rd | |
Purpose: To copy a doubleword from a GPR to an FPR. | |
----------------------------------------------------------------- | |
| ERET | Return from Exception | | |
|-----------|---------------------------------------------------| | |
| 010000 |CO| 0000 0000 0000 0000 000 |011000 (24)| | |
------6------1-------------------19-----------------------6------ | |
Format: ERET | |
Purpose: ERET is the R4300 instruction for returning from an interrupt, | |
exception, or error trap. Unlike a branch or jump instruction, | |
ERET does not execute the next instruction. | |
----------------------------------------------------------------- | |
| MFC0 | Move word From CP0 | | |
|-----------|---------------------------------------------------| | |
| 010000 |00000 (0)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: MFC0 rt, rd | |
Purpose: To copy a word from an FPU (CP1) general register to a GPR. | |
Descrip: rt = COP rd | |
----------------------------------------------------------------- | |
| MTC0 | Move word to CP0 | | |
|-----------|---------------------------------------------------| | |
| 010000 |00100 (4)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: MTC0 rt, rd | |
Purpose: To copy a word from a GPR to an FPU (CP1) general register. | |
Descrip: COP rd = rt | |
----------------------------------------------------------------- | |
| TLBP | Translation Lookaside Buffer Probe | | |
|-----------|---------------------------------------------------| | |
| 010000 |CO| 0000 0000 0000 0000 000 | 001000 (8)| | |
------6------1-------------------19-----------------------6------ | |
Format: TLBP | |
Purpose: The Index register is loaded with the address of the TLB entry | |
whose contents match the contents of the EntryHi register. If no | |
TLB entry matches, the high-order bit of the Index register is set. | |
The architecture does not specify the operation of memory references | |
associated with the instruction immediately after a TLBP instruction, | |
nor is the operation specified if more than one TLB entry matches. | |
----------------------------------------------------------------- | |
| TLBR | Translation Lookaside Buffer Read | | |
|-----------|---------------------------------------------------| | |
| 010000 |CO| 0000 0000 0000 0000 000 | 000001 (1)| | |
------6------1-------------------19-----------------------6------ | |
Format: TLBR | |
Purpose: The G bit (which controls ASID matching) read from the TLB is | |
written into both of the EntryLo0 and EntryLo1 registers. | |
The EntryHi and EntryLo registers are loaded with the contents of | |
the TLB entry pointed at by the contents of the TLB Index register. | |
The operation is invalid (and the results are unspecified) if the | |
contents of the TLB Index register are greater than the number of | |
TLB entries in the processor. | |
----------------------------------------------------------------- | |
| TLBWI | Translation Lookaside Buffer Write Index | | |
|-----------|---------------------------------------------------| | |
| 010000 |CO| 0000 0000 0000 0000 000 | 000010 (2)| | |
------6------1-------------------19-----------------------6------ | |
Format: TLBWI | |
Purpose: The G bit of the TLB is written with the logical AND of the G bits | |
in the EntryLo0 and EntryLo1 registers. The TLB entry pointed at by | |
the contents of the TLB Index register is loaded with the contents | |
of the EntryHi and EntryLo registers. The operation is invalid (and | |
the results are unspecified) if the contents of the TLB Index | |
register are greater than the number of TLB entries in the processor. | |
----------------------------------------------------------------- | |
| TLBWR | Translation Lookaside Buffer Write Random | | |
|-----------|---------------------------------------------------| | |
| 010000 |CO| 0000 0000 0000 0000 000 | 000110 (6)| | |
------6------1-------------------19-----------------------6------ | |
Format: TLBWR | |
Purpose: The G bit of the TLB is written with the logical AND of the G bits | |
in the EntryLo0 and EntryLo1 registers. The TLB entry pointed at by | |
the contents of the TLB Random register is loaded with the contents | |
of the EntryHi and EntryLo registers. | |
**************************************************************************** | |
** Floating-point Unit (COP1) instructions ** | |
**************************************************************************** | |
fmt = 10000b (.S, Single) fmt = 10001b (.D, Double) | |
fmt = 10100b (.W, Word) fmt = 10101b (.L, Long) | |
----------------------------------------------------------------- | |
| ABS.fmt | floating-point ABSolute value | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 000101 (5)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ABS.S fd, fs | |
ABS.D fd, fs | |
Purpose: To compute the absolute value of an FP value. | |
----------------------------------------------------------------- | |
| ADD.fmt | floating-point ADD | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | ft | fs | fd | 000000 (0)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ADD.S fd, fs, ft | |
ADD.D fd, fs, ft | |
Purpose: To add FP values. | |
----------------------------------------------------------------- | |
| BC1F | Branch on FP False | | |
|-----------|---------------------------------------------------| | |
| 010001 |01000 (8)| cc |nd|tf| offset | | |
| | | | 0| 0| | | |
------6----------5-------3---1--1--------------16---------------- | |
Format: BC1F offset (cc = 0 implied) | |
BC1F cc, offset | |
Purpose: To test an FP condition code and do a PC-relative | |
conditional branch. | |
----------------------------------------------------------------- | |
| BC1FL | Branch on FP False Likley | | |
|-----------|---------------------------------------------------| | |
| 010001 |01000 (8)| cc |nd|tf| offset | | |
| | | | 1| 0| | | |
------6----------5-------3---1--1--------------16---------------- | |
Format: BC1FL offset (cc = 0 implied) | |
BC1FL cc, offset | |
Purpose: To test an FP condition code and do a PC-relative conditional | |
branch; execute the delay slot only if the branch is taken. | |
----------------------------------------------------------------- | |
| BC1T | Branch on FP True | | |
|-----------|---------------------------------------------------| | |
| 010001 |01000 (8)| cc |nd|tf| offset | | |
| | | | 0| 1| | | |
------6----------5-------3---1--1--------------16---------------- | |
Format: BC1T offset (cc = 0 implied) | |
BC1T cc, offset | |
Purpose: To test an FP condition code and do a PC-relative | |
conditional branch. | |
----------------------------------------------------------------- | |
| BC1TL | Branch on FP True Likley | | |
|-----------|---------------------------------------------------| | |
| 010001 |01000 (8)| cc |nd|tf| offset | | |
| | | | 1| 1| | | |
------6----------5-------3---1--1--------------16---------------- | |
Format: BC1TL offset (cc = 0 implied) | |
BC1TL cc, offset | |
Purpose: To test an FP condition code and do a PC-relative conditional | |
branch; execute the delay slot only if the branch is taken. | |
----------------------------------------------------------------- | |
| C.cond.fmt| floating-point Compare | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | ft | fs | cc |00 |11 | cond | | |
------6----------5---------5---------5-------3----2---2-----4---- | |
cond: 0000 = F (False) | |
0001 = UN (Unordered) | |
0010 = EQ (Equal) | |
0011 = UEQ (Unordered or Equal) | |
0100 = OLT (Ordered or Less Than) | |
0101 = ULT (Unordered or Less Than) | |
0110 = OLE (Ordered or Less than or Equal) | |
0111 = ULE (Unordered or Less than or Equal) | |
1000 = SF (Signaling False) | |
1001 = NGLE (Not Greater than or Less than or Equal) | |
1010 = SEQ (Signaling Equal) | |
1011 = NGL (Not Greater than or Less than) | |
1100 = LT (Less Than) | |
1101 = NGE (Not Greater than or Equal) | |
1110 = LE (Less than or Equal) | |
1111 = NGT (Not Greater Than) | |
Format: C.cond.S fs, ft | |
C.cond.D fs, ft | |
Purpose: To compare FP values and record the Boolean result in | |
a condition code. | |
----------------------------------------------------------------- | |
| CEIL.L.fmt| floating-point CEILing convert to Long fixed-point| | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001010 (10)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CEIL.L.S fd, fs | |
CEIL.L.D fd, fs | |
Purpose: To convert an FP value to 64-bit fixed-point, rounding up. | |
----------------------------------------------------------------- | |
| CEIL.W.fmt| floating-point CEILing convert to Word fixed-point| | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001110 (14)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CEIL.W.S fd, fs | |
CEIL.W.D fd, fs | |
Purpose: To convert an FP value to 32-bit fixed-point, rounding up. | |
----------------------------------------------------------------- | |
| CFC1 | Move control word From Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00010 (2)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: CFC1 rt, fs | |
Purpose: To copy a word from an FPU control register to a GPR. | |
Descrip: rt = fs | |
----------------------------------------------------------------- | |
| CTC1 | Move control word To Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00110 (6)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: CTC1 rt, fs | |
Purpose: To copy a word from a GPR to an FPU control register. | |
Descrip: fs = rt | |
----------------------------------------------------------------- | |
| CVT.D.fmt | floating-point ConVerT to Double floating-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |100001 (33)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CVT.D.S fd, fs | |
CVT.D.W fd, fs | |
CVT.D.L fd, fs | |
Purpose: To convert an FP or fixed-point value to double FP. | |
----------------------------------------------------------------- | |
| CVT.L.fmt | floating-point ConVerT to Long fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |100101 (37)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CVT.L.S fd, fs | |
CVT.L.D fd, fs | |
Purpose: To convert an FP value to a 64-bit fixed-point. | |
----------------------------------------------------------------- | |
| CVT.S.fmt | floating-point ConVerT to Single floating-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |100000 (32)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CVT.S.D fd, fs | |
CVT.S.W fd, fs | |
CVT.S.L fd, fs | |
Purpose: To convert an FP or fixed-point value to single FP. | |
----------------------------------------------------------------- | |
| CVT.W.fmt | floating-point ConVerT to Word fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |100100 (36)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: CVT.W.S fd, fs | |
CVT.W.D fd, fs | |
Purpose: To convert an FP value to 32-bit fixed-point. | |
----------------------------------------------------------------- | |
| DIV.fmt | floating-point DIVide | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | ft | fs | fd | 000011 (3)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: DIV.S fd, fs, ft | |
DIV.D fd, fs, ft | |
Purpose: To divide FP values. | |
----------------------------------------------------------------- | |
| DMFC1 | Doubleword Move From Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00001 (1)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: DMFC1 rt, fs | |
Purpose: To copy a doubleword from an FPR to a GPR. | |
----------------------------------------------------------------- | |
| DMTC1 | Doubleword Move To Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00101 (5)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: DMTC1 rt, fs | |
Purpose: To copy a doubleword from a GPR to an FPR. | |
----------------------------------------------------------------- | |
|FLOOR.L.fmt| floating-point FLOOR convert to Long fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001011 (11)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: FLOOR.L.S fd, fs | |
FLOOR.L.D fd, fs | |
Purpose: To convert an FP value to 64-bit fixed-point, rounding down. | |
----------------------------------------------------------------- | |
|FLOOR.W.fmt| floating-point FLOOR convert to Word fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001111 (15)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: FLOOR.W.S fd, fs | |
FLOOR.W.D fd, fs | |
Purpose: To convert an FP value to 32-bit fixed-point, rounding down. | |
----------------------------------------------------------------- | |
| LDC1 | Load Doubleword to Floating-Point | | |
|-----------|---------------------------------------------------| | |
|110101 (53)| base | ft | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LDC1 ft, offset(base) | |
Purpose: To load a doubleword from memory to an FPR. | |
Descrip: COP ft = doubleword[base+offset] | |
----------------------------------------------------------------- | |
| LWC1 | Load Word to Floating-Point | | |
|-----------|---------------------------------------------------| | |
|110001 (49)| base | ft | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: LWC1 ft, offset(base) | |
Purpose: To load a word from memory to an FPR. | |
Descrip: COP ft = word[base+offset] | |
----------------------------------------------------------------- | |
| MFC1 | Move Word From Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00000 (0)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: MFC1 rt, fs | |
Purpose: To copy a word from an FPU (CP1) general register to a GPR. | |
Descrip: rt = COP fs | |
----------------------------------------------------------------- | |
| MOV.fmt | floating-point MOVe | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 000110 (6)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: MOV.S fd, fs | |
MOV.D fd, fs | |
Purpose: To move an FP value between FPRs. | |
----------------------------------------------------------------- | |
| MTC1 | Move Word to Floating-Point | | |
|-----------|---------------------------------------------------| | |
| 010001 |00100 (4)| rt | fs | 0000 0000 000 | | |
------6----------5---------5---------5--------------11----------- | |
Format: MTC1 rt, fs | |
Purpose: To copy a word from a GPR to an FPU (CP1) general register. | |
Descrip: COP fs = rt | |
----------------------------------------------------------------- | |
| MUL.fmt | floating-point MULtiply | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | ft | fs | fd | 000010 (2)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: MUL.S fd, fs, ft | |
MUL.D fd, fs, ft | |
Purpose: To multiply FP values. | |
----------------------------------------------------------------- | |
| NEG.fmt | floating-point NEGate | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 000111 (7)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: NEG.S fd, fs | |
NEG.D fd, fs | |
Purpose: To negate an FP value. | |
----------------------------------------------------------------- | |
|ROUND.L.fmt| floating-point ROUND to Long fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 001000 (8)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ROUND.L.S fd, fs | |
ROUND.L.D fd, fs | |
Purpose: To convert an FP value to 64-bit fixed-point, rounding to nearest. | |
----------------------------------------------------------------- | |
|ROUND.W.fmt| floating-point ROUND to Word fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001100 (12)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: ROUND.W.S fd, fs | |
ROUND.W.D fd, fs | |
Purpose: To convert an FP value to 32-bit fixed-point, rounding to nearest. | |
----------------------------------------------------------------- | |
| SDC1 | Store Doubleword from Floating-Point | | |
|-----------|---------------------------------------------------| | |
|111101 (61)| base | ft | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SDC1 ft, offset(base) | |
Purpose: To store a doubleword from an FPR to memory. | |
Descrip: doubleword[base+offset] = COP rt | |
----------------------------------------------------------------- | |
| SQRT.fmt | floating-point SQuare RooT | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 000100 (4)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SQRT.S fd, fs | |
SQRT.D fd, fs | |
Purpose: To compute the square root of an FP value. | |
----------------------------------------------------------------- | |
| SUB.fmt | floating-point SUBtract | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | ft | fs | fd | 000001 (1)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: SUB.S fd, fs, ft | |
SUB.D fd, fs, ft | |
Purpose: To subtract FP values. | |
----------------------------------------------------------------- | |
| SWC1 | Store Word from Floating-Point | | |
|-----------|---------------------------------------------------| | |
|111001 (57)| base | ft | offset | | |
------6----------5---------5-------------------16---------------- | |
Format: SWC1 ft, offset(base) | |
Purpose: To store a word from an FPR to memory. | |
Descrip: word[base+offset] = COP rt | |
----------------------------------------------------------------- | |
|TRUNC.L.fmt| floating-point TRUNCate to Long fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd | 001001 (9)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: TRUNC.L.S fd, fs | |
TRUNC.L.D fd, fs | |
Purpose: To convert an FP value to 64-bit fixed-point, rounding toward zero. | |
----------------------------------------------------------------- | |
|TRUNC.W.fmt| floating-point TRUNCate to Word fixed-point | | |
|-----------|---------------------------------------------------| | |
| 010001 | fmt | 00000 | fs | fd |001101 (13)| | |
------6----------5---------5---------5---------5----------6------ | |
Format: TRUNC.W.S fd, fs | |
TRUNC.W.D fd, fs | |
Purpose: To convert an FP value to 32-bit fixed-point, rounding toward zero. | |
--------------------------------------------------------- | |
Resources: | |
R4300i documentation from MIPS Technologies, Inc. | |
R4000 Instructions from Silicon Graphics | |
Project UnReality by Michael Tedder | |
Disa64 by TRILILI | |
Nintendo 64 opcodes v0.3 by anarko <[email protected]> | |
Part C: R4300 Command set released on 98-02-19 | |
---------------------------------------------------------------------------- | |
**************************************************************************** | |
** Main CPU ** | |
**************************************************************************** | |
CPU: Instructions encoded by opcode field. | |
31---------26---------------------------------------------------0 | |
| opcode | | | |
------6---------------------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | *1 | *2 | J | JAL | BEQ | BNE | BLEZ | BGTZ | | |
001 | ADDI | ADDIU | SLTI | SLTIU | ANDI | ORI | XORI | LUI | | |
010 | *3 | *4 | *5 | | BEQL | BNEL | BLEZL | BGTZL | | |
011 | DADDI |DADDIU | LDL | LDR | | | | | | |
100 | LB | LH | LWL | LW | LBU | LHU | LWR | LWU | | |
101 | SB | SH | SWL | SW | SDL | SDR | SWR | CACHE | | |
110 | LL | LWC1 | LWC2 | | LLD | LDC1 | LDC2 | LD | | |
111 | SC | SWC1 | SWC2 | | SCD | SDC1 | SDC2 | SD | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
*1 = SPECIAL, see SPECIAL list *2 = REGIMM, see REGIMM list | |
*3 = COP0 *4 = COP1 *5 = COP2 | |
SPECIAL: Instr. encoded by function field when opcode field = SPECIAL. | |
31---------26------------------------------------------5--------0 | |
| = SPECIAL | | function| | |
------6----------------------------------------------------6----- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | SLL | | SRL | SRA | SLLV | | SRLV | SRAV | | |
001 | JR | JALR | | |SYSCALL| BREAK | | SYNC | | |
010 | MFHI | MTHI | MFLO | MTLO | DSLLV | | DSRLV | DSRAV | | |
011 | MULT | MULTU | DIV | DIVU | DMULT | DMULTU| DDIV | DDIVU | | |
100 | ADD | ADDU | SUB | SUBU | AND | OR | XOR | NOR | | |
101 | | | SLT | SLTU | DADD | DADDU | DSUB | DSUBU | | |
110 | TGE | TGEU | TLT | TLTU | TEQ | | TNE | | | |
111 | DSLL | | DSRL | DSRA |DSLL32 | |DSRL32 |DSRA32 | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
REGIMM: Instructions encoded by the rt field when opcode field = REGIMM. | |
31---------26----------20-------16------------------------------0 | |
| = REGIMM | | rt | | | |
------6---------------------5------------------------------------ | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
00 | BLTZ | BGEZ | BLTZL | BGEZL | | | | | | |
01 | TGEI | TGEIU | TLTI | TLTIU | TEQI | | TNEI | | | |
10 | BLTZAL| BGEZAL|BLTZALL|BGEZALL| | | | | | |
11 | | | | | | | | | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
**************************************************************************** | |
** COP0 ** | |
**************************************************************************** | |
COP0: Instructions encoded by the fmt field when opcode = COP0. | |
31--------26-25------21 ----------------------------------------0 | |
| = COP0 | fmt | | | |
------6----------5----------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
00 | MFC0 | DMFC0 | CFC0 | | MTC0 | DMTC0 | CTC0 | | | |
01 | *1 | | | | | | | | | |
10 | *2 | | | | | | | | | |
11 | | | | | | | | | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
*1 = BC instr, see BC0 list *2 = TLB instr, see TLB list | |
BC0: Instructions encoded by the nd and tf fields when opcode | |
= COP0 and fmt = BC. | |
31--------26-25------21 ---17--16-------------------------------0 | |
| = COP0 | = BC | |nd|tf| | | |
------6----------5-----------1--1-------------------------------- | |
|---0---|---1---| tf | |
0 | BC0F | BC0T | | |
1 | BC0FL | BC0TL | | |
nd |-------|-------| | |
TLB: Instructions encoded by the function field when opcode | |
= COP0 and fmt = TLB. | |
31--------26-25------21 -------------------------------5--------0 | |
| = COP0 | = TLB | | function| | |
------6----------5-----------------------------------------6----- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | | TLBR | TLBWI | | | | TLBWR | | | |
001 | TLBP | | | | | | | | | |
010 | | | | | | | | | | |
011 | ERET | | | | | | | | | |
100 | | | | | | | | | | |
101 | | | | | | | | | | |
110 | | | | | | | | | | |
111 | | | | | | | | | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
**************************************************************************** | |
** COP1 - Floating Point Unit ** | |
**************************************************************************** | |
COP1: Instructions encoded by the fmt field when opcode = COP1. | |
31--------26-25------21 ----------------------------------------0 | |
| = COP1 | fmt | | | |
------6----------5----------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
00 | MFC1 | DMFC1 | CFC1 | | MTC1 | DMTC1 | CTC1 | | | |
01 | *1 | | | | | | | | | |
10 | *2 | *3 | | | *4 | *5 | | | | |
11 | | | | | | | | | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
*1 = BC instructions, see BC1 list | |
*2 = S instr, see FPU list *3 = D instr, see FPU list | |
*4 = W instr, see FPU list *5 = L instr, see FPU list | |
BC1: Instructions encoded by the nd and tf fields when opcode | |
= COP1 and fmt = BC | |
31--------26-25------21 ---17--16-------------------------------0 | |
| = COP1 | = BC | |nd|tf| | | |
------6----------5-----------1--1-------------------------------- | |
|---0---|---1---| tf | |
0 | BC1F | BC1T | | |
1 | BC1FL | BC1TL | | |
nd |-------|-------| | |
FPU: Instructions encoded by the function field when opcode = COP1 | |
and fmt = S, D, W or L | |
31--------26-25------21 ----------------------------------------0 | |
| = COP1 | = S | | | |
------6----------5----------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | ADD | SUB | MUL | DIV | SQRT | ABS | MOV | NEG | | |
001 |ROUND.L|TRUNC.L| CEIL.L|FLOOR.L|ROUND.W|TRUNC.W| CEIL.W|FLOOR.W| | |
010 | | | | | | | | | | |
011 | | | | | | | | | | |
100 | | CVT.D | | | CVT.W | CVT.L | | | | |
101 | | | | | | | | | | |
110 | C.F | C.UN | C.EQ | C.UEQ | C.OLT | C.ULT | C.OLE | C.ULE | | |
111 | C.SF | C.NGLE| C.SEQ | C.NGL | C.LT | C.NGE | C.LE | C.NGT | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
31--------26-25------21 ----------------------------------------0 | |
| = COP1 | = D | | | |
------6----------5----------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | ADD | SUB | MUL | DIV | SQRT | ABS | MOV | NEG | | |
001 |ROUND.L|TRUNC.L| CEIL.L|FLOOR.L|ROUND.W|TRUNC.W| CEIL.W|FLOOR.W| | |
010 | | | | | | | | | | |
011 | | | | | | | | | | |
100 | CVT.S | | | | CVT.W | CVT.L | | | | |
101 | | | | | | | | | | |
110 | C.F | C.UN | C.EQ | C.UEQ | C.OLT | C.ULT | C.OLE | C.ULE | | |
111 | C.SF | C.NGLE| C.SEQ | C.NGL | C.LT | C.NGE | C.LE | C.NGT | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
31--------26-25------21 ----------------------------------------0 | |
| = COP1 | = W, L | | | |
------6----------5----------------------------------------------- | |
|--000--|--001--|--010--|--011--|--100--|--101--|--110--|--111--| lo | |
000 | | | | | | | | | | |
001 | | | | | | | | | | |
010 | | | | | | | | | | |
011 | | | | | | | | | | |
100 | CVT.S | CVT.D | | | | | | | | |
101 | | | | | | | | | | |
110 | | | | | | | | | | |
111 | | | | | | | | | | |
hi |-------|-------|-------|-------|-------|-------|-------|-------| | |
Nintendo 64 opcodes v0.3 by anarko <[email protected]> | |
Part D: ROM header released on 98-02-19 | |
---------------------------------------------------------------------------- | |
* Mr Backup Z64 (.BIN or .Z64 files) uses a Low/High byte format | |
(Little Endian), wich is the "correct" format to read from. | |
* Doctor V64 (.V64, .N64 or .U64 files) uses a High/Low byte format | |
(Big Endian), so each word are byte flipped, like this: | |
"ETTSNI G" | |
When it should look like this: | |
"TESTING " | |
To solve this, rotate the word to left/right by 8 bits. | |
---------------------------------------------------------------------------- | |
The addresses below is only valid for ROM's in Low/High | |
format, eg: Mr Backup Z64 ROM's. You have to byteswap Doctor | |
V64 ROM's before you can read data that makes any sense. | |
---------------------------------------------------------------------------- | |
0000h - 0001h (1 word): 8037h | |
Can be used to validate ROM, if the word is | |
mirrored, it means that you have a byteswapped | |
ROM image to deal with. | |
0002h (1 byte): Is ROM image compressed or not? (RTool standard) | |
12h = Uncompressed | |
13h = Compressed | |
0003h - 0008h (5 bytes): 400000000Fh | |
0008h - 000Ch (1 dword): Game address (also called Entry point) | |
I don't know what this is for, as the | |
Game code always starts at 1000h. | |
000Ch - 000Fh (3 bytes): 000014h | |
000Fh (1 byte): Don't know the meaning of this byte. | |
44h (Darkrift, Fire demo) | |
46h (Waverace64) | |
48h (Bomber64, Duke64, TetPal) | |
0010h - 0014h (1 dword): CRC1 | |
0014h - 0018h (1 dword): CRC2 | |
0018h - 001Fh (8 bytes): 0000000000000000h | |
0020h - 0033h (20 bytes): Image name | |
Padded with 00h or spaces (20h) | |
0034h - 003Ah (7 bytes): 00000000000000h | |
003Bh (1 byte): Manufacturer ID | |
4Eh 'N' = Nintendo | |
003Ch - 003Dh (2 bytes): Cartridge ID | |
003Eh (1 byte): Country code | |
44h 'D' = Germany | |
45h 'E' = USA | |
4Ah 'J' = Japan | |
50h 'P' = Europe | |
55h 'U' = Australia (maybe) | |
003Fh (1 byte): 00h | |
0040h - 0FFFh (1008 dword): Boot code starts here. | |
Pretty much the same code on most of | |
the ROM's, Starfox64 differs. | |
1000h (rest of file): Game code starts here. |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment