MIPS Opcode Reference


Opcode Name Action Fields
Arithmetic Logic Unit
ADD rd,rs,rtAddrd=rs+rt 000000rsrtrd00000100000
ADDI rt,rs,immAdd Immediatert=rs+imm 001000rsrtimm
ADDIU rt,rs,immAdd Immediate Unsignedrt=rs+imm 001001rsrtimm
ADDU rd,rs,rtAdd Unsignedrd=rs+rt 000000rsrtrd00000100001
AND rd,rs,rtAndrd=rs&rt 000000rsrtrd00000100100
ANDI rt,rs,immAnd Immediatert=rs&imm 001100rsrtimm
LUI rt,immLoad Upper Immediatert=imm<<16 001111rsrtimm
NOR rd,rs,rtNorrd=~(rs|rt) 000000rsrtrd00000100111
OR rd,rs,rtOrrd=rs|rt 000000rsrtrd00000100101
ORI rt,rs,immOr Immediatert=rs|imm 001101rsrtimm
SLT rd,rs,rtSet On Less Thanrd=rs<rt 000000rsrtrd00000101010
SLTI rt,rs,immSet On Less Than Immediatert=rs<imm 001010rsrtimm
SLTIU rt,rs,immSet On < Immediate Unsignedrt=rs<imm 001011rsrtimm
SLTU rd,rs,rtSet On Less Than Unsignedrd=rs<rt 000000rsrtrd00000101011
SUB rd,rs,rtSubtractrd=rs-rt 000000rsrtrd00000100010
SUBU rd,rs,rtSubtract Unsignedrd=rs-rt 000000rsrtrd00000100011
XOR rd,rs,rtExclusive Orrd=rs^rt 000000rsrtrd00000100110
XORI rt,rs,immExclusive Or Immediatert=rs^imm 001110rsrtimm
Shifter
SLL rd,rt,saShift Left Logicalrd=rt<<sa 000000rsrtrdsa000000
SLLV rd,rt,rsShift Left Logical Variablerd=rt<<rs 000000rsrtrd00000000100
SRA rd,rt,saShift Right Arithmeticrd=rt>>sa 00000000000rtrdsa000011
SRAV rd,rt,rsShift Right Arithmetic Variablerd=rt>>rs 000000rsrtrd00000000111
SRL rd,rt,saShift Right Logicalrd=rt>>sa 000000rsrtrdsa000010
SRLV rd,rt,rsShift Right Logical Variablerd=rt>>rs 000000rsrtrd00000000110
Multiply
DIV rs,rtDivideHI=rs%rt; LO=rs/rt 000000rsrt0000000000011010
DIVU rs,rtDivide UnsignedHI=rs%rt; LO=rs/rt 000000rsrt0000000000011011
MFHI rdMove From HIrd=HI 0000000000000000rd00000010000
MFLO rdMove From LOrd=LO 0000000000000000rd00000010010
MTHI rsMove To HIHI=rs 000000rs000000000000000010001
MTLO rsMove To LOLO=rs 000000rs000000000000000010011
MULT rs,rtMultiplyHI,LO=rs*rt 000000rsrt0000000000011000
MULTU rs,rtMultiply UnsignedHI,LO=rs*rt 000000rsrt0000000000011001
Branch
BEQ rs,rt,offsetBranch On Equalif(rs==rt) pc+=offset*4 000100rsrtoffset
BGEZ rs,offsetBranch On >= 0if(rs>=0) pc+=offset*4 000001rs00001offset
BGEZAL rs,offsetBranch On >= 0 And Linkr31=pc; if(rs>=0) pc+=offset*4 000001rs10001offset
BGTZ rs,offsetBranch On > 0if(rs>0) pc+=offset*4 000111rs00000offset
BLEZ rs,offsetBranch On if(rs<=0) pc+=offset*4 000110rs00000offset
BLTZ rs,offsetBranch On < 0if(rs<0) pc+=offset*4 000001rs00000offset
BLTZAL rs,offsetBranch On < 0 And Linkr31=pc; if(rs<0) pc+=offset*4 000001rs10000offset
BNE rs,rt,offsetBranch On Not Equalif(rs!=rt) pc+=offset*4 000101rsrtoffset
BREAKBreakpointepc=pc; pc=0x3c 000000code001101
J targetJumppc=pc_upper|(target<<2) 000010target
JAL targetJump And Linkr31=pc; pc=target<<2 000011target
JALR rsJump And Link Registerrd=pc; pc=rs 000000rs00000rd00000001001
JR rsJump Registerpc=rs 000000rs000000000000000001000
MFC0 rt,rdMove From Coprocessorrt=CPR[0,rd] 01000000000rtrd00000000000
MTC0 rt,rdMove To CoprocessorCPR[0,rd]=rt 01000000100rtrd00000000000
SYSCALLSystem Callepc=pc; pc=0x3c 00000000000000000000000000001100
Memory Access
LB rt,offset(rs)Load Bytert=*(char*)(offset+rs) 100000rsrtoffset
LBU rt,offset(rs)Load Byte Unsignedrt=*(Uchar*)(offset+rs) 100100rsrtoffset
LH rt,offset(rs)Load Halfwordrt=*(short*)(offset+rs) 100001rsrtoffset
LHU rt,offset(rs)Load Halfword Unsignedrt=*(Ushort*)(offset+rs) 100101rsrtoffset
LW rt,offset(rs)Load Wordrt=*(int*)(offset+rs) 100011rsrtoffset
SB rt,offset(rs)Store Byte*(char*)(offset+rs)=rt 101000rsrtoffset
SH rt,offset(rs)Store Halfword*(short*)(offset+rs)=rt 101001rsrtoffset
SW rt,offset(rs)Store Word*(int*)(offset+rs)=rt 101011rsrtoffset