MIPS(ISA)

덤프버전 :



파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는
문서의 r94 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}}에서 가져왔습니다. 이전 역사 보러 가기
파일:CC-white.svg 이 문서의 내용 중 전체 또는 일부는 다른 문서에서 가져왔습니다.
[ 펼치기 · 접기 ]
문서의 r94 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)
문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)

문서의 r 판{{{#!wiki style="display: inline; display: none;"
, 번 문단}}} (이전 역사)



명령어 집합
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. 개요
2. 역사
3. MIPS 아키텍처
3.1. MIPS32 (32-bit)
3.2. MIPS64 (64-bit)
4. 이전 버전
4.1. MIPS I (32-bit)
4.2. MIPS II (32-bit)
4.3. MIPS III (64-bit)
4.4. MIPS IV (64-bit)
4.5. MIPS V (64-bit)
5. MIPS ABI
5.1. 호출 규약
7. CPU 목록


1. 개요[편집]


MIPS(Microprocessor without Interlocked Pipeline Stages)란 MIPS Technologies에서 개발한 RISC 계열의 명령어 집합 체계이다.

MIPS 명령어 체계는 굉장히 깔끔하게 설계되어 있기 때문에 많은 대학교의 컴퓨터 아키텍처 과목에서 가르치고 있다.

2021년에는 개발사가 개발 중단을 선언하고 RISC-V로 이주를 발표했다.


2. 역사[편집]


최초의 MIPS 명령어 체계는 1986년 1월 MIPS Computer Systems(현 MIPS Technologies)에서 발표한 R2000 마이크로프로세서와 함께 <MIPS>이라는 이름으로 발표되었다. R2000은 RISC 기반의 명령어가 처음으로 적용되어 상용화된 CPU이다. 그 당시에 R2000은 모토로라 68000인텔 80386 시리즈와 경쟁했다. 이 버전은 이후 MIPS II가 발표되며 구분을 위해 MIPS I로 불리게 된다.

1990년 R6000과 함께 MIPS II가 발표되었다.

1992년 64비트 레지스터와 정수 연산이 지원되는 MIPS III가 발표되었다. 1992년 실리콘 그래픽스가 인수했다.

1994년에는 MIPS IV가 발표되었다.

1996년에 MIPS V가 발표되었다. 현존하는 MIPS 명령어 체계는 전부 MIPS V를 기반으로 개선이 이루어지고 있는 상태이다.

최신 버전의 MIPS 명령어 체계는 MIPS V를 기반으로 한 MIPS32/MIPS64 release 6로, 2014년에 발표되었다. Release 6은 하위 호환성을 거의 유지하지만 일부 명령어가 변경되어 필요시 trap을 사용하여 에뮬레이트해야 한다.

MIPS Technologies는 1998년 실리콘 그래픽스가 인텔 아이태니엄 시리즈로 이전하기로 결정해 분사하면서 2000년에 매각했으며, 2000년대 중종반부터 뛰어난 전력효율을 기반으로 스마트 시대와 맞물려 시장을 넓혀온 ARM에 입지를 잃어가다가 결국 2012년 말에 AppleiOS 기기용 GPUPowerVR 시리즈로 유명한 이미지네이션 테크놀로지에 인수되었다. 관련기사 그러나 이를 인수한 이미지네이션이 애플의 GPU 공급을 주력으로 잘 하다가 끊기면서 파산위기에 몰리고, 결국 2017년에 중국계 사모 투자 기업인 Canyon Bridge Capital Partners에서 6억 7500만 달러로 인수되면서, MIPS Technologies는 별도로 다른 중국계 사모 투자 기업인 Tallwood Venture Capital에 6500만 달러에 팔았다.

이후, 이듬해인 2018년 6월 16일에 AI 스타트업 기업인 웨이브 컴퓨팅이 사모 투자 기업에게서 사들여 자회사로 만들었다. 그러나 2020년 4월 30일 웨이브 컴퓨팅은 법원에 챕터 11 파산 보호(한국의 법인회생제도에 상당)를 신청했다.# 그리고 2021년 3월 1일 파산 보호 상태에서 벗어난 웨이브 컴퓨팅은 8세대 아키텍처부터 MIPS 아키텍처가 아닌 RISC-V 아키텍처를 개발할 것이며, 그럼에도 불구하고 MIPS 아키텍처 라이선스 사업은 계속될 것이라고 한다.#

