# AArch64

AArch64 o ARM64 es la extensión de 64 bits de la familia de arquitectura ARM. Se introdujo por primera vez con la arquitectura Armv8-A y tuvo muchas actualizaciones de extensión.

## ARM-A (arquitectura de aplicación)

Anunciado en octubre de 2011, ARMv8-A representa un cambio fundamental en la arquitectura ARM. Agrega una arquitectura opcional de 64 bits, denominada "AArch64", y el nuevo conjunto de instrucciones asociado "A64". AArch64 proporciona compatibilidad de espacio de usuario con la arquitectura de 32 bits existente ("AArch32" / ARMv7-A) y el conjunto de instrucciones ("A32"). El conjunto de instrucciones Thumb de 16-32 bits se denomina "T32" y no tiene contraparte de 64 bits. ARMv8-A permite ejecutar aplicaciones de 32 bits en un sistema operativo de 64 bits y que un sistema operativo de 32 bits esté bajo el control de un hipervisor de 64 bits. ARM anunció sus núcleos Cortex-A53 y Cortex-A57 el 30 de octubre de 2012. Apple fue el primero en lanzar un núcleo compatible con ARMv8-A (Cyclone) en un producto de consumo (iPhone 5S). AppliedMicro, utilizando una FPGA, fue el primero en realizar una demostración de ARMv8-A. El primer SoC ARMv8-A de Samsung es el Exynos 5433 utilizado en el Galaxy Note 4, que presenta dos grupos de cuatro núcleos Cortex-A57 y Cortex-A53 en una configuración big.LITTLE ; pero se ejecutará sólo en modo AArch32.
ARMv8-A implementa el estándar VFPv3/v4 y SIMD (Neon) avanzado tanto en AArch32 como en AArch64. También agrega instrucciones de criptografía que admiten AES, SHA-1 / SHA-256 y aritmética de campos finitos.

### Convenciones de nombres

* 64 + 32 bits:
** Arquitectura: AArch64.
** Especificación: ARMv8-A.
** Conjuntos de instrucciones: A64 + A32.
** Sufijos: v8-A
* 32 + 16 bits (Thumb):
** Arquitectura: AArch32.
** Especificación: ARMv8-R / ARMv7-A.
** Conjuntos de instrucciones: A32 + T32.
** Sufijos: -A32 / -R / v7-A.
** Ejemplo: ARMv8-R, Cortex-A32.

### Características de AArch64

* Nuevo conjunto de instrucciones, A64:
** Tiene 31 registros de 64 bits de uso general.
** Tiene un registro cero o de puntero de pila (SP) dedicado (según la instrucción).
** Ya no se puede acceder directamente al contador de programa (PC) como registro.
** Las instrucciones aún son 32 bits de largo y casi igual que A32 (con instrucciones LDM/STM y la mayor parte de la ejecución condicional eliminada).
*** Tiene carga/almacenamiento emparejadas (en lugar de LDM/STM).
*** Sin predicación para la mayoría de las instrucciones (excepto las ramas).
** La mayoría de las instrucciones pueden aceptar argumentos de 32 o 64 bits.
** Se supone que las direcciones son de 64 bits.
* SIMD avanzado (Neon) mejorado:
** Tiene registros de 32 × 128 bits (antes 16), también accesibles a través de VFPv4.
** Admite formato de coma flotante de doble precisión.
** Totalmente compatible con IEEE 754.
** Las instrucciones de cifrado/descifrado AES y hash SHA-1/SHA-2 también utilizan estos registros.
* Un nuevo sistema de excepción:
** Menos registros y modos bancarizados.
* Traducción de memoria de direcciones virtuales de 48 bits basada en la extensión de direcciones físicas grandes (LPAE) existente, que fue diseñada para ampliarse fácilmente a 64 bits.
Extensión: sugerencia de recopilación de datos (ARMv8.0-DGH).
AArch64 se introdujo en ARMv8-A y se incluye en versiones posteriores de ARMv8-A. También se introdujo en ARMv8-R como opción, tras su introducción en ARMv8-A; no está incluido en ARMv8-M.

#### Formatos de instrucción

