The main processor used by the Nintendo 64.
Information on this page that is specifically related to the Nintendo 64 is highlighted in green.
…
…
…
| Command | Definition | Pseudo code | 
|---|---|---|
| AND rd, rs, rt | And | rd = rs & rt | 
| ANDI rt, rs, immediate | And Immediate | rt = rs & immediate | 
| OR rd, rs, rt | Or | rd = rs | rt | 
| ORI rt, rs, immediate | Or Immediate | rt = rs | immediate | 
| XOR rd, rs, rt | Exclusive Or | rd = rs ^ rt | 
| XORI rt, rs, immediate | Exclusive Or Immediate | rd = rs ^ immediate | 
| NOR rd, rs, rt | Nor | rd = ~(rs | rt) | 
| SLT rd, rs, rt | Set On Less Than | rd = (rs < rt) ? 1 : 0 | 
| SLTU rd, rs, rt | Set On Less Than Unsigned | rd = (rs < rt) ? 1 : 0 | 
| SLTI rt, rs, immediate | Set On Less Than Immediate | rt = (rs < immediate) ? 1 : 0 | 
| SLTIU rt, rs, immediate | Set On Less Than Immediate Unsigned | rt = (rs < immediate) ? 1 : 0 | 
| ADD rd, rs, rt | Add | rd = rs + rt | 
| ADDU rd, rs, rt | Add Unsigned | rd = rs + rt | 
| ADDI rt, rs, immediate1) | Add Immediate | rd = rs + immediate | 
| ADDIU rt, rs, immediate | Add Immediate Unsigned | rd = rs + immediate | 
| SUB rd, rs, rt | Subtract | rd = rs - rt | 
| SUBU rd, rs, rt | Subtract Unsigned | rd = rs - rt | 
| MULT rs, rt | Multiply | lo = rs * rt | 
| MULTU rs, rt | Multiply Unsigned | lo = rs * rt | 
| DIV rs, rt | Divide | lo = rs / rt; hi = rs % rt | 
| DIVU rs, rt | Divide Unsigned | lo = rs / rt; hi = rs % rt | 
| SLL rd, rt, sa2) | Shift Left Logical | rd = rt << sa | 
| SLLV rd, rt, rs | Shift Left Logical Variable | rd = rt << rs | 
| SRA rd, rt, sa | Shift Right Arithmetic | rd = (int32)rt >> sa | 
| SRAV rd, rt, rs | Shift Right Arithmetic Variable | rd = (int32)rt >> rs | 
| SRL rd, rt, sa | Shift Right Logical | rd = (uint32)rt >> sa | 
| SRLV rd, rt, rs | Shift Right Logical Variable | rd = (uint32)rt >> rs | 
| DADD rd, rs, rt | Doubleword Add | rd = rs + rt | 
| DADDU rd, rs, rt | Doubleword Add Unsigned | rd = rs + rt | 
| DADDI rt, rs, immediate | Doubleword Add Immediate | rd = rs + immediate | 
| DADDIU rt, rs, immediate | Doubleword Add Immediate Unsigned | rd = rs + immediate | 
| DSUB rd, rs, rt | Doubleword Subtract | rd = rs - rt | 
| DSUBU rd, rs, rt | Doubleword Subtract Unsigned | rd = rs - rt | 
| DMULT rs, rt | Doubleword Multiply | lo = rs * rt | 
| DMULTU rs, rt | Doubleword Multiply Unsigned | lo = rs * rt | 
| DDIV rs, rt | Doubleword Divide | lo = rs / rt; hi = rs % rt | 
| DDIVU rs, rt | Doubleword Divide Unsigned | lo = rs / rt; hi = rs % rt | 
| DSLL rd, rt, sa | Doubleword Shift Left Logical | rd = rt << sa | 
| DSLL32 rd, rt, sa | Doubleword Shift Left Logical + 32 | rd = rt << (sa + 32) | 
| DSLLV rd, rt, rs | Doubleword Shift Left Logical Variable | rd = rt << rs | 
| DSRA rd, rt, sa | Doubleword Shift Right Arithmetic | rd = (int64)rt >> sa | 
| DSRA32 rd, rt, sa | Doubleword Shift Right Arithmetic + 32 | rd = (int64)rt >> (sa + 32) | 
| DSRAV rd, rt, rs | Doubleword Shift Right Arithmetic Variable | rd = (int64)rt >> rs | 
| DSRL rd, rt, sa | Doubleword Shift Right Logical | rd = (uint64)rt >> sa | 
| DSRL32 rd, rt, sa | Doubleword Shift Right Logical + 32 | rd = (uint64)rd >> (sa + 32) | 
| DSRLV rd, rt, rs | Doubleword Shift Right Logical Variable | rd = (uint64)rd >> rs | 
| MFHI rd | Move From HI | rd = hi | 
| MFLO rd | Move From LO | rd = lo | 
| MTHI rs | Move To HI | hi = rs | 
| MTLO rs | Move To LO | lo = rs | 
| LUI rt, immediate | Load Upper Immediate | rt = immediate << 16 | 
| LB rt, offset(rs) | Load Byte | rt = *(int8*)(rs + offset) | 
| LBU rt, offset(rs) | Load Byte Unsigned | rt = *(uint8*)(rs + offset) | 
| LH rt, offset(rs) | Load Halfword | rt = *(int16*)(rs + offset) | 
| LHU rt, offset(rs) | Load Halfword Unsigned | rt = *(uint16*)(rs + offset) | 
| LW rt, offset(rs) | Load Word | rt = *(int32*)(rs + offset) | 
| LWU rt, offset(rs) | Load Word Unsigned | rt = *(uint32*)(rs + offset) | 
| LWC1 ft, offset(rs) | Load Word To FPU3) | ft = *(float*)(rs + offset) | 
| LWL rt, offset(rs) | Load Word Left | |
| LWR rt, offset(rs) | Load Word Right | |
| LD rt, offset(rs) | Load Doubleword | rt = *(uint64*)(rs + offset) | 
| LDC1 ft, offset(rs) | Load Doubleword To FPU | ft = *(double*)(rs + offset) | 
| LDL rt, offset(rs) | Load Doubleword Left | |
| LDR rt, offset(rs) | Load Doubleword Right | |
| LL rt, offset(rs) | Load Linked | |
| LLD rt, offset(rs) | Load Linked Doubleword | |
| SB rt, offset(rs) | Store Byte | *(int8*)(rs + offset) = rt | 
| SH rt, offset(rs) | Store Halfword | *(int16*)(rs + offset) = rt | 
| SW rt, offset(rs) | Store Word | *(int32*)(rs + offset) = rt | 
| SWC1 ft, offset(rs) | Store Word From FPU | *(float*)(rs + offset) = ft | 
| SWL rt, offset(rs) | Store Word Left | |
| SWR rt, offset(rs) | Store Word Right | |
| SD rt, offset(rs) | Store Doubleword | *(int64*)(rs + offset) = rt | 
| SDC1 ft, offset(rs) | Store Doubleword From FPU | *(double*)(rs + offset) = rt | 
| SDL rt, offset(rs) | Store Doubleword Left | |
| SDR rt, offset(rs) | Store Doubleword Right | |
| SC rt, offset(rs) | Store Conditional | |
| SCD rt, offset(rs) | Store Conditional Doubleword | |
| J target | Jump | PC = target | 
| JR rs | Jump Register | PC = rs | 
| JAL target | Jump And Link | RA = PC + 8; PC = target | 
| JALR rs | Jump And Link Register | rd = PC + 8; PC = rs | 
| JALR rd, rs | Jump And Link Register | rd = PC + 8; PC = rs | 
| BEQ rs, rt, target | Branch On Equal | if(rs == rt) PC = target | 
| BEQL rs, rt, target | Branch On Equal Likely | if(rs == rt) PC = target | 
| BNE rs, rt, target | Branch On Not Equal | if(rs != rt) PC = target | 
| BNEL rs, rt, target | Branch On Not Equal Likely | if(rs != rt) PC = target | 
| BGTZ rs, target | Branch On Greater Than Zero | if(rs > 0) PC = target | 
| BGTZL rs, target | Branch On Greater Than Zero Likely | if(rs > 0) PC = target | 
| BLEZ rs, target | Branch On Less Than Or Equal To Zero | if(rs <= 0) PC = target | 
| BLEZL rs, target | Branch On Less Than Or Equal To Zero Likely | if(rs <= 0) PC = target | 
| BGEZ rs, target | Branch On Greater Than Or Equal To Zero | if(rs >= 0) PC = target | 
| BGEZL rs, target |  Branch On Greater Than Or Equal To Zero Likely  | if(rs >= 0) PC = target | 
| BGEZAL rs, target |  Branch On Greater Than Or Equal To Zero And Link  |  if(rs >= 0) { RA = PC + 8; PC = target }  | 
	
