명령어 집합 | |
CISC | AMD64●x86● · M68K · 68xx · Z80 · 8080 · MOS 65xx · VAX |
RISC | AArch64 ARM · RISC-V● · MIPS● · DEC Alpha · POWER PowerPC · CELL-BE LoongArch · OpenRISC · PA-RISC · SPARC · Blackfin · SuperH · AVR32 AVR |
VLIW EPIC | E2K · IA-64 · Crusoe |
[clearfix]
1. 개요
MIPS 아키텍처의 명령어 목록. 최신 버전인 Release 6 기준으로 서술하고, 구버전에 대한 사항은 각주나 표의 '비고'란 또는 별도의 하위 문단에 서술한다.1.1. 약어 설명
- rd: destination register. 값을 기록할 레지스터
- rt: target register. R-type 명령어의 경우 값을 읽는 데 사용하고 I-type 명령어의 경우 값을 기록하는 데 사용한다.
- rs: source register. 값을 읽고자 하는 레지스터
- sa/shamt: shift amount.
- imm: 명령어에 인코딩되어 있는 상수(immediate)
1.2. 표기법
1.3. 명령어 인코딩
종류 | 31:26 | 25:21 | 20:16 | 15:11 | 10:6 | 5:0 |
R-Type | opcode | rs | rt | rd | sa | function |
I-Type | opcode | rs | rt | immediate | ||
opcode | base | rt | offset | |||
J-Type | opcode | address |
아래는 Release 6에서 추가된 인코딩이다
종류 | 31:26 | 25:21 | 20:16 | 15:11 | 10:6 | 5:0 |
1.3.1. Opcode Map (MIPS32, Release 6)
- 명령어 인코딩
- 기호 설명
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | [28:26] / [31:29] |
SPECIAL[δ] | REGIMM[δ] | J[J] | JAL[J] | BEQ[I] | BNE[I] | BLEZ[I] POP06[δ][6N] | BGTZ[I] POP07[δ][6N] | 000 |
POP10[δ][6N] | ADDIU[I] | SLTI[I] | SLTIU[I] | ANDI[I] | ORI[I] | XORI[I] | LUI[I][35] AUI[I][6N] | 001 |
COP0[δ] | COP1[δ] | COP2[δ][θ] | | 010 | ||||
[β] | [β] | [β] | 011 | |||||
LB[I] | LH[I] | | LW[I] | LBU[I] | LHU[I] | | [β] | 100 |
SB[I] | SH[I] | | SW[I] | [β] | [β] | | | 101 |
| LWC1 | [β] | LDC1 | [β] | 110 | |||
| SWC1 | [β] | SDC1 | [β] | 111 |
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | [2:0] / [5:3] |
SLL[R] | SRL[R][δ] | SRA[R] | SLLV[R] | SRLV[R][δ] | SRAV[R] | 000 | ||
| JALR[R] | SYSCALL | BREAK | SYNC | 001 | |||
[β] | [β] | [β] | [β] | 010 | ||||
[β] | [β] | [β] | [β] | 011 | ||||
ADD[R] | ADDU[R] | SUB[R] | SUBU[R] | AND | OR | XOR | NOR | 100 |
[*] | [*] | SLT[R] | SLTU[R] | [β] | [β] | [β] | [β] | 101 |
TGE | TGEU | TLT | TLTU | TEQ | TNE | 110 | ||
[β] | [*] | [β] | [β] | [β] | [*] | [β] | [β] | 111 |
000 | 001 | 010 | 011 | 100 | 101 | 110 | 111 | [18:16] / [20:19] |
00 | ||||||||
01 | ||||||||
10 | ||||||||
11 |
[R] R-Type[I] I-Type[J] J-Type[β] 예약됨[*] [δ] 추가 필드 사용[θ] [6N] [6Nm] [6R] [6Rm] [δ] [δ] [J] [J] [I] [I] [I] [δ] [6N] [I] [δ] [6N] [I] [6R] [δ] [6N] [I] [I] [I] [I] [I] [I] [I] [35] Release 6에서 추가된 AUI의 특수한 경우이다. (rs=0)[I] [6N] [δ] [δ] [δ] [θ] [δ] [δ] [6R] [β] [β] [β] [I] [I] [I] [6R] [I] [I] [I] [I] [6R] [β] [I] [I] [I] [6R] [I] [β] [β] [I] [6R] [6Rm] [6Rm] [β] [β] [6Rm] [β] [β] [R] [R] [δ] [R] [R] [R] [δ] [R] [R] [6R] [84] JALR (rd=0)으로 대체 가능하기 때문에 제거[R] [β] [β] [β] [β] [β] [β] [β] [β] [R] [R] [R] [R] [*] [*] [R] [R] [β] [β] [β] [β] [β] [*] [β] [β] [β] [*] [β] [β]
1.3.2. Opcode Map (MIPS64)
1.4. 레지스터
1.4.1. CPU 레지스터
MIPS32 ISA에서는 32비트 레지스터 32개 및 PC(program counter)를 정의한다. 단, 레지스터 r0은 상수 0으로 해당 레지스터에 대한 쓰기는 무시된다.1.4.1.1. 범용 레지스터
레지스터 | r0 | r1 | r2 | r3 | r4 | r5 | r6 | r7 |
ABI 이름 | zero | at | v0 | v1 | a0 | a1 | a2 | a3 |
레지스터 | r8 | r9 | r10 | r11 | r12 | r13 | r14 | r15 |
ABI 이름 | t0 | t1 | t2 | t3 | t4 | t5 | t6 | t7 |
레지스터 | r16 | r17 | r18 | r19 | r20 | r21 | r22 | r23 |
ABI 이름 | s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7 |
레지스터 | r24 | r25 | r26 | r27 | r28 | r29 | r30 | r31 |
ABI 이름 | t8 | t9 | k0 | k1 | gp | sp | fp | ra |
1.4.1.2. 특수 레지스터
- PC: Program Counter(32-bit), 명령어의 주소를 가리키는 레지스터이다.
- (Release 6 이전 레지스터)[114]
- HI: 곱셈 연산의 결과 중 높은 자릿수 부분 또는 나눗셈 결과의 나머지 등을 저장하는 레지스터이다.
- LO: 곱셈 연산의 결과 중 낮은 자릿수 부분 또는 나눗셈 결과의 몫 등을 저장하는 레지스터이다.
[114] Release 6에서 곱셈 및 나눗셈 연산 관련 명령어를 변경하며 삭제되었다.
1.4.2. CP0 레지스터 (제어 레지스터)
MIPS32 ISA에서는 시스템의 제어를 보조프로세서 0에서 담당한다.1.4.3. CP1 레지스터 (부동소수점 레지스터)
MIPS32 ISA에서는 부동소수점 연산을 보조프로세서 1에서 담당한다.1.4.3.1. 범용 레지스터
MIPS32 ISA에서는 32비트 또는 64비트 레지스터 32개를 정의한다.1.4.3.2. 특수 레지스터
MIPS32 ISA에서는 32비트 FCR을 정의한다.2. 명령어 목록
2.1. CPU Load/Store 명령어
명령어 | mnemonic | 인코딩 | opcode | 추가 시점 | 비고 | |
[31:29] | [28:26] | |||||
Register + Offset | ||||||
LB | LB rt, offset(base) | I-type | 100 | 000 | ||
LH | LH rt, offset(base) | I-type | 100 | 001 | ||
LW | LW rt, offset(base) | I-type | 100 | 011 | ||
LBU | LBU rt, offset(base) | I-type | 100 | 100 | ||
LHU | LHU rt, offset(base) | I-type | 100 | 101 | ||
LWL rt, offset(base) | | 100 | 010 | Release 6에서 삭제 | ||
LWR rt, offset(base) | | 100 | 110 | Release 6에서 삭제 | ||
SB | SB rt, offset(base) | I-type | 100 | 000 | ||
SH | SH rt, offset(base) | I-type | 100 | 001 | ||
SW | SW rt, offset(base) | I-type | 100 | 011 | ||
SWL rt, offset(base) | | 100 | 010 | Release 6에서 삭제 | ||
SWR rt, offset(base) | | 100 | 110 | Release 6에서 삭제 | ||
PC-Relative | ||||||
LWPC | LWPC rs, offset | PCREL | 111 | 011 | Release 6 | [20:19] = 01 |
Atomic | ||||||
LL | LL rt, offset(base) | | 110 | 000 | Release 6에서 인코딩 변경 | |
SPECIAL3 | 011 | 111 | Release 6 | [15:7] = offset(9), [6] = 0, [5:0] = 110110(LL) | ||
SC | SC rt, offset(base) | | 111 | 000 | Release 6에서 인코딩 변경 | |
SPECIAL3 | 011 | 111 | Release 6 | [15:7] = offset(9), [6] = 0, [5:0] = 100110(SC) |
2.2. 연산 명령어
명령어 | mnemonic | 인코딩 | opcode | function | 추가 시점 | 비고 | |
[31:29] | [28:26] | ||||||
Register - Register | |||||||
ADD | ADD rd, rs, rt | R-type | 000 | 000 | 100000 | ||
ADDU | ADDU rd, rs, rt | R-type | 000 | 000 | 100001 | ||
SUB | SUB rd, rs, rt | R-type | 000 | 000 | 100010 | ||
SUBU | SUBU rd, rs, rt | R-type | 000 | 000 | 100011 | ||
AND | AND rd, rs, rt | R-type | 000 | 000 | 100100 | ||
OR | OR rd, rs, rt | R-type | 000 | 000 | 100101 | ||
XOR | XOR rd, rs, rt | R-type | 000 | 000 | 100110 | ||
NOR | NOR rd, rs, rt | R-type | 000 | 000 | 100111 | ||
SLT | SLT rd, rs, rt | R-type | 000 | 000 | 101010 | ||
SLTU | SLTU rd, rs, rt | R-type | 000 | 000 | 101011 | ||
SLLV | SLLV rd, rt, rs | R-type | 000 | 000 | 000100 | ||
SRLV | SRLV rd, rt, rs | R-type | 000 | 000 | 000110 | sa = 0으로 인코딩 | |
SRAV | SRAV rd, rt, rs | R-type | 000 | 000 | 000111 | ||
ROTRV | ROTRV rd, rt, rs | R-type | 000 | 000 | 000110 | Release 2 | sa = 1으로 인코딩 |
MULT rs, rt | | 000 | 000 | 011000 | Release 6에서 삭제 | ||
MUL | MUL rd, rs, rt | R-type | 000 | 000 | 011000 | Release 6 | sa = 2로 인코딩 |
MUH | MUH rd, rs, rt | R-type | 000 | 000 | 011000 | Release 6 | sa = 3으로 인코딩 |
MULTU rs, rt | | 000 | 000 | 011001 | Release 6에서 삭제 | ||
MULU | MULU rd, rs, rt | R-type | 000 | 000 | 011001 | Release 6 | sa = 2로 인코딩 |
MUHU | MUHU rd, rs, rt | R-type | 000 | 000 | 011001 | Release 6 | sa = 3으로 인코딩 |
Register - Immediate | |||||||
ADDI rt, rs, immediate | | 001 | 000 | - | Release 6에서 삭제, ADDIU로 대체 | ||
ADDIU | ADDIU rt, rs, immediate | I-type | 001 | 001 | - | ||
SLTI | SLTI rt, rs, immediate | I-type | 001 | 010 | - | ||
SLTIU | SLTIU rt, rs, immediate | I-type | 001 | 011 | - | ||
ANDI | ADDIU rt, rs, immediate | I-type | 001 | 100 | - | ||
ORI | ADDIU rt, rs, immediate | I-type | 001 | 101 | - | ||
XORI | ADDIU rt, rs, immediate | I-type | 001 | 110 | - | ||
LUI / AUI[6N] | ADDIU rt, rs, immediate | I-type | 001 | 111 | - |