El código de operación principal para seleccionar a qué grupo pertenece una instrucción A64 se encuentra en los bits 25-28.
Formatos de instriucción de A64 :
| Type | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit | Bit |
| Type | 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 |
| Reservado | 0 | op$_0$ | op$_0$ | 0 | 0 | 0 | 0 | op$_1$ | op$_1$ | op$_1$ | op$_1$ | op$_1$ | op$_1$ | op$_1$ | op$_1$ | op$_1$ | | | | | | | | | | | | | | | | |
| SME | 1 | op$_0$ | op$_0$ | 0 | 0 | 0 | 0 | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía |
| Unallocated | | | | 0 | 0 | 0 | 1 | | | | | | | | | | | | | | | | | | | | | | | | | |
| SVE | | | | 0 | 0 | 1 | 0 | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía | Varía |
| No asignado | | | | 0 | 0 | 1 | 1 | | | | | | | | | | | | | | | | | | | | | | | | | |
| Procesamiento de datos: PC-rel inmediato. | op | imm$_{lo}$ | imm$_{lo}$ | 1 | 0 | 0 | 0 | 0 | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | imm$_{hi}$ | Rd | Rd | Rd | Rd | Rd |
| Procesamiento de Datos — Otros Inmediatos | sf | | | 1 | 0 | 0 | 01-11 | 01-11 | | | | | | | | | | | | | | | | | | | | Rd | Rd | Rd | Rd | Rd |
| Ramas + Instrucciones del sistema | op0 | op0 | op0 | 1 | 0 | 1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | op1 | | | | | | | | op2 | op2 | op2 | op2 | op2 |
| Instrucciones carga/almacenamiento | op0 | op0 | op0 | op0 | 1 | op1 | 0 | op2 | op2 | | op3 | op3 | op3 | op3 | op3 | op3 | | | | | op4 | op4 | | | | | | | | | | |
| Procesamiento de datos — Registros | sf | op0 | | op1 | 1 | 0 | 1 | op2 | op2 | op2 | op2 | | | | | | op3 | op3 | op3 | op3 | op3 | op3 | | | | | | | | | | |
| Procesamiento de datos: punto flotante y SIMD | op0 | op0 | op0 | op0 | 1 | 1 | 1 | op1 | op1 | op2 | op2 | op2 | op2 | op3 | op3 | op3 | op3 | op3 | op3 | op3 | op3 | op3 | | | | | | | | | | |

### ARMv8.1-A

En diciembre de 2014, se anunció ARMv8.1-A, una actualización con "beneficios incrementales sobre v8.0". Las mejoras se dividieron en dos categorías: cambios en el conjunto de instrucciones y cambios en el modelo de excepción y traducción de memoria.
Las mejoras del conjunto de instrucciones incluyeron lo siguiente:
* Un conjunto de instrucciones de lectura y escritura atómicas AArch64.
* Adiciones al conjunto de instrucciones SIMD avanzado para AArch32 y AArch64 para permitir oportunidades para algunas optimizaciones de biblioteca:
** Firmado Saturación Redondeo Duplicación Multiplicación Acumulación, devolviendo la mitad superior.
** Firmado Saturación Redondeo Duplicación Multiplicación Resta, devolviendo la mitad superior.
** Las instrucciones se agregan en forma vectorial y escalar.
* Un conjunto de instrucciones de carga y almacenamiento de AArch64 que pueden proporcionar un orden de acceso a la memoria limitado a regiones de direcciones configurables.
* Las instrucciones CRC opcionales en v8.0 se convierten en un requisito en ARMv8.1.
Las mejoras para el modelo de excepción y el sistema de traducción de memoria incluyeron lo siguiente:
* Un nuevo bit de estado Privileged Access Never (PAN) proporciona control que impide el acceso privilegiado a los datos del usuario a menos que se habilite explícitamente.
* Un rango VMID aumentado para virtualización; Admite una mayor cantidad de máquinas virtuales.
* Soporte opcional para la actualización de hardware del indicador de acceso a la tabla de páginas y la estandarización de un mecanismo de bits sucios opcional, actualizado por hardware.
* Las extensiones de host de virtualización (VHE). Estas mejoras mejoran el rendimiento de los hipervisores de tipo 2 al reducir la sobrecarga de software asociada con la transición entre los sistemas operativos host e invitado. Las extensiones permiten que el sistema operativo host se ejecute en EL2, a diferencia de EL1, sin modificaciones sustanciales.
* Un mecanismo para liberar algunos bits de la tabla de traducción para el uso del sistema operativo, cuando el sistema operativo no necesita soporte de hardware.
* Byte superior ignorado para etiquetado de memoria.