| BGEZALL rs, target |  Branch On Greater Than Or Equal To Zero And Link Likely  |  if(rs >= 0) { RA = PC + 8; PC = target }  | 
	
| BLTZ rs, target | Branch On Less Than Zero | if(rs < 0) PC = target | 
| BLTZL rs, target | Branch On Less Than Zero Likely | if(rs < 0) PC = target | 
| BLTZAL rs, target | Branch On Less Than Zero And Link |  if(rs < 0) { RA = PC + 8; PC = target }  | 
	
| BLTZALL rs, target | Branch On Less Than Zero And Link Likely |  if(rs < 0) { RA = PC + 8; PC = target }  | 
	
| MFC1 rt, fs | Move Word From FPU | rt = fs | 
| DMFC1 rt, fs | Doubleword Move From FPU | rt = fs | 
| MTC1 rt, fs | Move To FPU | fs = rt | 
| DMTC1 rt, fs | Doubleword Move To FPU | fs = rt | 
| CFC1 rt, fcr | Move Control Word From FPU | rt = fcr | 
| CTC1 rt, fcr | Move Control Word To FPU | rt = fcr | 
| MOV.S fd, fs | FPU Move Float | fd = fs | 
| ABS.S fd, fs | FPU Absolute Value Float | fd = abs(fs) | 
| NEG.S fd, fs | FPU Negate Float | fd = -fs | 
| SQRT.S fd, fs | FPU Square Root Float | fd = sqrt(fs) | 
| ADD.S fd, fs, ft | FPU Add Floats | fd = fs + ft | 
| SUB.S fd, fs, ft | FPU Subtract Floats | fd = fs - ft | 
| MUL.S fd, fs, ft | FPU Multiply Floats | fd = fs * ft | 
| DIV.S fd, fs, ft | FPU Divide Floats | fd = fs / ft | 
| MOV.D fd, fs | FPU Move Double | fd = fs | 
| ABS.D fd, fs | FPU Absolute Value Double | fd = abs(fs) | 
| NEG.D fd, fs | FPU Negate Double | fd = -fs | 
| SQRT.D fd, fs | FPU Square Root Double | fd = sqrt(fs) | 
| ADD.D fd, fs, ft | FPU Add Doubles | fd = fs + ft | 
| SUB.D fd, fs, ft | FPU Subtract Doubles | fd = fs - ft | 
| MUL.D fd, fs, ft | FPU Multiply Doubles | fd = fs * ft | 
| DIV.D fd, fs, ft | FPU Divide Doubles | fd = fs / ft | 
| FLOOR.L.S fd, fs | FPU Floor Float To Fixed-point Long | fd = (int64)floor(fs) | 
| FLOOR.W.S fd, fs | FPU Floor Float To Fixed-point Word | fd = (int32)floor(fs) | 
| ROUND.L.S fd, fs | FPU Round Float To Fixed-point Long | fd = (int64)round(fs) | 
| ROUND.W.S fd, fs | FPU Round Float To Fixed-point Word | fd = (int32)round(fs) | 
| TRUNC.L.S fd, fs | FPU Truncate Float To Fixed-point Long | fd = (int64)trunc(fs) | 
| TRUNC.W.S fd, fs | FPU Truncate Float To Fixed-point Word | fd = (int32)trunc(fs) | 
| CEIL.L.S fd, fs | FPU Ceiling Float To Fixed-point Long | fd = (int64)ceil(fs) | 
| CEIL.W.S fd, fs | FPU Ceiling Float To Fixed-point Word | fd = (int32)ceil(fs) | 
| FLOOR.L.D fd, fs | FPU Floor Double To Fixed-point Long | fd = (int64)floor(fs) | 
| FLOOR.W.D fd, fs | FPU Floor Double To Fixed-point Word | fd = (int32)floor(fs) | 
| ROUND.L.D fd, fs | FPU Round Double To Fixed-point Long | fd = (int64)round(fs) | 
| ROUND.W.D fd, fs | FPU Round Double To Fixed-point Word | fd = (int32)round(fs) | 
| TRUNC.L.D fd, fs | FPU Truncate Double To Fixed-point Long | fd = (int64)trunc(fs) | 
| TRUNC.W.D fd, fs | FPU Truncate Double To Fixed-point Word | fd = (int32)trunc(fs) | 
| CEIL.L.D fd, fs | FPU Ceiling Double To Fixed-point Long | fd = (int64)ceil(fs) | 
| CEIL.W.D fd, fs | FPU Ceiling Double To Fixed-point Word | fd = (int32)ceil(fs) | 
| CVT.D.S fd, fs | FPU Convert Float To Double | fd = (double)fs | 
| CVT.W.S fd, fs | FPU Convert Float To Fixed-point Word | fd = (int32)fs | 
| CVT.L.S fd, fs | FPU Convert Float To Fixed-Point Long | fd = (int64)fs | 
| CVT.S.D fd, fs | FPU Convert Double To Float | fd = (float)fs | 
| CVT.W.D fd, fs | FPU Convert Double To Fixed-point Word | fd = (int32)fs | 
| CVT.L.D fd, fs | FPU Convert Double To Fixed-Point Long | fd = (int64)fs | 
| CVT.S.W fd, fs | FPU Convert Fixed-Point Word To Float | fd = (float)fs | 
| CVT.S.L fd, fs | FPU Convert Fixed-Point Long To Float | fd = (float)fs | 
| CVT.D.W fd, fs | FPU Convert Fixed-Point Word To Double | fd = (double)fs | 
| CVT.D.L fd, fs | FPU Convert Fixed-Point Long To Double | fd = (double)fs | 
| C.EQ.S fs, ft | FPU Compare Equal Float | FCR31.C = (fs == ft) | 
| C.LT.S fs, ft | FPU Compare Less Than Float | FCR31.C = (fs < ft) | 
| C.LE.S fs, ft | FPU Compare Less Than or Equal Float | FCR31.C = (fs <= ft) | 
| C.EQ.D fs, ft | FPU Compare Equal Double | FCR31.C = (fs == ft) | 
| C.LT.D fs, ft | FPU Compare Less Than Double | FCR31.C = (fs < ft) | 
| C.LE.D fs, ft | FPU Compare Less Than or Equal Double | FCR31.C = (fs <= ft) | 
| C.F.S fs, ft | FPU Compare False Float | FCR31.C = FALSE | 
| C.UN.S fs, ft | FPU Compare Unordered Float | FCR31.C = (isNaN(fs) || isNaN(ft)) | 
| C.UEQ.S fs, ft | FPU Compare Unordered or Equal Float | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs == ft)) | 
| C.OLT.S fs, ft | FPU Compare Ordered Less Than Float | FCR31.C = (!isNaN(fs) && !isNaN(ft) && (fs < ft)) | 
| C.ULT.S fs, ft | FPU Compare Unordered or Less Than Float | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs < ft)) | 
| C.OLE.S fs, ft |  FPU Compare Ordered Less Than Or Equal Float  | FCR31.C = (!isNaN(fs) && !isNaN(ft) && (fs <= ft)) | 
| C.ULE.S fs, ft |  FPU Compare Unordered or Less Than or Equal Float  | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs <= ft)) | 
| C.SF.S fs, ft | FPU Compare Signaling False Float | FCR31.C = FALSE | 
| C.NGLE.S fs, ft |  FPU Compare Not Greater Or Less Than or Equal Float  | FCR31.C = (isNaN(fs) || isNaN(ft)) | 
| C.SEQ.S fs, ft | FPU Compare Signaling Equal Float | FCR31.C = (fs == ft) | 
| C.NGL.S fs, ft | FPU Compare Not Greater Or Less Than Float | FCR31.C = !((fs > ft) || (fs < ft)) | 
| C.NGE.S fs, ft | FPU Compare Not Greater Than or Equal Float | FCR31.C = !(fs >= ft) | 
| C.NGT.S fs, ft | FPU Compare Not Greater Than Float | FCR31.C = !(fs > ft) | 
| C.F.D fs, ft | FPU Compare False Double | FCR31.C = FALSE | 
| C.UN.D fs, ft | FPU Compare Unordered Double | FCR31.C = (isNaN(fs) || isNaN(ft)) | 
| C.UEQ.D fs, ft | FPU Compare Unordered or Equal Double | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs == ft)) | 
| C.OLT.D fs, ft | FPU Compare Ordered Less Than Double | FCR31.C = (!isNaN(fs) && !isNaN(ft) && (fs < ft)) | 
| C.ULT.D fs, ft | FPU Compare Unordered or Less Than Double | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs < ft)) | 
| C.OLE.D fs, ft | FPU Compare Ordered Less Than Or Equal Double | FCR31.C = (!isNaN(fs) && !isNaN(ft) && (fs <= ft)) | 
| C.ULE.D fs, ft |  FPU Compare Unordered or Less Than or Equal Double  | FCR31.C = (isNaN(fs) || isNaN(ft) || (fs <= ft)) | 
| C.SF.D fs, ft | FPU Compare Signaling False Double | FCR31.C = FALSE | 
| C.NGLE.D fs, ft |  FPU Compare Not Greater Or Less Than or Equal Double  | FCR31.C = (isNaN(fs) || isNaN(ft)) | 
| C.SEQ.D fs, ft | FPU Compare Signaling Equal Double | FCR31.C = (fs == ft) | 
| C.NGL.D fs, ft | FPU Compare Not Greater Or Less Than Double | FCR31.C = !((fs > ft) || (fs < ft)) | 
| C.NGE.D fs, ft | FPU Compare Not Greater Than or Equal Double | FCR31.C = !(fs >= ft) | 
| C.NGT.D fs, ft | FPU Compare Not Greater Than Double | FCR31.C = !(fs > ft) | 
| BC1F offset | Branch On FPU False | if(FCR31.C == 0) PC = offset | 
| BC1FL offset | Branch On FPU False Likely | if(FCR31.C == 0) PC = offset | 
| BC1T offset | Branch On FPU True | if(FCR31.C == 1) PC = offset | 
| BC1TL offset | Branch On FPU True Likely | if(FCR31.C == 1) PC = offset | 
| MFC0 rt, rd | Move From Coprocessor 0 | rt = rd | 
| MTC0 rt, rd | Move To Coprocessor 0 | rd = rt | 
| CACHE op, offset(base) | Cache Operation | |
| TEQ rs, rt | Trap If Equal |  if(rs == rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TEQI rs, immediate | Trap If Equal Immediate |  if(rs == immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TGE rs, rt | Trap If Greater Than Or Equal |  if(rs >= rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TGEI rs, immediate | Trap If Greater Than Or Equal Immedate |  if(rs >= immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TGEIU rs, immediate | Trap If Greater Than Or Equal Immediate Unsigned |  if(rs >= immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TGEU rs, rt | Trap If Greater Than Or Equal Unsigned |  if(rs >= rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TLT rs, rt | Trap If Less Than |  if(rs < rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TLTI rs, immediate | Trap If Less Than Immediate |  if(rs < immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TLTIU rs, immediate | Trap If Less Than Immediate Unsigned |  if(rs < immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TLTU rs, rt | Trap If Less Than Unsigned |  if(rs < rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TNE rs, rt | Trap If Not Equal |  if(rs != rt) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| TNEI rs, immediate | Trap If Not Equal Immediate |  if(rs != immediate) { COP0_CAUSE |= (13 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180 }  | 
	
| SYNC | Synchronize | (No operation on R4300) | 
| SYSCALL | System Call |  COP0_CAUSE |= (8 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180  | 
	
| BREAK | Breakpoint |  COP0_CAUSE |= (9 << 2); COP0_EPC = PC; PC = exc_vector_base + 0x180  | 
	
| ERET | Return From Exception |  PC = COP0_EPC (or COP0_ERROREPC) LLBit = 0  | 
	
| TLBP | Probe TLB For Matching Entry | |
| TLBR | Read Indexed TLB Entry | |
| TLBWI | Write Indexed TLB Entry | |
| TLBWR | Write Random TLB Entry | 
| Number | Name | Preserved | Purpose | 
|---|---|---|---|
| 0 | R0 | n/a | Hardwired zero | 
| 1 | AT | no | Assembler temporary value | 
| 2:3 | V0:V1 | no | Subroutine return value | 
| 4:7 | A0:A3 | no | Subroutine arguments | 
| 8:15 | T0:T7 | no | Temporary values | 
| 16:23 | S0:S7 | yes | Saved values | 
| 24:25 | T8:T9 | no | Temporary values | 
| 26:27 | K0:K1 | n/a | Reserved by the kernel | 
| 28 | GP | yes | Global pointer | 
| 29 | SP | yes | Stack pointer | 
| 30 | S8 or FP | yes | Saved value or frame pointer | 
| 31 | RA | yes | Return address | 
| Number | Name | Preserved | Purpose | 
|---|---|---|---|
| 0:2 | F0:F2 | no | Subroutine return value | 
| 4:10 | F4:F10 | no | Temporary values | 
| 12:14 | F12:F14 | no | Subroutine arguments | 
| 16:18 | F16:F18 | no | Temporary values | 
| 20:30 | F20:F30 | yes | Saved values | 
| 25|24|23| 18|17|16|15|14|13|12|11|10| 9| 8| 7| 6| 5| 4| 3| 2| 0| |0000000| .| .|00000| .| .| .| .| .| .| .| .| .| .| .| .| .| .| .| .|..| |-------|FS|C |-----|CE|CV|CZ|CO|CU|CI|EV|EZ|EO|EU|EI|FV|FZ|FO|FU|FI|RM| | 7 |1 |1 | 5 | 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1| 1|2 |
| Field | Description | 
|---|---|
| FS |  Enables flashing of denormalized numbers  (See Page 213 of the manual)  | 
	
| C |  Compare bit (1: TRUE, 0: FALSE) Result of the last compare (C.COND.FMT) operation  | 
	
| CE | Cause bit: Unimplemented operation | 
| CV | Cause bit: Invalid operation | 
| CZ | Cause bit: Division by Zero | 
| CO | Cause bit: Overflow | 
| CU | Cause bit: Underflow | 
| CI | Cause bit: Inexact operation | 
| EV | Enable bit: Invalid operation | 
| EZ | Enable bit: Division by Zero | 
| EO | Enable bit: Overflow | 
| EU | Enable bit: Underflow | 
| EI | Enable bit: Inexact operation | 
| FV | Flag bit: Invalid operation | 
| FZ | Flag bit: Division by Zero | 
| FO | Flag bit: Overflow | 
| FU | Flag bit: Underflow | 
| FI | Flag bit: Inexact operation | 
| RM | Rounding Mode | 
| Value | Mnemonic | Description | 
|---|---|---|
| 0 | RN | Round to nearest representable value | 
| 1 | RZ | Round towards zero | 
| 2 | RP | Round towards positive infinity | 
| 3 | RM | Round towards negative infinity | 
| 31| 30| 29| 28|27|26|25| 24|23| 22|21|20|19|18|17|16| 8| 7| 6| 5| 4| 2| 1| 0| | .| .| .| .| .| .| .| .| 0| .| .| .| .| .| 0| 1|........| .| .| .| ..| .| .| .| |CU3|CU2|CU1|CU0|RP|FR|RE|ITS| -|BEV|TS|SR| -|CH|CE|DE| IM |KX|SX|UX|KSU|ERL|EXL|IE| | 1 | 1 | 1 | 1 |1 |1 |1 |1 | 1|1 |1 |1 | 1|1 |1 |1 | 8 |1 |1 |1 |2 |1 |1 |1 |
| Field | Description | 
|---|---|
| CU3 | (Reserved) | 
| CU2 | (Reserved) | 
| CU1 | Coprocessor 1 (FPU) Usability (1: Usable, 0: Unusable) | 
| CU0 | Coprocessor 0 Usability (1: Usable, 0: Unusable) COP0 is always usable while in kernel mode, regardless of setting  | 
	
| RP | Reduce Power (0: Normal, 1: Low Power Mode) Clock frequency is reduced to one-quarter speed when enabled  | 
	
| FR | Additional floating point registers (0: 16 registers, 1: 32 registers) | 
| RE | Reverse Endian in User mode (0: Disabled, 1: Reversed) | 
| ITS | Enable instruction trace support (0: False, 1: True) | 
| BEV | Bootstrap exception vector (0: Normal, 1: Bootstrap) Controls Exception Vector locations  | 
	
| TS | TLB shutdown has occurred (0: False, 1: True) On R4300i, the TLB does not shutdown and the processor will continue execution, but the TS bit is still set.  | 
	
| SR | Soft reset or NMI has occurred (0: False, 1: True) | 
| CH | CP0 Condition bit (0: False, 1: True) | 
| CE | (Unused on R4300i) | 
| DE | (Unused on R4300i) | 
| IM | Interrupt Mask (0: Disabled, 1: Enabled) | 
| KX | Enable 64-bit addressing in Kernel mode (0: Disabled, 1: Enabled) | 
| SX | Enable 64-bit addressing and operations in Supervisor mode (0: Disabled, 1: Enabled) | 
| UX | Enable 64-bit addressing and operations in User mode (0: Disabled, 1: Enabled) | 
| KSU | Mode (10: User, 01: Supervisor, 00: Kernel) | 
| ERL | Error level (0: Normal, 1: Error) | 
| EXL | Exception level (0: Normal, 1: Exception) | 
| IE | Global interrupt enable (0: Disabled, 1: Enabled) | 
| Exception | Base (BEV=0) | Base (BEV=1) | Offset | 
|---|---|---|---|
| Reset & NMI | n/a | 0xBFC000000 | 0x000 | 
| TLB Miss | 0x80000000 | 0xBFC000200 | 0x000 | 
| XTLB Miss | 0x80000000 | 0xBFC000200 | 0x080 | 
| Other | 0x80000000 | 0xBFC000200 | 0x180 | 
|31|30|28| 16| 8|7| 2| 0| | .| 0|..|............|........|0|.....|00| |BD| -|CE|------------| IP |-| EXC |--| |1 |1 |2 | 12 | 8 |1| 5 |2 |
| Field | Description | 
|---|---|
| BD | Branch delay (1: Last exception occurred in delay slot, 0: Normal) | 
| CE | Coprocessor number for coprocessor unusable exception | 
| IP | Interrupt pending (1: Interrupt, 0: No Interrupt) IP7 Timer interrupt IP6:2 External normal interrupts IP1:0 Software interrupt  | 
	
| EXC | Exception code | 
| Code | Mnemonic | Description | Generated… | 
|---|---|---|---|
| 0 | Int | Interrupt | - When one of the eight interrupt conditions are asserted | 
| 1 | Mod | TLB Modification exception | - When the TLB entry that matches the the virtual address referenced by the store instruction is marked as read-only (the D bit = 0) | 
| 2 | TLBL | TLB Invalid exception (load or instruction fetch) | - When an attempt is made to read from an mapped area in a TLB segment that is marked invalid | 
| 3 | TLBS | TLB Invalid exception (store) | - When an attempt is made to write to a mapped area in a TLB segment that is marked invalid | 
| 2 | TLBL | TLB Miss exception (load or instruction fetch) | - When an attempt is made to read from an unmapped area in a TLB segment (Uses special TLB miss exception vector) | 
| 3 | TLBS | TLB Miss exception (store) | - When an attempt is made to write to an unmapped area in a TLB segment (Uses special TLB miss exception vector) | 
| 4 | AdEL | Address Error exception (load or instruction fetch) | - When an attempt is made to read from an address whose boundary alignment is incompatible with the instruction - When an attempt is made to read from an address that is not accessible in the current operating mode  | 
	
| 5 | AdES | Address Error exception (store) | - When an attempt is made to write to an address whose boundary alignment is incompatible with the opcode - When an attempt is made to write to an address that is not accessible in the current operating mode  | 
	
| 6 | IBE | Bus Error exception (instruction fetch) | |
| 7 | DBE | Bus Error exception (data reference: load or store) | |
| 8 | Sys | Syscall exception | - When a SYSCALL instruction is executed | 
| 9 | Bp | Breakpoint exception | - When a BREAK instruction is executed | 
| 10 | RI | Reserved instruction exception | - When an attempt is made to execute a reserved/nonexistant command | 
| 11 | CpU | Coprocessor unusable exception | - When an attempt is made to use a coprocessor instruction and the corresponding coprocessor is marked unusable (Status CU bit = 0) - When an attempt is made to use a COP0 instruction while operating in user or supervisor mode  | 
	
| 12 | Ov | Arithmetic overflow exception | - When an ADD, ADDI, SUB, DADD, DADDI or DSUB instruction results in a 2's complement overflow | 
| 13 | Tr | Trap exception | - When a trap instruction results in a TRUE condition | 
| 14 | - | (Reserved) | |
| 15 | FPE | Floating-point exception | (Generated by the floating-point coprocessor (COP1); contents of the Floating-Point Control/Status register (FCSR31) indicate the cause of the exception) | 
| 16:22 | - | (Reserved) | |
| 23 | WATCH | Watch exception | - When a load/store instruction references the address specified in the WatchLo/WatchHi registers | 
| 24:31 | - | (Reserved) | |
| Cause bit | Source | 
|---|---|
| IP0 | Set by software | 
| IP1 | Set by software | 
| IP2 | Int0 pin (N64: RCP) | 
| IP3 | Int1 pin (N64: Cartridge) | 
| IP4 | Int2 pin (N64: Pre-NMI (Reset button)) | 
| IP5 | Int3 pin (N64: RDB Read) | 
| IP6 | Int4 pin (N64: RDB Write) | 
| IP7 | Timer interrupt | 
On the Nintendo 64, IP2 represents an RCP (Reality Coprocessor) interrupt. When an RCP interrupt occurs, a flag representing the specific RCP interface may be read from MI_INTR_REG (0x04300008).
| Bit | Name | Description | 
|---|---|---|
| 0x01 | MI_INTR_SP | Signal Processor - Task Done/Task Yield | 
| 0x02 | MI_INTR_SI | Serial Interface - Controller input available | 
| 0x04 | MI_INTR_AI | Audio Interface - Audio buffer swap | 
| 0x08 | MI_INTR_VI | Video Interface - Vertical retrace | 
| 0x10 | MI_INTR_PI | Peripheral Interface - ROM to RAM DMA done | 
| 0x20 | MI_INTR_DP | Display Processor - RDP processing done (gDPFullSync) | 
RCP-specific interrupts may be enabled or disabled by writing one or more of the following values to MI_INTR_MASK_REG (0x0430000C).
| Bit | Name | Description | 
|---|---|---|
| 0x0001 | MI_INTR_MASK_CLR_SP | Disable SP interrupts | 
| 0x0002 | MI_INTR_MASK_SET_SP | Enable SP interrupts | 
| 0x0004 | MI_INTR_MASK_CLR_SI | Disable SI interrupts | 
| 0x0008 | MI_INTR_MASK_SET_SI | Enable SI interrupts | 
| 0x0010 | MI_INTR_MASK_CLR_AI | Disable AI interrupts | 
| 0x0020 | MI_INTR_MASK_SET_AI | Enable AI interrupts | 
| 0x0040 | MI_INTR_MASK_CLR_VI | Disable VI interrupts | 
| 0x0080 | MI_INTR_MASK_SET_VI | Enable VI interrupts | 
| 0x0100 | MI_INTR_MASK_CLR_PI | Disable PI interrupts | 
| 0x0200 | MI_INTR_MASK_SET_PI | Enable PI interrupts | 
| 0x0400 | MI_INTR_MASK_CLR_DP | Disable DP interrupts | 
| 0x0800 | MI_INTR_MASK_SET_DP | Enable DP interrupts | 
| Virtual address range | Segment | Description | 
|---|---|---|
| 00000000:7FFFFFFF | useg |  TLB mapped to physical memory Accessible in all operating modes  | 
	
| 80000000:9FFFFFFF | kseg0 |  Cached, translated to physical address by subtracting 80000000 Accessible in kernel mode  | 
	
| A0000000:BFFFFFFF | kseg1 |  Uncached, translated to physical address by subtracting A0000000 Accessible in kernel mode  | 
	
| C0000000:DFFFFFFF | sseg |  TLB mapped to physical memory Accessible in kernel and supervisor mode  | 
	
| E0000000:FFFFFFFF | kseg3 |  TLB mapped to physical memory Accessible in kernel mode  | 
	
Note: Commercial Nintendo 64 games operate in kernel mode at all times.