AArch64
# AArch64

AArch64 o ARM64 è l'estensione a 64 bit della famiglia di architetture ARM.

È stato introdotto per la prima volta con l'architettura Armv8-A. Arm rilascia una nuova estensione ogni anno.

## Estensioni e funzionalità ARMv8.x e ARMv9.x

Annunciata nell'ottobre 2011, ARMv8-A rappresenta un cambiamento fondamentale nell'architettura ARM. Aggiunge un'architettura a 64 bit opzionale, denominata "AArch64", e l'associato nuovo set di istruzioni "A64". AArch64 fornisce la compatibilità nello spazio utente con l'esistente architettura a 32 bit ("AArch32" / ARMv7-A) e il set di istruzioni ("A32"). Il set di istruzioni Thumb a 16-32 bit, indicato come "T32", non ha una controparte a 64 bit. ARMv8-A consente l'esecuzione di applicazioni a 32 bit in un sistema operativo a 64 bit e il controllo di un sistema operativo a 32 bit da parte di un hypervisor a 64 bit. ARM ha annunciato i propri core Cortex-A53 e Cortex-A57 il 30 ottobre 2012. Apple è stata la prima a rilasciare un core compatibile con ARMv8-A (Cyclone) in un prodotto destinato ai consumatori ( iPhone 5S ). AppliedMicro, tramite l'utilizzo di un FPGA, è stata la prima dimostrazione di ARMv8-A. Il primo SoC ARMv8-A di Samsung è stato l'Exynos 5433 utilizzato nel Galaxy Note 4, che presenta due cluster di quattro core Cortex-A57 e Cortex-A53 in configurazione big.little, ma può funzionare solo in modalità AArch32.

Sia in AArch32 che in AArch64, ARMv8-A rende obbligatorio l'utilizzo delle unità VFPv3/v4 e SIMD avanzato (NEON). Aggiunge inoltre istruzioni di crittografia che supportano AES, SHA-1/SHA-256 e aritmetica a campi finiti.

### Convenzioni di denominazione

* 64 + 32bit
   * Architettura: AArch64
   * Specifiche: ARMv8-A
   * Set di istruzioni: A64 + A32
   * Suffissi: v8-A
* 32 + 16 (Thumb) bit
   * Architettura: AArch32
   * Specifiche: ARMv8-R / ARMv7-A
   * Set di istruzioni: A32 + T32
   * Suffissi: -A32 / -R / v7-A
   * Esempio: ARMv8-R, Cortex-A32

### Caratteristiche di AArch64

