SPARC

[섬네일|[썬 마이크로시스템즈|썬 울트라스팍 II 마이크로프로세서 (1997)]]
**SPARC**(스팍, **Scalable Processor ARChitecture**, 확장형 프로세서 아키텍처)는 썬 마이크로시스템즈가 원래 개발한 축소 명령어 집합 컴퓨터 (RISC) 명령어 집합 아키텍처이다. 그 설계는 1980년대 초에 개발된 실험적인 버클리 RISC 시스템의 영향을 강하게 받았다. 1986년에 처음 개발되어 1987년에 출시된 SPARC은 초기 상업용 RISC 시스템 중 가장 성공적인 것 중 하나였으며, 그 성공으로 1980년대와 1990년대에 걸쳐 많은 업체에서 유사한 RISC 설계를 도입하게 되었다. 썬을 인수한 후, 오라클은 2017년에 SPARC 개발을 종료했다.

## 설명
1980년대 중반까지 컴퓨터 업계의 합의는 RISC가 전통적인 CISC 아키텍처보다 훨씬 더 나은 가격 대비 성능비를 갖는다는 것이었다. 워크스테이션 공급업체인 썬 마이크로시스템즈는 모토로라 68000 시리즈 프로세서에서 가능한 한 빨리 RISC로 전환하기로 결정했다.

원래의 32비트 아키텍처(SPARC V7)의 첫 번째 구현은 썬의 Sun-4 컴퓨터 워크스테이션 및 서버 시스템에 사용되었으며, 모토로라 68000 시리즈 기반의 이전 Sun-3 시스템을 대체했다. 1992년에 출시된 SuperSPARC 시리즈 프로세서의 일부로 여러 개선 사항이 추가된 SPARC V8이 등장했다. 1993년에 발표된 SPARC V9은 64비트 아키텍처를 도입했으며, 1995년 썬의 울트라스팍 프로세서에서 처음으로 구현되었다. 이후 SPARC 프로세서는 썬, 솔본, 후지쯔 등이 생산한 대칭형 다중 처리 (SMP) 및 불균일 기억 장치 접근 (CC-NUMA) 서버에 사용되었다.

이 설계는 1989년에 SPARC 인터내셔널(SPARC International) 무역 그룹으로 넘어갔으며, 그 이후 아키텍처는 회원사들에 의해 개발되었다. SPARC 인터내셔널은 또한 SPARC 아키텍처의 라이선스 공여 및 홍보, SPARC 상표 관리(소유권 포함), 그리고 적합성 테스트 제공을 담당한다. SPARC 인터내셔널은 SPARC 아키텍처를 성장시켜 더 큰 생태계를 조성하고자 했으며, 이에 따라 SPARC은 아트멜, 바이폴라 인티그레이티드 테크놀로지(BIT), 사이프러스 세미컨덕터, 후지쯔, 마쓰시타, 텍사스 인스트루먼트를 포함한 여러 제조업체에 라이선스가 공여되었다. SPARC 인터내셔널 덕분에 SPARC은 완전히 개방되어 있으며 비독점적이고 로열티가 없다.

2024년 기준, 최신 상업용 하이엔드 SPARC 프로세서는 후지쯔의 SPARC64 XII(2017년 9월 SPARC M12 서버용으로 도입)와 2017년 9월 하이엔드 서버용으로 도입된 오라클의 SPARC M8이다.

2017년 9월 1일, 2016년 11월 오라클 랩스에서 시작된 해고 조치 이후, 오라클은 M8 개발을 완료한 뒤 SPARC 설계를 종료했다. 텍사스주 오스틴의 프로세서 코어 개발 그룹의 상당수와 캘리포니아주 산타클라라, 매사추세츠주 벌링턴의 팀들이 해고되었다.

후지쯔 또한 SPARC 생산을 중단할 예정이다(이미 자체 ARM 기반 CPU 생산으로 전환함). 2020~22년에 이전 SPARC M12 서버의 "강화" 버전을 출시한 후(당초 2021년 계획), 2029년에 UNIX 서버 판매를 종료하고 1년 후에는 메인프레임 판매를 종료하며, "고객 현대화 촉진"을 위해 2034년에 지원을 종료할 계획이다.

## 특징
SPARC 아키텍처는 캘리포니아 대학교 버클리의 버클리 RISC I 및 II와 IBM 801을 포함한 초기 RISC 설계의 영향을 크게 받았다. 이러한 초기 RISC 설계는 미니멀리즘을 지향하여 가능한 한 적은 기능이나 연산 코드(op-code)를 포함하고 클럭 주기당 거의 하나의 명령어를 실행하는 것을 목표로 했다. 이로 인해 곱셈이나 나눗셈 명령어가 부족한 등 여러 면에서 MIPS 아키텍처와 유사했다. 이 초기 RISC 운동의 영향을 받은 SPARC의 또 다른 특징은 분기 지연 슬롯이다.

