이곳은 개발을 위한 베타 사이트 입니다.
기여내역은 언제든 초기화될 수 있으며, 예기치 못한 오류가 발생할 수 있습니다.

MIPS(ISA)/명령어 목록

덤프버전 :


명령어 집합
CISCAMD64x86 · M68K · 68xx · Z80 · 8080 · MOS 65xx · VAX
RISCAArch64 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:2625:2120:1615:1110:65:0
R-Typeopcodersrtrdsafunction
I-Typeopcodersrtimmediate
opcodebasertoffset
J-Typeopcodeaddress
사용되지 않는 필드는 특별한 언급이 없는 한 0으로 둔다.

아래는 Release 6에서 추가된 인코딩이다
종류31:2625:2120:1615:1110:65: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
000001010011100101110111[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)
000001010011100101110111[2:0] / [5:3]
SLL[R]SRL[R][δ]SRA[R]SLLV[R]SRLV[R][δ]SRAV[R]000
JR[R][6R][3]JALR[R]SYSCALLBREAKSYNC001
[β][β][β][β]010
[β][β][β][β]011
ADD[R]ADDU[R]SUB[R]SUBU[R]ANDORXORNOR100
[*][*]SLT[R]SLTU[R][β][β][β][β]101
TGETGEUTLTTLTUTEQTNE110
[β][*][β][β][β][*][β][β]111

by rt (opcode=REGIMM)
000001010011100101110111[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. 범용 레지스터[편집]

레지스터r0r1r2r3r4r5r6r7
ABI 이름zeroatv0v1a0a1a2a3
레지스터r8r9r10r11r12r13r14r15
ABI 이름t0t1t2t3t4t5t6t7
레지스터r16r17r18r19r20r21r22r23
ABI 이름s0s1s2s3s4s5s6s7
레지스터r24r25r26r27r28r29r30r31
ABI 이름t8t9k0k1gpspfpra

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
LBLB rt, offset(base)I-type100000
LHLH rt, offset(base)I-type100001
LWLW rt, offset(base)I-type100011
LBULBU rt, offset(base)I-type100100
LHULHU rt, offset(base)I-type100101
LWLLWL rt, offset(base)I-type100010Release 6에서 삭제
LWRLWR rt, offset(base)I-type100110Release 6에서 삭제
SBSB rt, offset(base)I-type100000
SHSH rt, offset(base)I-type100001
SWSW rt, offset(base)I-type100011
SWLSWL rt, offset(base)I-type100010Release 6에서 삭제
SWRSWR rt, offset(base)I-type100110Release 6에서 삭제
PC-Relative
LWPCLWPC rs, offsetPCREL111011Release 6[20:19] = 01
Atomic
LLLL rt, offset(base)I-type110000Release 6에서 인코딩 변경
SPECIAL3011111Release 6[15:7] = offset(9), [6] = 0, [5:0] = 110110(LL)
SCSC rt, offset(base)I-type111000Release 6에서 인코딩 변경
SPECIAL3011111Release 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인코딩opcodefunction추가 시점비고
[31:29][28:26]
Register - Register
ADDADD rd, rs, rtR-type000000100000
ADDUADDU rd, rs, rtR-type000000100001
SUBSUB rd, rs, rtR-type000000100010
SUBUSUBU rd, rs, rtR-type000000100011
ANDAND rd, rs, rtR-type000000100100
OROR rd, rs, rtR-type000000100101
XORXOR rd, rs, rtR-type000000100110
NORNOR rd, rs, rtR-type000000100111
SLTSLT rd, rs, rtR-type000000101010
SLTUSLTU rd, rs, rtR-type000000101011
SLLVSLLV rd, rt, rsR-type000000000100
SRLVSRLV rd, rt, rsR-type000000000110sa = 0으로 인코딩
SRAVSRAV rd, rt, rsR-type000000000111
ROTRVROTRV rd, rt, rsR-type000000000110Release 2sa = 1으로 인코딩
MULTMULT rs, rtR-type000000011000Release 6에서 삭제
MULMUL rd, rs, rtR-type000000011000Release 6sa = 2로 인코딩
MUHMUH rd, rs, rtR-type000000011000Release 6sa = 3으로 인코딩
MULTUMULTU rs, rtR-type000000011001Release 6에서 삭제
MULUMULU rd, rs, rtR-type000000011001Release 6sa = 2로 인코딩
MUHUMUHU rd, rs, rtR-type000000011001Release 6sa = 3으로 인코딩
Register - Immediate
ADDIADDI rt, rs, immediateI-type001000-Release 6에서 삭제, ADDIU로 대체
ADDIUADDIU rt, rs, immediateI-type001001-
ADDI 명령어의 경우 ADDIU 명령어와 overflow 발생시 trap 여부에만 차이가 있어 Release 6에서 삭제되었다.

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



2.4. 기타 명령어[편집]



2.5. FPU 명령어[편집]


파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 2023-10-29 13:15:35에 나무위키 MIPS(ISA)/명령어 목록 문서에서 가져왔습니다.