### ARMv8.2-A

En enero de 2016, se anunció ARMv8.2-A. Sus mejoras se dividieron en cuatro categorías:
* Procesamiento de datos de coma flotante de media precisión opcional (ya se admitía la media precisión, pero no para el procesamiento, solo como formato de almacenamiento).
* Mejoras en el modelo de memoria.
* Introducción de la extensión de confiabilidad, disponibilidad y capacidad de servicio (extensión RAS).
* Introducción de perfiles estadísticos.

#### Extensión vectorial escalable (SVE)

Scalable Vector Extension (SVE) es "una extensión opcional de la arquitectura ARMv8.2-A y más reciente" desarrollada específicamente para la vectorización de cargas de trabajo científicas informáticas de alto rendimiento. La especificación permite implementar longitudes de vectores variables de 128 a 2048 bits. La extensión es complementaria y no reemplaza a las extensiones NEON.
Ya se ha implementado una variante SVE de 512 bits en la supercomputadora Fugaku utilizando el procesador Fujitsu A64FX ARM; esta computadora fue la supercomputadora más rápida del mundo durante dos años, desde junio de 2020 hasta mayo de 2022. El procesador ARM AWS Graviton3 implementó una versión más flexible, 2x256 SVE.
SVE es compatible con el compilador GCC, donde GCC 8 admite la vectorización automática y GCC 10 admite los intrínsecos de C. A julio de 2020, LLVM y clang admiten elementos intrínsecos de C e IR. La propia bifurcación de ARM de LLVM admite la vectorización automática.

### ARMv8.3-A

En octubre de 2016, se anunció ARMv8.3-A. Sus mejoras se dividieron en seis categorías:
* Autenticación de puntero (solo AArch64); extensión obligatoria (basada en un nuevo cifrado de bloque, QARMA) a la arquitectura (los compiladores necesitan explotar la característica de seguridad, pero como las instrucciones están en el espacio NOP, son compatibles con versiones anteriores, aunque no brindan seguridad adicional en chips más antiguos).
* Virtualización anidada (solo AArch64).
* Compatibilidad avanzada con números complejos SIMD (AArch64 y AArch32); por ejemplo, rotaciones en múltiplos de 90 grados.
* Nueva instrucción FJCVTZS (Conversión de JavaScript de punto flotante a punto fijo con signo, redondeo hacia cero).
* Un cambio en el modelo de coherencia de la memoria (solo AArch64); para admitir el modelo RCpc (procesador consistente en versiones consistentes) más débil (no predeterminado) de C++11 / C11 (el modelo de consistencia predeterminado de C++11/C11 ya era compatible con ARMv8 anterior).
* Compatibilidad con mecanismos de identificación para cachés más grandes visibles para el sistema (AArch64 y AArch32).
La arquitectura ARMv8.3-A ahora es compatible con (al menos) el compilador GCC 7.

### ARMv8.4-A

En noviembre de 2017, se anunció ARMv8.4-A. Sus mejoras se clasifican en estas categorías:
* Extensiones criptográficas SHA3 / SHA512 / SM3 / SM4.
* Soporte de virtualización mejorado.
* Capacidades de partición y monitoreo de memoria (MPAM).
* Un nuevo estado seguro EL2 y monitores de actividad.
* Instrucciones de producto escalar entero con y sin signo (SDOT y UDOT).

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