SPARC 프로세서는 대개 160개에 달하는 범용 레지스터를 포함한다. "오라클 SPARC 아키텍처 2015" 사양에 따르면 "구현에 따라 72개에서 640개의 범용 64비트" 레지스터를 포함할 수 있다. 어떤 시점에서도 소프트웨어에는 32개만 즉시 보이는데, 8개는 전역 레지스터 세트(그중 하나인 **g0**은 하드웨어적으로 0에 고정되어 있어 7개만 사용 가능)이고 나머지 24개는 레지스터 스택에서 가져온 것이다. 이 24개의 레지스터는 레지스터 윈도라고 불리는 것을 형성하며, 함수 호출/반환 시 이 윈도는 레지스터 스택 위아래로 이동한다. 각 윈도는 8개의 지역 레지스터를 가지며 인접한 각 윈도와 8개의 레지스터를 공유한다. 공유 레지스터는 함수 매개변수 전달 및 값 반환에 사용되고, 지역 레지스터는 함수 호출 간에 지역 값을 유지하는 데 사용된다.

SPARC의 "Scalable(확장 가능)"이라는 이름은 SPARC 사양이 임베디드 프로세서에서 대형 서버 프로세서까지 확장이 가능하며, 모두 동일한 코어(비특권) 명령어 집합을 공유한다는 사실에서 유래했다. 확장 가능한 아키텍처 매개변수 중 하나는 구현된 레지스터 윈도의 수이다. 사양은 3개에서 32개 사이의 윈도 구현을 허용하므로, 구현 시 최대 콜 스택 효율성을 위해 32개를 모두 구현하거나 설계 비용과 복잡성을 줄이기 위해 3개만 구현하거나 그 사이의 숫자를 선택할 수 있다. 유사한 레지스터 파일 기능을 포함하는 다른 아키텍처로는 인텔 i960, IA-64, AMD Am29000이 있다.

아키텍처는 여러 번의 개정을 거쳤다. 버전 8에서 하드웨어 곱셈 및 나눗셈 기능을 얻었다. 1994년에 발표된 버전 9 SPARC 사양에서 64비트(주소 지정 및 데이터)가 추가되었다.

SPARC 버전 8에서 부동소수점 레지스터 파일은 16개의 배정밀도 레지스터를 가진다. 각각은 두 개의 단정밀도 레지스터로 사용될 수 있어 총 32개의 단정밀도 레지스터를 제공한다. 짝수-홀수 번호 쌍의 배정밀도 레지스터는 4배정밀도 레지스터로 사용될 수 있어 8개의 4배정밀도 레지스터를 허용한다. SPARC 버전 9은 16개의 배정밀도 레지스터를 추가로 도입했으며(이 또한 8개의 4배정밀도 레지스터로 접근 가능), 이 추가 레지스터들은 단정밀도 레지스터로 접근할 수 없다. 2024년 기준 하드웨어에서 4배정밀도 연산을 구현한 SPARC CPU는 없다.

태그형 덧셈 및 뺄셈 명령어는 두 피연산자의 하위 2비트가 0인지 확인하고 그렇지 않으면 오버플로를 보고하면서 연산을 수행한다. 이는 태그형 정수 형식을 사용하는 ML, 리스프, 그리고 유사한 언어의 런타임 구현에 유용할 수 있다.

32비트 SPARC V8 아키텍처의 엔디언은 순수하게 빅 엔디언이다. 64비트 SPARC V9 아키텍처는 빅 엔디언 명령어를 사용하지만, 애플리케이션 명령어(로드-스토어) 수준이나 메모리 페이지 수준(MMU 설정을 통해)에서 선택하여 빅 엔디언 또는 리틀 엔디언 바이트 순서로 데이터에 접근할 수 있다. 후자는 대개 PCI 버스에 있는 장치들과 같이 본질적으로 리틀 엔디언인 장치에서 데이터에 접근할 때 사용된다.

## 역사

v7 → v8 → v9 (64비트) → JPS1 → JPS2 (멀티코어) → UA2005 (sun4v) → UA2007 → OSA2011 → OSA2015 → OSA2017