다만 이를 두고 MIPS가 완전히 죽었다고 말하기에는 아직 시기상조인데, 임베디드 환경에서는 아직도 구형 MIPS 설계가 꽤 사용되고 있기 때문이다. 대표적으로는 라링크/미디어텍, 퀄컴 아데로스, 시스코 등이 네트워크 프로세서에 MIPS를 꾸준히 사용하였다. 물론 이런 분야에서도 천천히 Arm, RISC-V에 밀려나고 있어 시한부 신세이기는 하지만, 당분간은 어느 정도의 존재감을 가지고 있을 것으로 보인다.

MIPS 아키텍처의 전반적인 침체에도 불구하고, 2020년까지 중국 Loongson(龙芯)에서 MIPS ISA의 새로운 CPU를 설계, 제조하였다. IT 기술이 미국에 종속되는 것을 경계하고 미국산 CPU에 백도어가 들어있지 않을까 의심하는 중국에서 국책 사업으로 밀어주고 있기 때문. 2019년에 출시된 Loongson 3A4000이 대충 AMD 엑스카베이터와 비슷하다고 평가받았으니 미국과의 기술격차는 대충 10년 정도로 추정된다. 성능은 느리고 (규모의 경제를 할 수 없으니) 가격은 비싼데다, 운영체제로는 중국산 리눅스 배포판만 쓸 수 있고 프로그램은 태부족하니 애국심, 국산을 강조해도 민간 판매가 잘 될 리가 없어서, 주로 관용, 군용 납품으로 들어가고 있다. 웨이브 컴퓨팅이 MIPS 개발 중단을 선언하자, 2021년 Loongson은 LoongArch라는 자체 아키텍처를 급조하였으나, 기존에 판매된 MIPS64 Loongson CPU가 어디 사라지는 것은 아니기 때문에...

러시아바이칼(Baikal)사도 비슷한 이유로 MIPS 프로세서를 밀고있다. 바이칼은 원래 Arm을 라이선스해서 CPU를 설계해왔지만 미국의 제재로 이것이 막히면서 MIPS P5600 설계를 대신 구매해 사용하였다. 이는 ISA만 들여오고 마이크로아키텍처는 자체개발한 중국 Loongson에 비하면 뒤떨어지는 감이 있었고, 자국내에서도 소련 시절부터 ISA와 마이크로아키텍처까지 자체적으로 만든 러시아의 모스크바 스팍연구소의 옐브루스 프로세서와 달리 바이칼사는 원천기술이 없는 회사였기 때문이다. 결국 라이선스를 추가로 구매해 Arm으로 전향하였지만 ARM에서도 A57같은 구형 아키텍처만 사올 수 있었고 덕분에 VLIW라는 한계가 있지만 성능은 그럭저럭 나오는 옐브루스 프로세서와 달리 바이칼의 CPU 성능은 처참하게 떨어졌다.[1] 게다가 러시아-우크라이나 전쟁에 따른 국제사회의 제재로 Arm 라이선스와 TSMC 팹을 사용할 수 없게 되어 바이칼사의 반도체 독립 야망은 물건너가고 말았다. 모스크바 스팍연구소는 러시아 자국 파운드리 회사에서 CPU를 생산해본 경험이 있지만[2] 바이칼사는 TSMC 같은 외국회사에만 의존했기 때문이다.[3] 이 때문에 모스크바 스팍연구소는 여전히 건제한 반면 바이칼사는 결국 2023년 파산하고 만다.#


3. MIPS 아키텍처[편집]