En septiembre de 2018, se anunció ARMv8.5-A. Sus mejoras se clasifican en estas categorías:
* Extensión de etiquetado de memoria (MTE) (AArch64).
* Branch Target Indicators (BTI) (AArch64) para reducir "la capacidad de un atacante para ejecutar código arbitrario". Al igual que la autenticación de puntero, las instrucciones relevantes no funcionan en versiones anteriores de ARMv8-A.
* Instrucciones del generador de números aleatorios: "proporciona números aleatorios verdaderos y deterministas que se ajustan a diversos estándares nacionales e internacionales".
El 2 de agosto de 2019, Google anunció que Android adoptaría Memory Tagging Extension (MTE).
En marzo de 2021, se anunció ARMv9-A. La base de ARMv9-A son todas las características de ARMv8.5. ARMv9-A también agrega:
* Extensión vectorial escalable 2 (SVE2). SVE2 se basa en la vectorización escalable de SVE para aumentar el paralelismo de nivel de datos (DLP) de grano fino, para permitir que se realice más trabajo por instrucción. SVE2 tiene como objetivo llevar estos beneficios a una gama más amplia de software, incluidos DSP y código SIMD multimedia, que actualmente utilizan Neon. Los códigos de desarrollo LLVM / Clang 9.0 y GCC 10.0 se actualizaron para admitir SVE2.
* Extensión de Memoria Transaccional (TME). Siguiendo las extensiones x86, TME ofrece soporte para Hardware Transactional Memory (HTM) y Transactional Lock Elision (TLE). TME tiene como objetivo brindar concurrencia escalable para aumentar el paralelismo de nivel de subprocesos (TLP) de grano grueso, para permitir que se realice más trabajo por subproceso. Los códigos de desarrollo LLVM / Clang 9.0 y GCC 10.0 se actualizaron para admitir TME.
* Arquitectura informática confidencial (CCA).

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

En septiembre de 2019, se anunció ARMv8.6-A. Sus mejoras se clasifican en estas categorías:
* Multiplicación matricial general (GEMM).
* Soporte del formato Bfloat16 .
* Instrucciones de manipulación de matrices SIMD, BFDOT, BFMMLA, BFMLAL y BFCVT.
* Mejoras para virtualización, gestión de sistemas y seguridad.
* Y las siguientes extensiones (para las que LLVM 11 ya agregó soporte):
** Virtualización de contadores mejorada (ARMv8.6-ECV).
** Trampas de grano fino (ARMv8.6-FGT).
** Virtualización de monitores de actividad (ARMv8.6-AMU).
Por ejemplo, trampas detalladas, instrucciones de espera de evento (WFE), EnhancedPAC2 y FPAC. Las extensiones bfloat16 para SVE y Neon son principalmente para uso de aprendizaje profundo.

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

En septiembre de 2020, se anunció ARMv8.7-A. Sus mejoras se clasifican en estas categorías:
* Extensión de matriz escalable (SME) (solo ARMv9.2). SME agrega nuevas funcionalidades para procesar matrices de manera eficiente, tales como:
** Almacenamiento de azulejos de matriz.
** Transposición matricial sobre la marcha.
** Cargar/almacenar/insertar/extraer vectores de mosaicos.
** Producto exterior matricial de vectores SVE.
** "Modo streaming" SVE.
* Soporte mejorado para conexión en caliente PCIe (AArch64).
* Carga atómica de 64 bytes y almacenamiento en aceleradores (AArch64).
* Esperar instrucción (WFI) y Esperar evento (WFE) con tiempo de espera (AArch64).
* Grabación de registro de sucursal (solo ARMv9.2).

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

En septiembre de 2021, se anunciaron ARMv8.8-A y ARMv9.3-A. Sus mejoras se clasificaron en estas categorías:
* Interrupciones no enmascarables (AArch64).
* Instrucciones para optimizar las operaciones de estilo memcpy y memset (AArch64).
* Mejoras en PAC (AArch64).
* Ramas condicionales insinuadas (AArch64).
LLVM 15 es compatible con ARMv8.8-A y ARMv9.3-A.

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

En septiembre de 2022, se anunciaron ARMv8.9-A y ARMv9.4-A, que incluyen:
* Mejoras en la arquitectura del sistema de memoria virtual (VMSA).
** Dirección indirecta de permisos y superposiciones.
** Endurecimiento de la traducción.
** Tablas de traducción de 128 bits (solo ARMv9).
* Extensión de matriz escalable 2 (SME2) (solo ARMv9).
** Instrucciones multivectoriales.
** Predicados multivectoriales.
** Compresión de peso 2b/4b.
** 1b redes binarias.
** Captura previa de rango.
* Pila de control protegida (GCS) (solo ARMv9).
* Computación confidencial.
** Contextos de cifrado de memoria.
** Asignación de dispositivos.

## ARM-R (arquitectura en tiempo real)

Se agregó compatibilidad opcional con AArch64 al perfil Armv8-R, y el primer núcleo de Arm que lo implementó fue el Cortex-R82. Agrega el conjunto de instrucciones A64, con algunos cambios en las instrucciones de la barrera de memoria.