이 아키텍처에는 세 가지 주요 개정판이 있다. 첫 번째 발표 버전은 1986년의 32비트 SPARC 버전 7 (V7)이었다. 향상된 SPARC 아키텍처 정의인 SPARC 버전 8 (V8)은 1990년에 출시되었다. V7과 V8의 주요 차이점은 정수 곱셈 및 나눗셈 명령어의 추가와 80비트 "확장 정밀도" 부동소수점 연산에서 128비트 "4배정밀도" 연산으로의 업그레이드였다. SPARC V8은 32비트 마이크로프로세서 아키텍처를 위한 IEEE 표준인 IEEE 표준 1754-1994의 기초가 되었다.

64비트 SPARC 아키텍처인 SPARC 버전 9 (V9)은 1993년에 SPARC 인터내셔널에 의해 출시되었다. 이는 암달 코퍼레이션, 후지쯔, ICL, LSI 코퍼레이션, 마쓰시타, 필립스, 로스 테크놀로지, 썬 마이크로시스템즈, 텍사스 인스트루먼트로 구성된 SPARC 아키텍처 위원회에 의해 개발되었다. 최신 사양은 항상 완전한 SPARC V9 레벨 1 사양을 준수한다.

2002년, 후지쯔와 썬에 의해 SPARC Joint Programming Specification 1 (JPS1)이 출시되었으며, 양사 CPU에서 동일하게 구현된 프로세서 기능("공통성")을 설명했다. JPS1을 준수한 첫 번째 CPU는 썬의 울트라스팍 III와 후지쯔의 SPARC64 V였다. JPS1에서 다루지 않는 기능은 각 프로세서의 "구현 보충서(Implementation Supplements)"에 기록되어 있다.

2003년 말, 멀티 코어 CPU를 지원하기 위해 Joint Programming Specification 2 (JPS2)가 출시되었다. JPS2를 준수한 첫 번째 CPU는 썬의 울트라스팍 IV와 후지쯔의 SPARC64 VI였다.

2006년 초, 썬은 확장된 아키텍처 사양인 UltraSPARC Architecture 2005 (UA2005)를 발표했다. 여기에는 SPARC V9의 비특권 및 대부분의 특권 부분뿐만 아니라 울트라스팍 III, IV, IV+ 프로세서 세대를 통해 개발된 모든 아키텍처 확장과 울트라스팍 T1 구현부터 시작된 칩 멀티스레딩(CMT) 확장이 포함되었다.

* VIS 1 및 VIS 2 명령어 집합 확장과 관련 GSR 레지스터
* GL 레지스터에 의해 제어되는 다중 레벨 전역 레지스터
* 썬의 64비트 MMU 아키텍처
* 특권 명령어 ALLCLEAN, OTHERW, NORMALW, INVALW
* VER 레지스터 접근이 하이퍼특권(hyperprivileged)으로 변경
* SIR 명령어가 하이퍼특권으로 변경

2007년, 썬은 울트라스팍 T2 구현이 준수하는 업데이트된 사양인 UltraSPARC Architecture 2007 (UA2007)을 발표했다.

2007년 12월, 썬은 또한 오픈스팍 프로젝트를 통해 울트라스팍 T2 프로세서의 RTL을 공개했다. 이는 GNU 일반 공중 사용 허가서 v2로도 출시되었다. 오픈스팍 T2는 8코어 16파이프라인 64스레드 구조이다.

2012년 8월, 오라클은 새로운 사양인 Oracle SPARC Architecture 2011 (OSA2011)을 공개했으며, 이는 참조용 전반적인 업데이트 외에도 2007년 사양에 VIS 3 명령어 집합 확장과 하이퍼특권 모드를 추가했다.

2015년 10월, 오라클은 새로운 Oracle SPARC Architecture 2015 (OSA2015) 사양을 기반으로 한 최초의 프로세서인 SPARC M7을 출시했다. 이 개정판에는 VIS 4 명령어 집합 확장과 하드웨어 가속 암호화 및 실리콘 보안 메모리(SSM)가 포함되었다.

2017년 9월, 오라클은 새로운 Oracle SPARC Architecture 2017 (OSA2017) 사양을 기반으로 한 최초의 프로세서인 SPARC M8을 출시했다.

SPARC 아키텍처는 1987년 첫 SPARC V7 구현부터 썬 울트라스팍 아키텍처 구현에 이르기까지 지속적인 애플리케이션 바이너리 호환성을 제공해 왔다.

SPARC의 다양한 구현 중 썬의 SuperSPARC와 UltraSPARC-I은 매우 인기가 높았으며 SPEC CPU95 및 CPU2000 벤치마크의 참조 시스템으로 사용되었다. 296&nbsp;MHz UltraSPARC-II는 SPEC CPU2006 벤치마크의 참조 시스템이다.

