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 명령어



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 명령어
  • 기호 설명
    • [β], [1] 예약된 인코딩
    • [δ] 명령어 디코딩에 추가적인 필드를 사용함
    • [θ] 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][2]
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][3]
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] A B C D E F G H I J K L M N O R-Type[I] A B C D E F G H I J K L M N O P Q R S T U V W X Y Z I-Type[J] A B C J-Type[β] A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] 예약됨[*] A B C D E [δ] A B C D E F G H I J K L M 추가 필드 사용[θ] A B [6N] A B C D E [6Nm] [6R] A B C D E F G H [6Rm] A B C D [1] [2] Release 6에서 추가된 AUI의 특수한 경우이다. (rs=0)[3] JALR (rd=0)으로 대체 가능하기 때문에 제거


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 이전 레지스터)[4]
    • HI: 곱셈 연산의 결과 중 높은 자릿수 부분 또는 나눗셈 결과의 나머지 등을 저장하는 레지스터이다.
    • LO: 곱셈 연산의 결과 중 낮은 자릿수 부분 또는 나눗셈 결과의 몫 등을 저장하는 레지스터이다.
[4] 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

-


ADDI 명령어의 경우 ADDIU 명령어와 overflow 발생시 trap 여부에만 차이가 있어 Release 6에서 삭제되었다.

2.3. Jump/Branch 명령어[편집]



2.4. 기타 명령어[편집]



2.5. FPU 명령어[편집]


파일:크리에이티브 커먼즈 라이선스__CC.png 이 문서의 내용 중 전체 또는 일부는 2023-10-29 13:15:35에 나무위키 MIPS(ISA)/명령어 목록 문서에서 가져왔습니다.