ARMv8-A vs Cortex-A vs AArch64
Term | What it is | Where it shows up | How it relates to the others |
---|---|---|---|
ARMv8 (esp. ARMv8-A) | An architecture/ISA version specification (feature set). v8-A introduced 64-bit and modern extensions. | Docs, compiler flags like -march=armv8-a . |
A Cortex-A core implements some revision of ARMv8-A (v8.0-A, v8.2-A, etc.). It can support 32-bit (AArch32) and/or 64-bit (AArch64) states. |
Cortex-A | A CPU core family (microarchitectures) for the A-profile (apps/phones/tablets/laptops). Examples: Cortex-A53, A57, A72, A76, A55, X-series, etc. | CPU marketing names, /proc/cpuinfo , lscpu . |
Each Cortex-A core is an implementation of an ARMv8-A (or ARMv9-A) ISA revision and thus exposes AArch64 (and sometimes AArch32). |
AArch64 | The 64-bit execution state / register width of the ARM ISA (the 64-bit instruction set and ABI). | OS/ABI names like aarch64-linux-gnu , uname -m → aarch64 , package arch “arm64” (synonym). |
AArch64 is a mode provided by ARMv8-A (and ARMv9-A) implementations like Cortex-A cores. |
Mental model
- ARMv8-A = the what (spec/features).
- Cortex-Axx = the how (a specific core design that implements that spec).
- AArch64 = the 64-bit mode you run code in on those cores.
Common gotchas
- arm64 vs aarch64: usually the same thing in practice (arm64 is the distro/Apple label; aarch64 is the GNU/ABI name).
- AArch32 vs AArch64: 32-bit vs 64-bit execution states. Some ARMv8-A chips support both; some newer ones drop AArch32.
- Profiles: A-profile (apps) = Cortex-A/Neoverse; R-profile (real-time) = Cortex-R; M-profile (MCU) = Cortex-M. Only A-profile runs desktop/mobile OSes like Linux/Android/macOS.
Practical examples
- Cortex-A53: ARMv8-A core, supports AArch64 (64-bit) and AArch32 (32-bit).
-
Build flags:
- Portable 64-bit:
-march=armv8-a
(enables AArch64 baseline). - Target a core:
-mcpu=cortex-a53
(or-mcpu=cortex-a72
) and optionally-mtune=…
for perf.
- Portable 64-bit:
How to check on your machine
- Linux:
uname -m
→aarch64
means you’re running 64-bit. - Linux:
lscpu
shows “Architecture: aarch64” and “Model name” with the Cortex/SoC info. - macOS on Apple Silicon:
uname -m
→arm64
(Apple’s label for AArch64).
If you tell me your device/SoC (e.g., “Cortex-A55” or “Snapdragon 888”), I can map exactly which ARMv8-A revision and features (NEON/ASIMD, crypto, etc.) you have and suggest the right compiler flags.
Nice—here’s how Cortex-A76 maps to your terms and what it gives you:
- What it is: a specific Cortex-A family core (A-profile) that implements Armv8-A, with Armv8.2-A as the baseline. It runs AArch64 at all exception levels (EL0–EL3) and supports AArch32 only at EL0 (i.e., 32-bit user apps if the OS allows). (Internet Archive)
-
Key ISA features present (beyond v8.0):
- v8.1-A: LSE atomics (CAS, LDADD, etc.). (Internet Archive, Arm Learning Paths)
- v8.2-A: FP16 arithmetic in NEON/FP. (Internet Archive, Arm Developer)
- v8.3-A (subset): LDAPR (load-acquire). (Internet Archive)
- v8.4-A: Dot-product (SDOT/UDOT) for int8 ML/vision code. (Internet Archive, Arm Developer)
- v8.5-A (subset): SSBS & speculation barriers. (Internet Archive)
- Also: RAS, GICv4, PMUv3; crypto extension is optional per SoC. (Internet Archive)
- Not supported: SVE/SME (those appear in later cores). (Implied by A76 TRM feature list.) (Internet Archive)
Build it right
- GCC/Clang (best default):
-mcpu=cortex-a76
This selects Armv8.2-A and enables FP16, dot-product, RCpc, SSBS, plus tuning for A76. (Android Git Repositories) - Portable alt (explicit ISA):
-march=armv8.2-a+fp16+dotprod+lse -mtune=cortex-a76
(Use when you want to guarantee those instructions while still tuning for A76.) (Arm Learning Paths, Arm Developer)
Real-world anchor
- Raspberry Pi 5 uses a quad-core Cortex-A76 @ 2.4 GHz (AArch64), which is a handy public reference platform. (Raspberry Pi Datasheets)
If you want, tell me your OS/toolchain and I’ll drop in copy-pasteable CFLAGS/LDFLAGS (and a quick lscpu
feature check) tailored to your box.