## 아키텍처
SPARC은 로드-스토어 아키텍처(레지스터-레지스터 아키텍처라고도 함)이다. 메모리 접근에 사용되는 로드/스토어 명령어를 제외한 모든 명령어는 RISC 설계 원칙에 따라 레지스터에서 작동한다.

SPARC 프로세서는 정수 로드, 스토어 및 산술 연산을 수행하는 정수 유닛(IU)을 포함한다. 또한 부동소수점 연산을 수행하는 부동소수점 장치(FPU)를 포함할 수 있으며, SPARC V8의 경우 보조 프로세서 전용 연산을 수행하는 코프로세서(CP)를 포함할 수 있다. 아키텍처는 로드 및 스토어 연산 외에 코프로세서가 수행할 기능을 명시하지 않는다.

### 레지스터
SPARC 아키텍처는 중첩된 레지스터 윈도 체계를 가지고 있다. 어떤 순간에도 32개의 범용 레지스터가 보인다. 하드웨어의 CWP(Current Window Pointer) 변수가 현재 세트를 가리킨다. 레지스터 파일의 총 크기는 아키텍처의 일부가 아니므로 기술이 향상됨에 따라 더 많은 레지스터를 추가할 수 있다. SPARC V7 및 V8에서는 CWP가 5비트이고 PSR 레지스터의 일부이므로 최대 32개의 윈도가 가능하다.

SPARC V7 및 V8에서 CWP는 일반적으로 SAVE 명령어(함수 호출 시 새 스택 프레임을 열고 레지스터 윈도를 전환하는 데 사용됨)에 의해 감소하거나, RESTORE 명령어(반환 전 호출자로 돌아가기 위해 전환)에 의해 증가한다. 트랩 이벤트(인터럽트, 예외 또는 TRAP 명령어)와 RETT 명령어(트랩에서 복귀)도 CWP를 변경한다. SPARC V9의 경우 CWP 레지스터는 RESTORE 명령어 중에 감소하고 SAVE 명령어 중에 증가한다. 이는 SPARC V8의 PSR.CWP 동작과 반대이다. 이 변경은 비특권 명령어에는 영향을 미치지 않는다.

SPARC 레지스터는 위 표와 같이 구성된다.

또한 곱셈 단계, 정수 곱셈 및 정수 나눗셈 명령어에 사용되는 비윈도형 Y 레지스터가 있다.

FPU가 있는 SPARC V8 프로세서는 32개의 32비트 부동소수점 레지스터를 포함하며, 각각 하나의 단정밀도 IEEE 754 부동소수점 수를 가질 수 있다. 짝수-홀수 쌍의 부동소수점 레지스터는 하나의 배정밀도 IEEE 754 부동소수점 수를 가질 수 있고, 4개로 정렬된 그룹은 하나의 4배정밀도 IEEE 754 부동소수점 수를 가질 수 있다.

FPU가 있는 SPARC V9 프로세서는 다음을 포함한다:

* 32개의 32비트 부동소수점 레지스터 (각각 하나의 단정밀도 IEEE 754 수 저장 가능)
* 32개의 64비트 부동소수점 레지스터 (각각 하나의 배정밀도 IEEE 754 수 저장 가능)
* 16개의 128비트 부동소수점 레지스터 (각각 하나의 4배정밀도 IEEE 754 수 저장 가능)

이 레지스터들은 64개의 32비트 레지스터 세트로 구성되며, 처음 32개는 32비트 부동소수점 레지스터로 사용되고, 64개 전체의 짝수-홀수 쌍은 64비트 부동소수점 레지스터로, 4개로 정렬된 그룹은 128비트 부동소수점 레지스터로 사용된다.

부동소수점 레지스터는 윈도 방식이 아니며 모두 전역 레지스터이다.

### 명령어 형식
모두 SPARC 명령어는 전체 32비트 워드를 차지하며 워드 경계에서 시작한다. 첫 두 비트로 구분되는 네 가지 형식이 사용된다. 모든 산술 및 논리 명령어는 2개의 소스 피연산자와 1개의 목적지 피연산자를 갖는다. RD는 연산 결과가 저장되는 "목적지 레지스터"이다. 대부분의 SPARC 명령어는 적어도 이 레지스터를 가지므로 명령어 형식의 "앞쪽"에 배치된다. RS1과 RS2는 "소스 레지스터"이며, 존재할 수도 있고 상수로 대체될 수도 있다.