MIPS ISA는 MIPS V(Release 1) 이후로 32비트/64비트 여부에 따라 MIPS32/MIPS64로 구분된다. 현재 최신 버전은 Release 6이다.
  • MIPS32: 32-bit MIPS 아키텍처이다. 명령어는 32-bit 길이로 인코딩된다.
    • microMIPS: MIPS와 어셈블리 수준 호환성을 갖는 ISA로, 명령어는 16-bit 또는 32-bit 길이로 인코딩된다. 상당수의 명령어를 16-bit로 줄일 수 있어 98%의 성능을 유지하면서 코드 크기를 최대 25% 줄일 수 있다고 한다. #
    • nanoMIPS: MIPS의 성능을 유지하면서 코드 크기를 줄이는 데 초점을 둔 ISA로, 일반 MIPS 아키텍처의 명령어가 32-bit 고정 길이로 인코딩되는 것과 달리 16-bit ~ 48-bit 가변 길이로 인코딩된다. 일반 MIPS에 비해 컴파일된 코드의 크기를 40% 가량 줄일 수 있다고 한다. #
  • MIPS64: 64-bit MIPS 아키텍처이다. 명령어는 32-bit 길이로 인코딩된다.

MIPS 명령어 체계를 확장한 명령어 체계로는 MCU, SmartMIPS, MDMX, MIPS-3D, microMIPS, nanoMIPS, MIPS16e등이 있다.

MIPS 명령어 체계는 크게 3가지 종류의 명령어로 구성되어 있다. 들어가기에 앞서 opcode라는 개념에 대해서 알아야 할 필요가 있다. opcode는 해당 명령어가 실행할 연산의 종류를 정의한다.
  • R type: c = a + b와 같은 연산을 할 때, 2개의 레지스터 값을 이용하여 연산을 한 다음, 다른 레지스터 하나에 연산한 값을 기록한다. 이 때 연산을 하는데 사용되는 레지스터는 각각 rs(register source의 약자), rt(register target의 약자)로 불리게 되며, 연산을 한 값을 rd(register destination의 약자)에 저장하게 된다. 단, 1개의 레지스터 값을 상수 자릿수만큼 시프트하는 연산 또한 R type으로 인코딩된다. 이때 sa/shamt(shift amount의 약자) 필드를 사용한다.
  • I type: R type과 비슷하게 두개의 값을 이용해 연산을 한 다음 다른 하나의 레지스터에 저장을 하지만, 연산할 값을 하나는 레지스터에서 가져오고 다른 하나는 레지스터가 아니라 지정된 임의의 값을 사용한다. I type 명령어에서 c = a + b와 같은 연산을 수행한다 하면, 이 때 b는 레지스터에 없는 임의의 값이 된다. R type 명령어에 있는 약자인 rs와 rt를 그대로 사용하며, 이때 사용되는 임의의 값은 immediate(줄여서 imm이라고도 하며, 즉시값이라고도 부른다.)로 부른다. 계산은 rt = rs + imm로 한다.
  • J type: 무조건 분기 명령어로, 특정 메모리 주소로 바로 이동이 필요한 경우에 사용되는 명령어다. 이동할 메모리 주소를 연산에 사용한다.


3.1. MIPS32 (32-bit)[편집]


32bit MIPS32 명령어는 크게 R타입 명령어, I타입 명령어, J타입 명령어로 나뉘어진다. 32bit MIPS는 총 32bit의 길이를 가지게 되며, 일반적으로 32개의 레지스터를 사용하기 때문에 5bit로 레지스터 주소를 표현하게 된다. 명령어 타입별로 각각 살펴보면
R타입 명령어
6bit opcode
5bit rs
5bit rt
5bit rd
5bit shamt[4]
6bit funct
I타입 명령어
6bit opcode
5bit rs
5bit rt
16bit immediate
J타입 명령어
6bit opcode
26bit address
로 이루어져 있다.


3.2. MIPS64 (64-bit)[편집]




4. 이전 버전[편집]



4.1. MIPS I (32-bit)[편집]


