명령어 집합 | |
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 |
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년 말에 Apple의 iOS 기기용 GPU인 PowerVR 시리즈로 유명한 이미지네이션 테크놀로지에 인수되었다. 관련기사 그러나 이를 인수한 이미지네이션이 애플의 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년 파산하고 만다.#
2.1. 마이크로아키텍처 목록
마이크로아키텍처 | 출시 연도 | ISA | 파이프라인 | 비고 | ||
ISA 버전 | 비트 폭 | 너비 | 단계 수 | |||
MIPS R2000 | 1986 | MIPS I | 32 | 1 | 5 | |
MIPS R3000 | 1988 | MIPS I | 32 | 1 | 5 | |
MIPS R6000 | 1991 | MIPS II | 32 | 1 | 5 | |
MIPS R4000 | 1991 | MIPS III | 64 | 1 | 8 | 고클럭 최적화 |
MIPS R4200 | 1993 | MIPS III | 64 | 1 | 5 | 저전력 최적화 |
MIPS R8000 | 1994 | MIPS IV | 64 | 4 | 5 | |
MIPS R5000 | 1996 | MIPS IV | 64 | 2 | 5 | |
MIPS R10000 | 1996 | MIPS IV | 64 | 4 | 5-7 | 비순차적 실행 도입 |
MIPS R12000 | 1998 | MIPS IV | 64 | 4 | 6-8 |
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. 명령어 목록
자세한 내용은 MIPS(ISA)/명령어 목록 문서 참고하십시오.7. CPU 목록
위키백과 문서 참고VR로 시작하는 것은 NEC에서 만든 커스텀 칩이고, TX로 시작하는 것은 도시바에서 만든 커스텀 칩이다.
7.1. 32비트
- R3000 (1988년 6월)
- 소니 NEWS
- R3000A
- 플레이스테이션
- 남코 SYSTEM 1X 시리즈
- 코나미 시스템 573
- 코나미 TWINKLE(시스템)
- 남코 SYSTEM 2X6 시리즈 (I/O 프로세서)
- 플레이스테이션 2 (I/O 프로세서, 플레이스테이션 하위호환용)
- MIPS32
7.2. 64비트
- R4000 (1991년 10월 1일)
- 소니 NEWS
- PSP
- VR4000
- R4200
- VR4200 (1993년 80 MHz, 1994년 100 MHz)
- R4300i (1995년 4월 17일, 임베디드 애플리케이션용)
- VR4300
- 닌텐도 64
- 하이퍼 네오지오 64
- Seta Aleck 64
- VR4305, VR4310 (1998년 1월 20일)
- TX4300
- R5000
- 아타리·미드웨이 시애틀
- VR5000
- R5900
[1] 국내에서도 몇번 리뷰된 성능 덜떠러진 러시아산 PC들이 이 바이칼사의 Arm CPU가 장착된 PC들이다.# 48코어짜리 서버용 A75 CPU가 있긴 하지만 2019년 나온 제온 수준의 성능밖에 안된다.[2] 옐브루스-2S, 옐브루스-4[3] 다만 모스크바 스팍연구소도 서버나 PC에 사용되는 고성능 CPU들은 TSMC에서 생산했다. 자국 파운드리 회사는 산업용이나 군사용등 러시아 내수용 제품만 생산했기 때문에 2020년에서야 65nm 공정 반도체를 생산했기 때문이다.[4] shift amout의 약자. 비트 시프트 연산용이다.