32 × 128비트 레지스터 (스칼라 32 및 64비트 부동소수점 또는 SIMD 부동소수점 또는 정수용, 또는 암호화용)
AArch64 또는 ARM64는 널리 사용되는 컴퓨터 프로세서 설계 세트인 ARM 아키텍처의 64비트 버전이다. 2011년 ARMv8 아키텍처와 함께 도입되었으며 나중에 ARMv9 시리즈의 일부가 되었다. AArch64를 사용하면 프로세서가 이전의 32비트 버전보다 더 많은 메모리를 처리하고 더 빠른 계산을 수행할 수 있다. 이는 AArch32로 알려진 이전 32비트 모드와 함께 작동하도록 설계되어 광범위한 소프트웨어와의 호환성을 허용한다. AArch64를 사용하는 장치에는 스마트폰, 태블릿, 개인용 컴퓨터 및 서버가 포함된다. AArch64 아키텍처는 성능, 보안 및 고급 컴퓨팅 작업에 대한 지원을 개선하는 업데이트를 통해 계속 진화하고 있다.
AArch64 실행 상태
ARMv8-A, ARMv8-R 및 ARMv9-A에서 "실행 상태"(Execution state)는 프로세서 환경의 주요 특성을 정의한다. 여기에는 기본 프로세서 레지스터에 사용되는 비트 수, 지원되는 명령어 집합 및 프로세서 실행 환경의 기타 측면이 포함된다. 이러한 버전의 ARM 아키텍처는 64비트 AArch64 상태와 32비트 AArch32 상태의 두 가지 실행 상태를 지원한다.
2011년 10월에 발표된 ARMv8-A는 ARM 아키텍처의 근본적인 변화를 나타낸다. 이는 "AArch64"라고 불리는 선택적 64비트 실행 상태와 관련 새로운 "A64" 명령어 집합을 추가하며, 기존의 32비트 "A32"(오리지널 32비트 ARM) 및 "T32"(Thumb/Thumb-2) 명령어 집합을 지원하는 32비트 실행 상태인 "AArch32"도 함께 지원한다. 후자의 명령어 집합은 기존의 32비트 ARMv7-A 아키텍처와 사용자 공간 호환성을 제공한다. ARMv8-A를 사용하면 64비트 OS에서 32비트 애플리케이션을 실행할 수 있으며, 32비트 OS를 64비트 하이퍼바이저의 제어 하에 둘 수 있다. ARM은 2012년 10월 30일에 Cortex-A53 및 Cortex-A57 코어를 발표했다. 애플은 소비자 제품(iPhone 5S)에 ARMv8-A 호환 코어(Cyclone)를 최초로 출시했다. AppliedMicro는 FPGA를 사용하여 ARMv8-A를 최초로 시연했다. 삼성전자의 첫 번째 ARMv8-A SoC는 갤럭시 노트4에 사용된 엑시노스 5433으로, Big.LITTLE 구성의 Cortex-A57 및 Cortex-A53 코어 4개씩 두 개의 클러스터를 특징으로 하지만 AArch32 모드에서만 실행된다.
ARMv8-A는 AArch32와 AArch64 모두에서 VFPv3/v4 및 고급 SIMD(Neon)를 표준 기능으로 포함한다. 또한 AES, SHA-1/SHA-256 및 유한체 산술을 지원하는 암호화 명령어를 추가한다.
ARMv8-A 프로세서는 AArch32와 AArch64 중 하나 또는 둘 다를 지원할 수 있다. 낮은 예외 레벨에서는 AArch32와 AArch64를 지원하고 높은 예외 레벨에서는 AArch64만 지원할 수도 있다. 예를 들어, ARM Cortex-A32는 AArch32만 지원하고, ARM Cortex-A34는 AArch64만 지원하며, ARM Cortex-A72는 AArch64와 AArch32를 모두 지원한다. ARMv9-A 프로세서는 모든 예외 레벨에서 AArch64를 지원해야 하며, EL0에서 AArch32를 지원할 수 있다.
ARMv8.1-A
2014년 12월, "v8.0에 비해 점진적인 이점"을 가진 업데이트인 ARMv8.1-A가 발표되었다. 향상된 기능은 명령어 집합의 변경과 예외 모델 및 메모리 변환의 변경이라는 두 가지 범주로 나뉜다.
명령어 집합의 향상된 기능은 다음과 같다.
AArch64 원자적 읽기-쓰기 명령어 세트.
일부 라이브러리 최적화를 가능하게 하기 위해 AArch32 및 AArch64 모두를 위한 고급 SIMD 명령어 집합 추가:
Signed Saturating Rounding Doubling Multiply Accumulate, Returning High Half.
Signed Saturating Rounding Doubling Multiply Subtract, Returning High Half.
명령어가 벡터 및 스칼라 형식으로 추가됨.
구성 가능한 주소 영역으로 제한된 메모리 접근 순서를 제공할 수 있는 AArch64 로드 및 스토어 명령어 세트.
v8.0의 선택적 CRC 명령어가 ARMv8.1에서 필수 사항이 됨.
예외 모델 및 메모리 변환 시스템의 향상된 기능은 다음과 같다.
새로운 PAN(Privileged Access Never) 상태 비트는 명시적으로 활성화되지 않는 한 사용자 데이터에 대한 특권 접근을 방지하는 제어 기능을 제공함.
가상화를 위한 VMID 범위 증가; 더 많은 수의 가상 머신 지원.
페이지 테이블 접근 플래그의 하드웨어 업데이트에 대한 선택적 지원 및 선택적인 하드웨어 업데이트 더티 비트 메커니즘의 표준화.
가상화 호스트 확장(Virtualization Host Extensions, VHE). 이러한 향상된 기능은 호스트와 게스트 운영 체제 간의 전환 시 발생하는 소프트웨어 오버헤드를 줄여 유형 2 하이퍼바이저의 성능을 개선함. 이 확장을 통해 호스트 OS는 실질적인 수정 없이 EL1 대신 EL2에서 실행될 수 있음.
OS에 하드웨어 지원이 필요하지 않은 경우 운영 체제 용도로 일부 변환 테이블 비트를 해제하는 메커니즘.
확장형 벡터 확장(Scalable Vector Extension, SVE)은 고능성 컴퓨팅 과학 워크로드의 벡터화를 위해 특별히 개발된 "ARMv8.2-A 아키텍처 이상에 대한 선택적 확장"으로 라이선스가 부여된다. 사양에 따라 ARM 라이선스 사용자는 128비트 배수로 128에서 2048비트 사이의 하드코딩된 아키텍처 레지스터 너비를 선택할 수 있다. 이 확장은 NEON 확장을 보완하며 이를 대체하지 않는다.
512비트 SVE 변체는 후지쯔 A64FX ARM 프로세서를 사용하는 후가쿠 슈퍼컴퓨터에서 이미 구현되었다. 이 컴퓨터는 2020년 6월부터 2022년 5월까지 2년 동안 세계에서 가장 빠른 슈퍼컴퓨터였다. 더 유연한 버전인 2x256 SVE는 AWS Graviton3 ARM 프로세서에 의해 구현되었다.
SVE는 GCC에서 지원되며, GCC 8은 자동 벡터화를 지원하고 GCC 10은 C 인트린직(intrinsics)을 지원한다. 2020년 7월 현재 LLVM과 클랭은 C 및 IR 인트린직을 지원한다. ARM 자체 LLVM 포크는 자동 벡터화를 지원한다.
ARMv8.3-A
2016년 10월, ARMv8.3-A가 발표되었다. 향상된 기능은 여섯 가지 범주로 나뉜다.
포인터 인증 (PAC) (AArch64 전용); 새로운 블록 암호인 QARMA를 기반으로 하는 아키텍처의 필수 확장(컴파일러는 보안 기능을 활용해야 하지만, 명령어가 NOP 공간에 있으므로 이전 칩에서 추가 보안을 제공하지는 않지만 하위 호환성을 유지함).
"공격자가 임의의 코드를 실행할 수 있는 능력"을 줄이기 위한 분기 타겟 표시기 (BTI) (AArch64). 포인터 인증과 마찬가지로 관련 명령어는 이전 버전의 ARMv8-A에서 무연산(no-ops)이다.
난수 생성기 명령어 – "다양한 국내 및 국제 표준을 준수하는 결정론적 및 진정 난수 제공".
2019년 8월 2일, 구글은 안드로이드가 메모리 태깅 확장(MTE)을 채택할 것이라고 발표했다.
2021년 3월, ARMv9-A가 발표되었다. ARMv9-A의 기준선은 ARMv8.5의 모든 기능이다. ARMv9-A는 또한 다음을 추가한다.
확장형 벡터 확장 2 (SVE2). SVE2는 명령어당 더 많은 작업을 수행할 수 있도록 미세한 데이터 레벨 병렬성(DLP)을 높이기 위해 SVE의 확장 가능한 벡터화를 기반으로 구축되었다. SVE2의 목표는 현재 NEON을 사용하는 DSP 및 멀티미디어 SIMD 코드를 포함한 더 광범위한 소프트웨어에 이러한 이점을 제공하는 것이다. LLVM/클랭 9.0 및 GCC 10.0은 SVE2를 지원하도록 업데이트되었다.
트랜잭셔널 메모리 확장 (TME). x86 확장을 따라 TME는 하드웨어 트랜잭셔널 메모리 (HTM) 및 트랜잭셔널 락 엘리전(TLE) 지원을 제공한다. TME는 스레드당 더 많은 작업을 수행할 수 있도록 거친 스레드 레벨 병렬성(TLP)을 높이기 위해 확장 가능한 동시성을 제공하는 것을 목표로 한다. LLVM/클랭 9.0 및 GCC 10.0은 TME를 지원하도록 업데이트되었다.