AArch64 - AArch64
AArch64 lub ARM64 to 64-bitowe rozszerzenie architektury ARM .
Został po raz pierwszy wprowadzony w architekturze ARMv8-A .
ARMv8-A
Ogłoszony w październiku 2011 r. ARMv8-A stanowi fundamentalną zmianę w architekturze ARM. Dodaje opcjonalną architekturę 64-bitową o nazwie „AArch64” i powiązany nowy zestaw instrukcji „A64”. AArch64 zapewnia zgodność przestrzeni użytkownika z istniejącą architekturą 32-bitową („AArch32”/ARMv7-A) i zestawem instrukcji („A32”). 16-32-bitowy zestaw instrukcji kciuka jest określany jako „T32” i nie ma 64-bitowego odpowiednika. ARMv8-A umożliwia uruchamianie aplikacji 32-bitowych w 64-bitowym systemie operacyjnym, a 32-bitowy system operacyjny jest pod kontrolą 64-bitowego hiperwizora . Firma ARM ogłosiła swoje rdzenie Cortex-A53 i Cortex-A57 30 października 2012 r. Apple jako pierwszy wypuścił rdzeń zgodny z ARMv8-A ( Apple A7 ) w produkcie konsumenckim ( iPhone 5S ). AppliedMicro , używający FPGA , był pierwszym, który zademonstrował ARMv8-A. Pierwszym układem SoC ARMv8-A firmy Samsung jest Exynos 5433 używany w Galaxy Note 4 , który składa się z dwóch klastrów czterech rdzeni Cortex-A57 i Cortex-A53 w konfiguracji big.LITTLE; ale będzie działać tylko w trybie AArch32.
Zarówno dla AArch32, jak i AArch64, ARMv8-A zapewnia standard VFPv3/v4 i zaawansowany SIMD (Neon). Dodaje również instrukcje kryptograficzne obsługujące AES , SHA-1 / SHA-256 i arytmetykę skończonych pól .
Konwencje nazewnictwa
- 64 + 32 bity
- Architektura: AArch64
- Specyfikacja: ARMv8-A
- Zestawy instrukcji: A64 + A32
- Przyrostki: v8-A
- 32 + 16 (kciuk) bit
- Architektura: AArch32
- Specyfikacja: ARMv8-R / ARMv7-A
- Zestawy instrukcji: A32 + T32
- Przyrostki: -A32 / -R / v7-A
- Przykład: ARMv8-R, Cortex-A32
Funkcje AArch64
- Nowy zestaw instrukcji, A64
- Posiada 31 rejestrów 64-bitowych ogólnego przeznaczenia.
- Posiada dedykowany rejestr wskaźnika zerowego lub wskaźnika stosu (SP) (w zależności od instrukcji).
- Licznik programu (PC) nie jest już bezpośrednio dostępny jako rejestr.
- Instrukcje mają nadal długość 32 bitów i przeważnie są takie same jak A32 (z instrukcjami LDM/STM i większością wykonywania warunkowych odrzuconych).
- Ma sparowane ładunki/przechowuje (zamiast LDM/STM).
- Brak przewidywania dla większości instrukcji (z wyjątkiem gałęzi).
- Większość instrukcji może przyjmować argumenty 32-bitowe lub 64-bitowe.
- Zakłada się, że adresy są 64-bitowe.
- Zaawansowana karta SIMD (Neon) ulepszona
- Posiada rejestry 32 × 128-bitowe (od 16), dostępne również przez VFPv4.
- Obsługuje format zmiennoprzecinkowy podwójnej precyzji .
- W pełni zgodny z IEEE 754 .
- Z tych rejestrów korzystają również instrukcje szyfrowania/odszyfrowywania AES i SHA-1/SHA-2.
- Nowy system wyjątków
- Mniej rejestrów i trybów bankowych.
- Tłumaczenie pamięci z 48-bitowych adresów wirtualnych w oparciu o istniejące rozszerzenie dużego adresu fizycznego (LPAE), które zostało zaprojektowane tak, aby można je było łatwo rozszerzyć do wersji 64-bitowej.
Rozszerzenie: wskazówka dotycząca gromadzenia danych (ARMv8.0-DGH)
AArch64 został wprowadzony w ARMv8-A i jest zawarty w kolejnych wersjach ARMV8-A. AArch64 nie jest zawarty w ARMv8-R lub ARMv8-M, ponieważ są to architektury 32-bitowe.
Formaty instrukcji
Główny kod operacyjny służący do wyboru grupy, do której należy instrukcja A64, znajduje się na bitach 25-28.
Rodzaj | Fragment | |||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
31 | 30 | 29 | 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 | 18 | 17 | 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
Skryty | op0 | 0000 | op1 | Natychmiastowa stała 16 bitów | ||||||||||||||||||||||||||||
Nieprzydzielone | 0001 | |||||||||||||||||||||||||||||||
Instrukcje SVE | 0010 | |||||||||||||||||||||||||||||||
Nieprzydzielone | 0011 | |||||||||||||||||||||||||||||||
Przetwarzanie danych — natychmiastowe PC-rel. | op | immlo | dziesięć tysięcy | immhi | R & D | |||||||||||||||||||||||||||
Przetwarzanie danych — natychmiastowe inne | sf | 100 | 01-11 | R & D | ||||||||||||||||||||||||||||
Oddziały + instrukcje systemowe | op0 | 101 | op1 | op2 | ||||||||||||||||||||||||||||
Instrukcje dotyczące ładowania i przechowywania | op0 | 1 | op1 | 0 | op2 | op3 | op4 | |||||||||||||||||||||||||
Przetwarzanie danych — rejestr | sf | op0 | op1 | 101 | op2 | op3 | ||||||||||||||||||||||||||
Przetwarzanie danych — zmiennoprzecinkowe i SIMD | op0 | 111 | op1 | op2 | op3 |
ARMv8.1-A
W grudniu 2014 r. ogłoszono ARMv8.1-A, aktualizację z „dodatkowymi korzyściami w stosunku do wersji 8.0”. Ulepszenia dzielą się na dwie kategorie: zmiany w zestawie instrukcji oraz zmiany w modelu wyjątków i translacji pamięci.
Ulepszenia zestawu instrukcji obejmowały:
- Zestaw instrukcji atomowego odczytu i zapisu AArch64.
- Dodatki do zestawu instrukcji Advanced SIMD dla AArch32 i AArch64 w celu umożliwienia optymalizacji niektórych bibliotek:
- Podpisane zaokrąglanie nasycające Podwojenie Pomnóż Akumuluj, zwracając wysoką połowę.
- Podpisane zaokrąglanie nasycające Podwojenie Pomnóż Odejmij, zwracając wysoką połowę.
- Instrukcje są dodawane w postaci wektorowej i skalarnej.
- Zestaw instrukcji ładowania i przechowywania AArch64, które mogą zapewnić kolejność dostępu do pamięci, która jest ograniczona do konfigurowalnych regionów adresów.
- Opcjonalne instrukcje CRC w wersji 8.0 stają się wymogiem w ARMv8.1.
Ulepszenia modelu wyjątków i systemu translacji pamięci obejmowały:
- Nowy bit stanu nigdy uprzywilejowanego dostępu (PAN) zapewnia kontrolę, która uniemożliwia uprzywilejowany dostęp do danych użytkownika, o ile nie zostanie wyraźnie włączony.
- Zwiększony zakres VMID do wirtualizacji; obsługuje większą liczbę maszyn wirtualnych.
- Opcjonalna obsługa aktualizacji sprzętu flagi dostępu do tablicy stron oraz standaryzacja opcjonalnego, zaktualizowanego sprzętowo mechanizmu bitów brudnych.
- Rozszerzenia hosta wirtualizacji (VHE). Te ulepszenia poprawiają wydajność hipernadzorców typu 2, zmniejszając obciążenie oprogramowania związane z przechodzeniem między systemami operacyjnymi hosta i gościa. Rozszerzenia pozwalają systemowi operacyjnemu hosta na wykonanie na poziomie EL2, w przeciwieństwie do EL1, bez istotnych modyfikacji.
- Mechanizm zwalniający niektóre bity tablicy translacji do użytku przez system operacyjny, w którym system operacyjny nie potrzebuje obsługi sprzętu.
- Ignorowanie górnego bajtu dla tagowania pamięci .
ARMv8.2-A
W styczniu 2016 roku ogłoszono ARMv8.2-A. Jego ulepszenia można podzielić na cztery kategorie:
- Opcjonalne przetwarzanie danych zmiennoprzecinkowych z połówkową precyzją (połowa precyzji była już obsługiwana, ale nie do przetwarzania, tylko jako format przechowywania).
- Ulepszenia modelu pamięci
- Wprowadzenie rozszerzenia niezawodności, dostępności i obsługi (rozszerzenie RAS)
- Wprowadzenie profilowania statystycznego
Skalowalne rozszerzenie wektorowe (SVE)
Rozszerzenie Scalable Vector Extension (SVE) to „opcjonalne rozszerzenie architektury ARMv8.2-A i nowsze” opracowane specjalnie do wektoryzacji obciążeń naukowych obliczeń o wysokiej wydajności . Specyfikacja pozwala na zaimplementowanie zmiennych długości wektorów od 128 do 2048 bitów. Rozszerzenie jest uzupełnieniem i nie zastępuje przedłużek NEON .
512-bitowy wariant SVE został już zaimplementowany na superkomputerze Fugaku przy użyciu procesora Fujitsu A64FX ARM. Ma być najwydajniejszym superkomputerem na świecie z „celem rozpoczęcia pełnej działalności około 2021 roku”.
SVE jest obsługiwany przez kompilator GCC , przy czym GCC 8 obsługuje automatyczną wektoryzację, a GCC 10 obsługuje funkcje wewnętrzne C. Od lipca 2020 r. LLVM i klang obsługują wewnętrzne funkcje C i IR. Własny widelec LLVM firmy ARM obsługuje automatyczną wektoryzację.
ARMv8.3-A
W październiku 2016 roku ogłoszono ARMv8.3-A. Jego ulepszenia podzielono na sześć kategorii:
- Uwierzytelnianie wskaźnika (tylko AArch64); obowiązkowe rozszerzenie (oparte na nowym szyfrze blokowym QARMA ) do architektury (kompilatory muszą wykorzystywać funkcję bezpieczeństwa, ale ponieważ instrukcje znajdują się w przestrzeni NOP, są one kompatybilne wstecz, aczkolwiek nie zapewniają dodatkowego zabezpieczenia na starszych chipach).
- Wirtualizacja zagnieżdżona (tylko AArch64)
- Zaawansowana obsługa złożonych numerów SIMD (AArch64 i AArch32); np. obroty o wielokrotność 90 stopni.
- Nowa instrukcja FJCVTZS (zmiennoprzecinkowy JavaScript konwertujący na stały punkt ze znakiem , zaokrąglanie w kierunku zera).
- Zmiana modelu spójności pamięci (tylko AArch64); do obsługi (nie domyślnego) słabszego modelu RCpc (Release Consistent processor spójnego) C++11 / C11 (domyślny model spójności C++11/C11 był już obsługiwany w poprzedniej wersji ARMv8).
- Obsługa mechanizmu identyfikacji dla większych pamięci podręcznych widocznych dla systemu (AArch64 i AArch32)
Architektura ARMv8.3-A jest teraz obsługiwana przez (przynajmniej) kompilator GCC 7.
ARMv8.4-A
W listopadzie 2017 roku ogłoszono ARMv8.4-A. Jego ulepszenia dzieliły się na następujące kategorie:
- "Rozszerzenia kryptograficzne SHA3/SHA512/SM3/ SM4 "
- Ulepszona obsługa wirtualizacji
- Możliwości partycjonowania i monitorowania pamięci (MPAM)
- Nowy bezpieczny monitor stanu i aktywności EL2
- Instrukcje iloczynu skalarnego ze znakiem i bez znaku (SDOT i UDOT).
ARMv8.5-A
We wrześniu 2018 roku ogłoszono ARMv8.5-A. Jego ulepszenia mieściły się w następujących kategoriach:
- Rozszerzenie tagowania pamięci (MTE)
- Branch Target Indicators (WIT) w celu zmniejszenia „zdolności atakującego do wykonania dowolnego kodu”,
- Instrukcje generatora liczb losowych — „zapewnianie deterministycznych i prawdziwych liczb losowych zgodnych z różnymi normami krajowymi i międzynarodowymi”
2 sierpnia 2019 r. Google ogłosił, że Android przyjmie rozszerzenie Memory Tagging Extension (MTE).
ARMv8.6-A
We wrześniu 2019 ogłoszono ARMv8.6-A. Dodaje:
- Ogólne mnożenie macierzy (GEMM)
- Format Bfloat16 wsparcie
- Instrukcje manipulacji macierzą SIMD, BFDOT, BFMMLA, BFMLAL i BFCVT
- ulepszenia wirtualizacji, zarządzania systemem i bezpieczeństwa
- oraz następujące rozszerzenia (do których LLVM 11 już dodał obsługę):
- Ulepszona wirtualizacja liczników (ARMv8.6-ECV)
- Drobnoziarniste pułapki (ARMv8.6-FGT)
- Wirtualizacja monitorów aktywności (ARMv8.6-AMU)
Na przykład drobnoziarniste pułapki, instrukcje oczekiwania na zdarzenie (WFE), EnhancedPAC2 i FPAC. Rozszerzenia Bfloat16 dla SVE i Neon służą głównie do głębokiego uczenia.
ARMv9-A
W marcu 2021 roku ogłoszono ARMv9-A. Bazą ARMv9-A są wszystkie funkcje z ARMv8.5. ARMv9-A dodaje również:
- Skalowalne rozszerzenie wektorowe 2 (SVE2). SVE2 opiera się na skalowalnej wektoryzacji SVE w celu zwiększenia drobnoziarnistego równoległości poziomu danych (DLP) , aby umożliwić więcej pracy wykonywanej na instrukcję. SVE2 ma na celu udostępnienie tych korzyści szerszemu zakresowi oprogramowania, w tym DSP i multimedialnym kodom SIMD, które obecnie używają Neon . W LLVM / Clang 9.0 i GCC kody 10,0 rozwojowe zostały zaktualizowane do obsługi SVE2.
- Rozszerzenie Pamięci Transakcyjnej (TME). Podążając za rozszerzeniami x86 , TME wprowadza obsługę sprzętowej pamięci transakcyjnej (HTM) i transakcyjnej blokady transakcyjnej (TLE). TME ma na celu wprowadzenie skalowalnej współbieżności w celu zwiększenia gruboziarnistego równoległości poziomu wątków (TLP) , aby umożliwić więcej pracy wykonywanej na wątek. W LLVM / Clang 9.0 i GCC kody 10,0 rozwojowe zostały zaktualizowane do obsługi TME.
- Poufna architektura obliczeniowa (CCA)
- Rozszerzenie skalowalnej macierzy (SME). SMX dodaje nowe funkcje do wydajnego przetwarzania macierzy, takie jak:
- Przechowywanie płytek matrycy
- Transpozycja macierzy w locie
- Załaduj/zachowaj/wstaw/wyodrębnij wektory kafelków
- Macierzowy iloczyn zewnętrzny wektorów SVE
- „Tryb strumieniowania” SVE
ARMv8-R (architektura czasu rzeczywistego)
Opcjonalna obsługa AArch64 została dodana do profilu ARMv8-R, a pierwszym rdzeniem ARM ją implementującym jest Cortex-R82. Dodaje zestaw instrukcji A64, z pewnymi zmianami w instrukcjach bariery pamięci.