### 명령어
#### 로드 및 스토어
로드 및 스토어 명령어는 주소에 대한 두 개의 피연산자와 읽거나 쓸 레지스터에 대한 하나의 피연산자를 갖는 3-피연산자 형식이다. 주소는 두 주소 피연산자를 더하여 생성된다. 두 번째 주소 피연산자는 상수이거나 레지스터일 수 있다. 로드는 해당 주소의 값을 가져와 세 번째 피연산자로 지정된 레지스터에 배치하는 반면, 스토어는 첫 번째 피연산자로 지정된 레지스터의 값을 가져와 해당 주소에 배치한다. 이를 명확하게 하기 위해 어셈블리어는 피연산자를 쉼표로 구분하는 대신 대괄호를 사용하고 주소 피연산자 사이에 더하기 기호를 사용한다. 예:

 ld [%L1+%L2],%L3  !주소 %L1+%L2의 32비트 값을 로드하여 %L3에 넣음
 ld [%L1+8],%L2    !%L1+8 주소의 값을 %L2로 로드
 ld [%L1],%L2      !위와 같으나 오프셋이 없음 (+%G0와 동일)
 st %L1,[%I2]      !%L1의 값을 %I2에 저장된 위치에 스토어
 st %G0,[%I1+8]    !%I1+8 위치의 메모리를 0으로 지움

16비트나 8비트 정수 데이터, 문자열의 8비트 바이트 등 32비트가 아닌 데이터가 널리 사용되므로, 32비트 워드뿐만 아니라 16비트 하프워드와 8비트 바이트를 로드하고 저장하는 명령어가 있다. 로드 중에 이러한 명령어는 표시된 위치의 바이트 또는 하프워드만 읽은 다음 대상 레지스터의 나머지 부분을 0으로 채우거나(부호 없는 로드) 바이트 또는 하프워드의 최상위 비트 값으로 채운다(부호 있는 로드). 스토어 중에 이러한 명령어는 레지스터의 상위 비트를 버리고 하위 비트만 저장한다. 또한 부동소수점 연산에 사용되는 배정밀도 값을 로드하는 명령어도 있는데, 표시된 레지스터와 "다음" 레지스터에서 8바이트를 읽거나 쓴다. 예를 들어 로드 대상이 L1이면 L1과 L2가 설정된다. 32비트 SPARC에서 범용 레지스터를 위한 로드 및 스토어 명령어의 전체 목록은 , ,  (부호 없는 바이트),  (부호 있는 바이트),  (부호 없는 하프워드),  (부호 있는 하프워드),  (더블 로드),  (바이트 스토어),  (하프워드 스토어),  (더블 스토어)이다.

SPARC V9에서 레지스터는 64비트이며,  명령어는 로 이름이 변경되어 레지스터의 상위 32비트를 지우고 하위 32비트에 값을 로드한다.  명령어는 로 이름이 변경되어 상위 32비트를 버리고 하위 32비트만 저장한다. 새로운  명령어는 레지스터의 상위 비트를 워드의 최상위 비트 값으로 설정하고 하위 비트에 32비트 값을 로드한다. 새로운  명령어는 64비트 값을 레지스터에 로드하고,  명령어는 레지스터의 64비트 전체를 저장한다.

, ,  명령어는 메모리에서 단정밀도, 배정밀도, 또는 4배정밀도 값을 부동소수점 레지스터로 로드한다. , ,  명령어는 단정밀도, 배정밀도, 또는 4배정밀도 부동소수점 레지스터 값을 메모리에 저장한다.

메모리 배리어 명령어인 MEMBAR는 두 가지 상호 연관된 목적을 수행한다. 메모리 참조 간의 순서 제약을 명시하고 메모리 참조 완료에 대한 명시적 제어를 용이하게 한다. 예를 들어, MEMBAR 명령어 이전에 나타나는 스토어의 모든 효과는 MEMBAR 이후의 로드가 실행되기 전에 모든 프로세서에 보여야 한다.

#### ALU 연산
산술 및 논리 명령어도 3-피연산자 형식을 사용하며, 처음 두 개는 피연산자이고 마지막은 결과를 저장할 위치이다. 중간 피연산자는 레지스터이거나 13비트 부호 있는 정수 상수일 수 있으며, 다른 피연산자들은 레지스터이다. 결과 레지스터를 G0로 지정하면 결과가 버려지며, 이는 테스트 목적으로 사용될 수 있다. 예시는 다음과 같다:

 add %L1,%L2,%L3   !%L1과 %L2 값을 더해 %L3에 저장
 add %L1,1,%L1     !%L1 증가
 add %G0,%G0,%L4   !%L4의 모든 값을 0으로 지움

