| Instruction | Syntax | Opcode | Operation | Description |
| arithmetic and logical | ||||
| add | add $d, $s, $t | 100000 | $d = $s + $t | Add with overflow |
| addu | addu $d, $s, $t | 100001 | $d = $s + $t | Add unsigned |
| addi | addi $d, $s, i | 001000 | $d = $s + se(i) | Add immediate |
| addiu | addiu $d, $s, i | 001001 | $d = $s + se(i) | Add immediate unsigned |
| and | and $d, $s, $t | 100100 | $d = $s & $t | Bitwise logical AND |
| andi | andi $d, $s, i | 001100 | $d = $s & ze(i) | Bitwise logical AND imm |
| div | div $s, $t | 011010 | lo = $s/$t; hi=$s%$t | Divide |
| divu | divu $s, $t | 011011 | lo = $s/$t; hi=$s%$t | Divide unsigned |
| mult | mult $s, $t | 011000 | hi:lo = $s * $t | Multiply |
| multu | multu $s, $t | 011001 | hi:lo = $s * $t | Multiply unsigned |
| nor | nor $d, $s, $t | 100111 | $d = ~($s | $t) | Bitwise logical NOR |
| or | or $d, $s, $t | 100101 | $d = $s | $t | Bitwise logical OR |
| ori | ori $d, $s, i | 001101 | $t = $s | ze(i) | Bitwise logical OR imm |
| sll | sll $d, $t, a | 000000 | $d = $t << a | Shift left logical, a bits |
| sllv | sllv $d, $t, $s | 000100 | $d = $t << $s | Shift left logical, $s bits |
| sra | sra $d, $t, a | 000011 | $d = $t >> a | Shift right arithmetic, a bits |
| srav | srav $d, $t, $s | 000111 | $d = $t >> $s | Shift right arithmetic, $s bits |
| srl | srl $d, $t, a | 000010 | $d = $t >> a | Shift right logical, a bits |
| srlv | srlv $d, $t, $s | 000110 | $d = $t >> $s | Shift right logical, $s bits |
| sub | sub $d, $s, $t | 100010 | $d = $s - $t | Subtract |
| subu | subu $d, $s, $t | 100011 | $d = $s - $t | Subtract unsigned |
| xor | xor $d, $s, $t | 100110 | $d = $s ^ $t | Exclusive OR |
| xori | xori $d, $s, i | 001110 | $d = $s ^ ze(i) | Exclusive OR immediate |
| set register, on comparison | ||||
| slt | slt $d, $s, $t | 101010 | $d = ($s < $t) | Set on less than |
| sltu | sltu $d, $s, $t | 101001 | $d = ($s < $t) | Set on less than, unsigned |
| slti | slti $d, $s, i | 001010 | $t = ($s < se(i)) | Set on less than, immediate |
| sltiu | sltiu $d, $s, i | 001001 | $t = ($s < se(i)) | Set on less than, both |
| branching | ||||
| beq | beq $s, $t, label | 000100 | if ($s==$t) pc+=i<<2 | Branch if equal |
| bgtz | bgtz $s, label | 000111 | if ($s>0) pc+=i<<2 | Branch if > zero |
| blez | blez $s, label | 000110 | if ($s<=0) pc+=i<<2 | Branch if <= zero |
| bne | bne $s, $t, label | 000101 | if ($s!=$t) pc+=i<<2 | Branch if not equal |
| jump to | ||||
| j | j label | 000010 | pc += i << 2 | Jump |
| jal | jal label | 000011 | $31 = pc; pc+=i<<2 | Jump and link |
| jalr | jalr labelR | 001001 | $31 = pc; pc = $s | Jump and link, register |
| jr | jr labelR | 001000 | pc = $s | Jump to address in register |
| load from memory (right to left) | ||||
| lb | lb $t, i ($s) | 100000 | $t=se (mem[$s+i]:1) | Load byte |
| lbu | lbu $t, i ($s) | 100100 | $t=ze (mem[$s+i]:1) | Load byte unsigned |
| lh | lh $t, i ($s) | 100001 | $t=se (mem[$s+i]:2) | Load halfword |
| lhu | lhu $t, i ($s) | 100101 | $t=ze (mem[$s+i]:2) | Load halfword unsigned |
| lw | lw $t, i ($s) | 100011 | $t= i mem[$s+i]:4 | Load word |
| lui | lui $t, i | 100011 | $t = i<<16 | Load i into upper halfword |
| store to memory (left to right) | ||||
| sb | sb $t, i ($s) | 101000 | mem[$s+i]:1=LB($t) | Store byte |
| sh | sh $t, i ($s) | 101001 | mem[$s+i]:2=LH($t) | Store halfword |
| sw | sw $t, i ($s) | 101011 | mem[$s+i]:4=$t | Store word |
| load hi or low results | ||||
| mfhi | mfhi $d | 010000 | $d = hi | Move from high |
| mflo | mflo $d | 010010 | $d = lo | Move from low |
| mthi | mthi $s | 010001 | hi = $s | Move to hi |
| mtlo | mtlo $s | 010011 | lo = $s | Move to low |
| exception and interrupt | ||||
| trap | trap i | 011010 | OS dependent | |
Notes: se: SignExtImm = 16 copies of sign bit [15] + imm16 ze: ZeroExtImm = zeros16 + imm16 Branch Address = 14 copies of sign bit + addr16 + zeros2 Jump Address = Copy of top 4 bits of PC + jumpAddr26 + zeros2
Note:
The instructions below are macro-instructions. Each of the following instructions
is made up of one or more of the core MIPS instructions above.
| inst | syntax | description | clocks |
| abs | abs Rd, Rs | Absolute Value: | 3/3 |
| beqz | beqz Rs, Label | Branch if Equal to Zero: | 1/1 |
| bge | bge Rs, Rt, Label | Branch if Greater Than or Equal : | 2/2 |
| bgeu | bgeu Rs, Rt, Label | Branch if Greater Than or Equal Unsigned: | 2/2 |
| bgt | bgt Rs, Rt, Label | Branch if Greater Than: | 2/2 |
| bgtu | bgtu Rs, Rt, Label | Branch if Greater Than Unsigned: | 2/2 |
| ble | ble Rs, Rt, Label | Branch if Less Than or Equal: | 2/2 |
| bleu | bleu Rs, Rt, Label | Branch if Less Than or Equal Unsigned: | 2/2 |
| blt | blt Rs, Rt, Label | Branch if Less Than: | 2/2 |
| bltu | bltu Rs, Rt, Label | Branch if Less Than Unsigned: | 2/2 |
| bnez | bnez Rs, Label | Branch if Not Equal to Zero: | 1/1 |
| b | b Label | Branch Unconditional: | 1/1 |
| div | div Rd, Rs, Rt | Divide: | 4/41 |
| divu | divu Rd, Rs, Rt | Divide Unsigned: | 4/41 |
| la | la Rd, Label | Load Address: | 2/2 |
| li | li Rd, value | Load Immediate: | 2/2 |
| move | move Rd, Rs | Move: | 1/1 |
| mul | mul Rd, Rs, Rt | Multiply: | 2/33 |
| mulo | mulo Rd, Rs, Rt | Multiply (with overflow exception): | 7/37 |
| mulou | mulou Rd, Rs, Rt | Multiply Unsigned (with overflow exception): | 5/35 |
| neg | neg Rd, Rs | Negate: | 1/1 |
| negu | negu Rd, Rs | Negate Unsigned: | 1/1 |
| nop | nop | No operation: | 1/1 |
| not | not Rd, Rs | Not: | 1/1 |
| remu | remu Rd, Rs, Rt | Remainder Unsigned: | 4/40 |
| rol | rol Rd, Rs, Rt | Rotate Left Variable: | 4/4 |
| ror | ror Rd, Rs, Rt | Rotate Right Variable: | 4/4 |
| rem | rem Rd, Rs, Rt | Remainder: | 4/40 |
| rol | rol Rd, Rs, sa | Rotate Left Constant: | 3/3 |
| ror | ror Rd, Rs, sa | Rotate Right Constant: | 3/3 |
| seq | seq Rd, Rs, Rt | Set if Equal: | 4/4 |
| sge | sge Rd, Rs, Rt | Set if Greater Than or Equal: | 4/4 |
| sgeu | sgeu Rd, Rs, Rt | Set if Greater Than or Equal Unsigned: | 4/4 |
| sgt | sgt Rd, Rs, Rt | Set if Greater Than: | 1/1 |
| sgtu | sgtu Rd, Rs, Rt | Set if Greater Than Unsigned: | 1/1 |
| sle | sle Rd, Rs, Rt | Set if Less Than or Equal: | 4/4 |
| sleu | sleu Rd, Rs, Rt | Set if Less Than or Equal Unsigned: | 4/4 |
| sne | sne Rd, Rs, Rt | Set if Not Equal: | 4/4 |
| ulh | ulh Rd, n(Rs) | Unaligned Load Halfword Unsigned: | 4/4 |
| ulhu | ulhu Rd, n(Rs) | Unaligned Load Halfword: | 4/4 |
| ulw | ulw Rd, n(Rs) | Unaligned Load Word: | 2/2 |
| ush | ush Rd, n(Rs) | Unaligned Store Halfword: | 3/3 |
| usw | usw Rd, n(Rs) | Unaligned Store Word: | 2/2 |
Here is a program named all.s that tries every command above.