* Nuovo set di istruzioni, A64
   * Dispone di 31 registri generici a 64 bit.
   * Ha un registro zero o SP (stack pointer) dedicato (a seconda dell'istruzione).
   * Il program counter (PC) non è più direttamente accessibile come registro.
   * Le istruzioni sono ancora lunghe 32 bit e per lo più uguali ad A32 (con le istruzioni LDM/STM e la maggior parte delle esecuzioni condizionali eliminate).
      * Dispone di istruzioni di load/store accoppiate (in sostituzione di LDM/STM).
      * Nessuna previsione per la maggior parte delle istruzioni (tranne per quelle di salto condizionale).
   * La maggior parte delle istruzioni può accettare argomenti a 32 o 64 bit.
   * Si presume che gli indirizzi siano a 64 bit.
* Istruzioni SIMD avanzate (Neon) migliorata
   * Dispone di registri 32 × 128 bit (rispetto a 16), accessibili anche tramite VFPv4.
   * Supporta il formato a virgola mobile a precisione doppia.
   * Completamente conforme a IEEE 754.
   * Anche le istruzioni per la crittografia AES e SHA-1/SHA-256 utilizzano questi registri.
* Un nuovo sistema di eccezioni
   * Meno modalità e registri.
* Conversione dell'indirizzamento della memoria virtuale a 48 bit basato sull'esistente Large Physical Address Extension (LPAE), progettato per essere facilmente esteso a 64 bit.

Estensione: suggerimento per la raccolta dei dati (ARMv8.0-DGH)

AArch64 è stato introdotta in ARMv8-A ed è inclusa nelle versioni successive di ARMv8-A. È stato introdotta anche in ARMv8-R come opzione, dopo la sua introduzione in ARMv8-A; è esclusa da ARMv8-M.

### ARMv8.1-A

Nel dicembre 2014 è stata annunciata ARMv8.1-A, un aggiornamento con "vantaggi incrementali rispetto alla v8.0". I miglioramenti rientravano in due categorie: modifiche al set di istruzioni e modifiche al modello di eccezione e alla conversione degli indirizzi di memoria.

### ARMv8.2-A

Nel gennaio 2016 è stata annunciata ARMv8.2-A. I suoi miglioramenti rientravano in quattro categorie:

* Elaborazione dati in virgola mobile a mezza precisione opzionale (la mezza precisione era già supportata, ma non per l'elaborazione, solo come formato di archiviazione).
* Miglioramenti del modello di memoria.
* Introduzione dell'estensione di affidabilità, disponibilità e funzionalità (estensione RAS)
* Introduzione della profilazione statistica.

### ARMv8.3-A

Nell'ottobre 2016 è stata annunciata ARMv8.3-A. I suoi miglioramenti rientravano in sei categorie:

* Autenticazione del puntatore (solo AArch64); estensione obbligatoria (basata su un nuovo cifrario a blocchi, QARMA) all'architettura (i compilatori devono sfruttare la funzione di sicurezza, ma poiché le nuove istruzioni sono nello spazio delle istruzioni NOP, sono retrocompatibili anche se non forniscono alcuna sicurezza aggiuntiva sui chip più vecchi).
* Virtualizzazione nidificata (solo AArch64)
* Supporto avanzato di numeri complessi SIMD (AArch64 e AArch32), es. rotazioni per multipli di 90 gradi.
* Nuova istruzione FJCVTZS (Conversione JavaScript da virgola mobile a virgola fissa, arrotondata a zero).
* Una modifica al modello di consistenza della memoria (solo AArch64); per supportare il modello RCpc (Release Consistent processor consistent) più debole (non predefinito) di C++11/C11 (il modello di coerenza C++11/C11 predefinito era già supportato nel precedente ARMv8).
* Supporto del meccanismo ID per cache più grandi visibili dal sistema (AArch64 e AArch32)

L'architettura ARMv8.3-A è ora supportata a partire dal compilatore GCC 7.

### ARMv8.4-A

Nel novembre 2017 è stata annunciata ARMv8.4-A. I suoi miglioramenti rientravano in queste categorie:

* Estensioni crittografiche SHA3 / SHA512 / SM3 / SM4.
* Supporto di virtualizzazione migliorato.
* Funzionalità di partizionamento e monitoraggio della memoria (MPAM).
* Un nuovo stato Secure EL2 e monitor dell'attività.
* Istruzioni prodotto scalare intero con e senza segno (SDOT e UDOT).

### ARMv8.5-A e ARMv9.0-A

A settembre 2018 è stata annunciata ARMv8.5-A. I suoi miglioramenti rientravano in queste categorie:

* Estensione del tagging della memoria (MTE)
* Branch Target Indicators (ITV) per ridurre "la capacità di un utente malintenzionato di eseguire codice arbitrario".
* Istruzioni per la generazione di numeri casuali per "fornire numeri casuali deterministici e veri conformi a vari standard nazionali e internazionali".

Il 2 agosto 2019, Google ha annunciato che Android avrebbe adottato l'estensione MTE.

Nel marzo 2021 è stata annunciata ARMv9-A. La linea di base di ARMv9-A è costituita da tutte le funzionalità di ARMv8.5. ARMv9-A aggiunge anche SVE2 (Scalable Vector Extension 2), TME (Transactional Memory Extension) e CCA (Confidential Compute Architecture).

### ARMv8.6-A e ARMv9.1-A

A settembre 2019 è stata annunciata ARMv8.6-A. I suoi miglioramenti rientravano in queste categorie:

* Moltiplicazione della matrice generale (GEMM)
* Supporto del formato bfloat16
* Istruzioni di manipolazione della matrice SIMD, BFDOT, BFMMLA, BFMLAL e BFCVT.
* Miglioramenti per la virtualizzazione, la gestione del sistema e la sicurezza.
* Le seguenti estensioni (supporto introdotto in LLVM 11):
   * Virtualizzazione avanzata dei contatori (ARMv8.6-ECV)
   * Trappole fini (ARMv8.6-FGT)
   * Virtualizzazione monitor attività (ARMv8.6-AMU)

### ARMv8.7-A e ARMv9.2-A

A settembre 2020 è stata annunciata ARMv8.7-A. I suoi miglioramenti rientravano in queste categorie:

* Estensione a matrice scalabile (SME) (solo ARMv9.2). SME aggiunge nuove funzionalità per elaborare le matrici in modo efficiente.
* Supporto migliorato per PCIe hot plug (AArch64)
* Accelerazione per il caricamento e memorizzazione atomici a 64 byte (AArch64)
* Wait For Instruction (WFI) e Wait For Event (WFE) con timeout (AArch64).
* Registrazione salti (solo ARMv9.2).

### ARMv8.8-A e ARMv9.3-A

Nel settembre 2021 sono stati annunciati ARMv8.8-A e ARMv9.3-A. I loro miglioramenti rientravano in queste categorie:

* Interrupt non mascherabili (AArch64)
* Istruzioni per ottimizzare le operazioni in stile memcpy e memset (AArch64)
* Miglioramenti al PAC (AArch64)
* Salti condizionali suggeriti (AArch64)

LLVM 15 supporta ARMv8.8-A e ARMv9.3-A.

### ARMv8.9-A e ARMv9.4-A

Nel settembre 2022 sono stati annunciati ARMv8.9-A e ARMv9.4-A, che includono:

* Miglioramenti dell'architettura del sistema di memoria virtuale (VMSA).
* Estensione matrice scalabile 2 (SME2) (solo ARMv9)
* Stack di controllo protetto (GCS) (solo ARMv9)
* Calcolo riservato.

## Armv8-R (architettura in tempo reale)

Il supporto AArch64 opzionale è stato aggiunto al profilo Armv8-R, con Cortex-R82 come primo core Arm che lo implementa. Aggiunto il set di istruzioni A64, con alcune modifiche alle istruzioni della barriera di memoria.