수학 명령어 목록은 , , , , 와 이들의 부정 버전인 , , 이다. SPARC 설계의 한 가지 특징은 대부분의 산술 명령어가 쌍으로 제공된다는 것이다. 하나는 상태 레지스터의 NZVC 조건 코드 비트를 설정하고 다른 하나는 설정하지 않으며, 기본값은 설정하지 않는 것이다. 이는 컴파일러가 지연 슬롯을 채우려 할 때 명령어를 이동할 수 있는 방법을 제공하기 위해서이다. 조건 코드가 설정되기를 원하면 명령어에 를 추가한다:

 subcc %L1,10,%G0  !%L1과 10을 비교하고 결과는 무시하되 플래그를 설정

add 및 sub에는 연산이 캐리 비트를 설정해야 하는지를 나타내는 다른 수식어 X도 있다.

 addx %L1,100,%L1  !%L1 값에 100을 더하고 캐리를 추적

SPARC V7에는 곱셈이나 나눗셈 명령어가 없지만, 한 비트를 테스트하고 조건부로 피승수를 곱에 더하는 한 단계의 곱셈을 수행하는 가 있다. 이는 RISC 철학에 따라 가 한 클럭 주기 내에 완료될 수 있기 때문이었다. SPARC V8에서는  (부호 없는 곱셈),  (부호 있는 곱셈),  (부호 없는 나눗셈),  (부호 있는 나눗셈) 명령어가 추가되었으며, 조건 코드를 업데이트하는 버전과 업데이트하지 않는 버전이 모두 있다. 와 곱셈 명령어는 Y 레지스터를 사용하여 곱의 상위 32비트를 저장하고, 나눗셈 명령어는 이를 사용하여 피제수의 상위 32비트를 저장한다.  명령어는 Y 레지스터의 값을 범용 레지스터로 읽어오고,  명령어는 범용 레지스터의 값을 Y 레지스터에 쓴다. SPARC V9에서는 두 64비트 값을 곱하여 64비트 결과를 생성하는 , 64비트 부호 있는 피제수를 64비트 부호 있는 제수로 나누어 64비트 부호 있는 몫을 생성하는 , 64비트 부호 없는 피제수를 64비트 부호 없는 제수로 나누어 64비트 부호 있는 몫을 생성하는 가 추가되었으며, 이들 명령어는 Y 레지스터를 사용하지 않는다.

#### 분기
조건부 분기는 IBM 시스템/360 아키텍처 및 그 후속 제품들과 X86 아키텍처와 같이 상태 레지스터의 조건 코드를 테스트한다. 이는 테스트와 분기가 일반적으로 두 개의 명령어로 수행됨을 의미한다. 첫 번째는 조건 코드를 설정하는 ALU 명령어이고, 그 다음은 해당 플래그를 검사하는 분기 명령어이다. SPARC에는 특수 테스트 명령어가 없으며, 목적지를 %G0로 설정한 일반 ALU 명령어를 사용하여 테스트를 수행한다. 예를 들어, 레지스터가 10 값을 가지고 있는지 테스트하고 처리 코드로 분기하려면 다음과 같이 한다:

 subcc %L1,10,%G0 !%L1에서 10을 빼고 %L1이 10이면 제로 플래그를 설정
 be WASEQUAL      !제로 플래그가 설정되어 있으면 WASEQUAL 주소로 분기

조건부 분기 명령어에서 **icc** 또는 **fcc** 필드는 테스트되는 조건을 지정한다. 22비트 변위 필드는 현재 PC를 기준으로 한 대상의 주소(워드 단위)이므로, 조건부 분기는 앞뒤로 최대 8메가바이트까지 이동할 수 있다. ANNUL (A) 비트는 일부 지연 슬롯을 제거하는 데 사용된다. 조건부 분기에서 이 비트가 0이면 지연 슬롯이 평소처럼 실행된다. 1이면 분기가 일어날 때만 지연 슬롯이 실행된다. 분기가 일어나지 않으면 조건부 분기 다음의 명령어는 건너뛴다.

다양한 조건부 분기가 있다:  (무조건 분기, 본질적으로 jmp),  (분기 안 함),  (같음),  (같지 않음),  (작음),  (작거나 같음),  (작거나 같음, 부호 없음),  (큼),  (크거나 같음),  (큼, 부호 없음),  (양수),  (음수),  (캐리 클리어),  (캐리 설정),  (오버플로 클리어),  (오버플로 설정).