MIPS I는 다음 명령어를 지원한다:
  • Load/Store
    • Load (aligned): LB/LBU, LH/LHU, LW
    • Store (aligned): SB, SH, SW
    • Misaligned: LWL/LWR, SWL/SWR
  • ALU (immediate)
    • ADDI/ADDIU, SLTI/SLTIU, ANDI, ORI, XORI, LUI
  • ALU (register)
    • ADD/ADDU, SUB/SUBU, SLT/SLTU, AND, OR, XOR, NOR
  • Shift
    • immediate(shamt): SLL, SRL, SRA
    • register: SLLV, SRLV, SRAV
  • Multiply/Divide
    • MULT/MULTU, DIV/DIVU
    • MFHI/MFLO, MTHI/MTLO
  • Jump and Branch
    • Jump: J, JR
    • Jump & Link: JAL, JALR
    • Branch (2 opr): BEQ, BNE
    • Branch (1 opr): BLEZ, BGTZ, BLTZ, BGEZ
    • Branch & Link: BLTZAL, BGEZAL
  • Coprocessor
  • System Control Coprocessor (CP0)
    • MTC0, MFC0
    • TLBR, TLBWI, TLBWR, TLBP
    • RFE


4.2. MIPS II (32-bit)[편집]


MIPS II에서는 다음 명령어가 추가되었다:


4.3. MIPS III (64-bit)[편집]



4.4. MIPS IV (64-bit)[편집]



4.5. MIPS V (64-bit)[편집]




5. MIPS ABI[편집]



5.1. 호출 규약[편집]


MIPS 레지스터의 호출 규약은 일반적으로 사용되는 O32 ABI와 N64/N32 ABI로 나뉘어진다. O32 ABI는 32bit CPU를 위한 레지스터 호출 규약이며, N64/N32 ABI는 64bit CPU를 위한 레지스터 호출 규약이다. 기본적인 레지스터 호출 규약은 다음과 같다.
이름
레지스터 번호
용도
$zero
$0
항상 0을 출력하는 레지스터. 이 레지스터의 값은 바꿀 수 없다
$at
$1
의사 명령어(특정 조건 만족시 분기 명령어) 계산 결과를 위해 예약된 레지스터
$v0 ~ $v1
$2 ~ $3
함수로부터 반환된 값을 저장하는 레지스터
$a0 ~ $a3
$4 ~ $7
함수 인수 저장용 레지스터
$t0 ~ $t7
$8 ~ $15
어셈블러나 어셈블리 언어에서 값을 임시로 저장할 때 사용하는 레지스터
$s0 ~ $s7
$16 ~ $23
오랫동안 지속되는 값을 저장할 때 사용하는 레지스터
$t8 ~ $t9
$24 ~ $25
어셈블러나 어셈블리 언어에서 값을 임시로 저장할 때 사용하는 레지스터
$k0 ~ $k1
$26 ~ $27
OS 커널을 위해 예약된 레지스터
$gp
$28
전역 포인터의 값을 저장하는 레지스터
$sp
$29
스택 포인터의 값을 저장하는 레지스터
$fp
$30
프레임 포인터의 값을 저장하는 레지스터
$ra
$31
주소 반환값을 저장하는 레지스터


6. 명령어 목록[편집]


파일:나무위키상세내용.png   자세한 내용은 MIPS(ISA)/명령어 목록 문서를 참고하십시오.



7. CPU 목록[편집]


위키백과 문서 참고

VR로 시작하는 것은 NEC에서 만든 커스텀 칩이고, TX로 시작하는 것은 도시바에서 만든 커스텀 칩이다.


7.1. 32비트[편집]



7.2. 64비트[편집]


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

[1] 국내에서도 몇번 리뷰된 성능 덜떠러진 러시아산 PC들이 이 바이칼사의 Arm CPU가 장착된 PC들이다.# 48코어짜리 서버용 A75 CPU가 있긴 하지만 2019년 나온 제온 수준의 성능밖에 안된다.[2] 옐브루스-2S, 옐브루스-4[3] 다만 모스크바 스팍연구소도 서버나 PC에 사용되는 고성능 CPU들은 TSMC에서 생산했다. 자국 파운드리 회사는 산업용이나 군사용등 러시아 내수용 제품만 생산했기 때문에 2020년에서야 65nm 공정 반도체를 생산했기 때문이다.[4] shift amout의 약자. 비트 시프트 연산용이다.