최근 수정 시각 : 2024-03-11 20:11:16

MIPS(ISA)/명령어 목록


명령어 집합
CISC AMD64x86 · 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

1. 개요
1.1. 약어 설명1.2. 표기법1.3. 명령어 인코딩
1.3.1. Opcode Map (MIPS32, Release 6)1.3.2. Opcode Map (MIPS64)
1.4. 레지스터
1.4.1. CPU 레지스터
1.4.1.1. 범용 레지스터1.4.1.2. 특수 레지스터
1.4.2. CP0 레지스터 (제어 레지스터)1.4.3. CP1 레지스터 (부동소수점 레지스터)
1.4.3.1. 범용 레지스터1.4.3.2. 특수 레지스터
2. 명령어 목록
2.1. CPU Load/Store 명령어2.2. 연산 명령어2.3. Jump/Branch 명령어2.4. 기타 명령어2.5. FPU 명령어

[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
사용되지 않는 필드는 특별한 언급이 없는 한 0으로 둔다.

아래는 Release 6에서 추가된 인코딩이다
종류 31:26 25:21 20:16 15:11 10:6 5:0

1.3.1. Opcode Map (MIPS32, Release 6)

  • 명령어 인코딩
    • [R] R-Type 명령어
    • [I] I-Type 명령어
    • [J] J-Type 명령어
  • 기호 설명
    • [β], [*] 예약된 인코딩
    • [δ] 명령어 디코딩에 추가적인 필드를 사용함
    • [θ] MIPS 파트너에게 라이센스 가능한 코드 (커스텀 명령어)
    • [6N] Release 6에서 추가된 명령어
    • [6Nm] Release 6 신규 인코딩
    • [6R] Release 6에서 삭제된 인코딩
    • [6Rm] Release 6 이전 인코딩
by opcode
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
ADDI[I][6R]
POP10[δ][6N]
ADDIU[I] SLTI[I] SLTIU[I] ANDI[I] ORI[I] XORI[I] LUI[I][35]
AUI[I][6N]
001
COP0[δ] COP1[δ] COP2[δ][θ] COP3[δ]
COP1X[δ][6R]
010
[β] [β] [β] 011
LB[I] LH[I] LWL[I][6R] LW[I] LBU[I] LHU[I] LWR[I][6R] [β] 100
SB[I] SH[I] SWL[I][6R] SW[I] [β] [β] SWR[I][6R] CACHE[6Rm] 101
LL[6Rm] LWC1 [β] LDC1 [β] 110
SC[6Rm] SWC1 [β] SDC1 [β] 111
by function (opcode=SPECIAL)
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
JR[R][6R][84] 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
by rt (opcode=REGIMM)
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 LWL rt, offset(base) I-type 100 010 Release 6에서 삭제
LWR LWR rt, offset(base) I-type 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 SWL rt, offset(base) I-type 100 010 Release 6에서 삭제
SWR SWR rt, offset(base) I-type 100 110 Release 6에서 삭제
PC-Relative
LWPC LWPC rs, offset PCREL 111 011 Release 6 [20:19] = 01
Atomic
LL LL rt, offset(base) I-type 110 000 Release 6에서 인코딩 변경
SPECIAL3 011 111 Release 6 [15:7] = offset(9), [6] = 0, [5:0] = 110110(LL)
SC SC rt, offset(base) I-type 111 000 Release 6에서 인코딩 변경
SPECIAL3 011 111 Release 6 [15:7] = offset(9), [6] = 0, [5:0] = 100110(SC)
Release 6 이전에는 메모리 접근 명령어의 경우 해당 자료형의 크기에 맞춰 '정렬된' 주소(2바이트 halfword의 경우 2의 배수, 4바이트 word의 경우 4의 배수, ...)여야 한다는 제약이 존재해 정렬되지 않은 접근을 보조하기 위한 명령어(LWL, LWR, SWL, SWR, ...)가 별도로 존재하였다. Release 6에서는 정렬되지 않은 주소에 대한 접근을 허용하기 때문에 해당 명령어들은 삭제되었다. 단, 성능상의 이유로 메모리 주소를 정렬하는 것이 권장된다.

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 MULT rs, rt R-type 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 MULTU rs, rt R-type 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 ADDI rt, rs, immediate I-type 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 -
ADDI 명령어의 경우 ADDIU 명령어와 overflow 발생시 trap 여부에만 차이가 있어 Release 6에서 삭제되었다.

2.3. Jump/Branch 명령어

2.4. 기타 명령어

2.5. FPU 명령어


[6N]