FPU와 CP는 정수 조건 코드와 서로 독립적인 조건 코드 세트를 가지고 있다. 이러한 조건 코드를 테스트하기 위해 두 가지 추가 분기 명령어 세트가 정의되었다. 위 목록의 분기 명령어 앞에 F를 추가하면 FPU의 조건 코드에 대해 테스트를 수행하며, SPARC V8에서 C를 추가하면 정의되지 않은 CP의 플래그를 테스트한다.

 (서브루틴 호출) 명령어는 30비트 프로그램 카운터-상대 워드 오프셋을 사용한다. 대상 주소는 바이트가 아닌 워드 시작을 지정하므로 30비트만으로도 4기가바이트 주소 공간의 모든 주소에 도달할 수 있다. CALL 명령어는 반환 주소를 레지스터 R15(출력 레지스터 O7)에 저장한다.

 (점프 및 링크) 명령어는 대상 주소를 나타내는 두 개의 피연산자와 반환 주소를 저장할 레지스터에 대한 하나의 피연산자를 갖는 3-피연산자 명령어이다. 주소는 두 주소 피연산자를 더하여 32비트 주소로 생성된다. 두 번째 주소 피연산자는 상수이거나 레지스터일 수 있다.

#### 큰 상수
명령어 opcode가 32비트 명령어 워드의 일부를 차지하므로, 단일 명령어를 사용하여 32비트 상수를 로드할 수 있는 방법은 없다. 주소는 레지스터를 통해 조작되고 32비트이므로 이는 중요하다. 이를 돕기 위해 특수 목적의  명령어는 22비트 직접 피연산자를 지정된 레지스터의 상위 22비트에 복사하고 하위 10비트를 0으로 설정한다. 일반적으로 SETHI 다음에는 하위 10비트만 설정된 or 명령어가 뒤따른다. 이를 용이하게 하기 위해 어셈블러는  및  매크로를 포함한다. 예시:

 sethi %hi(0x89ABCDEF),%L1       !L1의 상위 22비트 설정
 or    %L1,%lo(0x89ABCDEF),%L1   !L1의 하위 10비트를 OR 연산으로 설정

hi 및 lo 매크로는 런타임이 아닌 어셈블 시간에서 수행되므로 성능 저하가 없으며 L1이 두 개의 관련 없는 값이 아닌 단일 값으로 설정됨을 명확하게 해준다. 이를 더 쉽게 하기 위해 어셈블러는 "의사 명령어(synthetic instruction)"인 을 포함하여 이 두 연산을 한 줄로 수행한다.

 set   0x89ABCDEF,% L1

값이 13비트보다 크면 위 두 명령어를 출력하고, 그렇지 않으면 단일  명령어를 내보낸다.

### 의사 명령어
앞서 언급했듯이 SPARC 어셈블러는 일반적인 코딩 작업을 쉽게 하기 위해 "의사 명령어"를 사용한다. 추가 예시는 다음과 같다:

## SPARC 아키텍처 라이선스 보유 업체
인텔은 80386의 유일한 생산자였으며, 이는 가격을 매우 비싸게 만들었고 업계가 단일 공급원 CPU에 대해 경계하게 만들었다. 썬이 1987년에 SPARC을 발표했을 때, 회사는 여러 공급원에서 이를 사용할 수 있을 것이라고 밝혔다. 후지쯔가 첫 번째 SPARC 벤더였고 사이프러스 세미컨덕터가 두 번째 라이선스 보유자였다.  기준으로 이들의 SPARC CPU와 텍사스 인스트루먼트의 FPU가 시중에 나와 있었다. 다음 조직들이 SPARC 아키텍처 라이선스를 취득했다:

* Afara Websystems
* 바이폴라 인티그레이티드 테크놀로지 (BIT)
* 사이프러스 세미컨덕터
* European Space Research and Technology Center (ESTEC)
* 후지쯔 (및 후지쯔 마이크로일렉트로닉스 자회사)
* Gaisler Research
* HAL Computer Systems
* 현대그룹
* LSI 코퍼레이션
* Matra Harris Semiconductors (MHS)
* 마쓰시타 전기산업
* Meiko Scientific
* Metaflow Technologies
* 필립스 전자
* Prisma
* 로스 테크놀로지
* 솔본 컴퓨터
* Systems & Processes Engineering Corporation (SPEC)
* TEMIC
* 텍사스 인스트루먼트
* Weitek

## 구현

**비고**:

## 운영체제 지원
SPARC 장비는 일반적으로 썬의 썬OS, 솔라리스, 자바OS 또는 일루모스와 오픈인디애나를 포함한 파생 버전인 오픈솔라리스를 사용해 왔지만, NeXTSTEP, RTEMS, FreeBSD, OpenBSD, NetBSD, 리눅스와 같은 다른 운영체제도 사용되었다.

1993년에 인터그래프는 SPARC 아키텍처로의 윈도우 NT 이식을 발표했으나, 나중에 취소되었다.

2015년 10월, 오라클은 "SPARC용 리눅스 참조 플랫폼"을 발표했다.

## 오픈 소스 구현
SPARC 아키텍처의 여러 완전한 오픈 소스 하드웨어 구현이 존재한다:

* LEON: 32비트 방사선 내성 SPARC V8 구현으로, 특히 우주용으로 설계되었다. 소스 코드는 VHDL로 작성되었으며 GPL 하에 라이선스가 부여된다.
* 오픈스팍 T1: 2006년에 출시된 64비트 32스레드 구현으로, UltraSPARC Architecture 2005 및 SPARC 버전 9 (레벨 1)를 준수한다. 소스 코드는 베릴로그로 작성되었으며 여러 라이선스 하에 배포된다. 대부분의 오픈스팍 T1 소스 코드는 GPL 하에 라이선스가 부여된다. 기존 오픈 소스 프로젝트 기반의 소스는 해당 프로젝트의 라이선스를 유지한다. 바이너리 프로그램은 바이너리 소프트웨어 라이선스 계약 하에 라이선스가 부여된다.
* S1: 오픈스팍 T1 설계를 기반으로 한 64비트 Wishbone 호환 CPU 코어이다. 4-way SMT가 가능한 단일 울트라스팍 V9 코어이다. T1과 마찬가지로 소스 코드는 GPL 하에 라이선스가 부여된다.
* 오픈스팍 T2: 2008년에 출시된 64비트 64스레드 구현으로, UltraSPARC Architecture 2007 및 SPARC 버전 9 (레벨 1)를 준수한다. 소스 코드는 베릴로그로 작성되었으며 여러 라이선스 하에 배포된다. 대부분의 오픈스팍 T2 소스 코드는 GPL 하에 라이선스가 부여된다.

SPARC 아키텍처를 위한 완전한 오픈 소스 소프트웨어 시뮬레이터도 존재한다:

* RAMP Gold: 32비트 64스레드 SPARC 버전 8 구현으로, FPGA 기반 아키텍처 시뮬레이션을 위해 설계되었다. RAMP Gold는 약 36,000라인의 시스템베릴로그로 작성되었으며 BSD 허가서 하에 라이선스가 부여된다.

## 슈퍼컴퓨터
HPC 부하를 위해 후지쯔는 HPC-ACE (High Performance Computing – Arithmetic Computational Extensions)라는 새로운 명령어 확장 세트를 갖춘 전문 SPARC64 fx 프로세서를 구축한다.

후지쯔의 K 컴퓨터는 2011년 6월과 11월 TOP500 목록에서 1위를 차지했다. 이는 각각 8개의 코어를 가진 88,128개의 SPARC64 VIIIfx CPU를 결합하여 총 705,024개의 코어를 갖추었는데, 이는 당시 TOP500의 다른 어떤 시스템보다 거의 두 배나 많은 수치였다. K 컴퓨터는 목록의 다음 5개 시스템을 합친 것보다 더 강력했으며, 모든 슈퍼컴퓨터 시스템 중 가장 높은 전력 대비 성능비를 기록했다. 또한 2011년 6월 그린500 목록에서 824.56 MFLOPS/W의 점수로 6위에 올랐다. 2012년 11월 TOP500 발표에서 K 컴퓨터는 상위 3개 중 가장 많은 전력을 사용하며 3위를 기록했다. 해당 시기 그린500 발표에서는 85위를 차지했다. 최신 HPC 프로세서인 IXfx 및 XIfx는 최근의 PRIMEHPC FX10 및 FX100 슈퍼컴퓨터에 포함되었다.

Tianhe-2 (2014년 11월 기준 TOP500 1위)는 중국에서 개발된 Galaxy FT-1500 오픈스팍 기반 프로세서를 탑재한 다수의 노드를 보유하고 있다. 그러나 이 프로세서들은 LINPACK 점수에는 기여하지 않았다.

## 같이 보기

* 빌 조이

## 각주


## 외부 링크
* SPARC 인터내셔널

분류:마이크로프로세서
분류:오라클 코퍼레이션
분류:후지쯔
분류:64비트 컴퓨터
분류:32비트 컴퓨터
분류:명령어 집합 구조