Mobile SoC Architecture

ARM Cortex-X925 Microarchitecture: Branch Prediction and Cache Hierarchy

By David Okonkwo, Embedded Systems Engineer • September 13, 2026 • 9 min read
Cortex-X925Branch PredictionL2 CacheOut-of-Order Execution

Cortex-X925 is ARM's third-generation X-series core under the rebranded “Blackhawk” program, and it is the most aggressive single-thread uplift ARM has shipped since the X1. With a 10-wide decode front-end, a redesigned hybrid branch predictor, and a doubled private L2, the core targets a 36% IPC gain over Cortex-X4 at iso-frequency while holding mobile power under 4W. For flagship SoCs like Dimensity 9400 and next-gen Samsung Exynos designs, that efficiency determines whether performance is sustainable or just a Geekbench spike.

This analysis dissects the two subsystems that define X925's real-world throughput: the decoupled branch prediction pipeline and the three-level cache hierarchy built around DSU-120. We will trace how instructions flow from fetch to retire, why mispredicts hurt less, and how the private L2 trade-off reshapes cluster floorplanning and mobile edge computing performance under thermal constraints.

1. Pipeline at a Glance: From 6-Wide to 10-Wide

X925 raises the front-end width without naively widening everything. Fetch itself remains 8-wide from the 64KB L1 I-cache, but the decode stage expands to 10 instructions per cycle, up from 6 in X4 and 8 in X3. ARM achieved this by splitting the legacy 6-wide decoder into two 5-wide clusters with independent pre-decode and micro-op cracking logic. Simple ALU ops still map 1:1, while complex loads with shift or SVE2 predicates crack into two micro-ops.

Behind decode, rename is 8-wide and dispatch is 10-wide into a rebalanced out-of-order window: ~410-entry reorder buffer (ROB), 240-entry rename pool, and distributed schedulers holding ~110 entries. The execution back-end fields four integer ALUs (two with branch resolution), three address-generation/load-store units, and two 128-bit SIMD/FP pipes that can fuse for 256-bit SVE2 operations. The key insight is that width only helps if the front-end keeps it fed — which is where branch prediction becomes the bottleneck.

Cortex-X925 Block Diagram - Frontend to Cache Hierarchy FRONTEND 64KB I-Cache • 8-wide Fetch Decoupled Queue 24 entries BRANCH PREDICTOR TAGE-SC 8K + ITTAGE 48-entry RAS • 32 BTB DECODE & RENAME 10-wide Decode / 8-wide Rename Micro-op Cache 4K entries DISPATCH • ROB 410 10-wide • 110 scheduler 240 rename regs OUT-OF-ORDER ENGINE 4× ALU • 2× BRANCH • 3× AGU 2× SIMD/FP 128b (SVE2) INT Queue LS Queue FP Queue ROB Retire 10/cycle MEMORY HIERARCHY 64KB D-Cache 4-way 4-cycle Private L2 1–2MB 8-way 26c DSU-120 L3 4–12MB 16-way MOB 72 • STQ 56 • Prefetchers L1/L2 AMBA CHI • 32B/cycle * Inclusive private L2 • Exclusive L3 option • 3nm implementation @ 3.62 GHz peak
Figure 1 — Cortex-X925 logical pipeline. Frontend and predictor are decoupled via a 24-entry fetch queue; private L2 remains inclusive to L1.

2. Branch Prediction: TAGE-SC, ITTAGE, and Faster Redirect

On a 10-wide machine with an 11-stage mispredict penalty, every percent of MPKI (mispredicts per kilo-instructions) costs measurable IPC. ARM quotes a 12–13% reduction in MPKI versus X4 on SPECint 2017 and a larger 18% win on Android framework traces where indirect branches dominate. The improvement comes from three changes.

Mobile Connectivity Standards Comparison
Feature 5G NR Wi-Fi 7 Bluetooth 5.4
Peak Throughput20 Gbps46 Gbps2 Mbps
Latency1–4 ms1–2 ms3–6 ms
RangeSeveral km30–50 m100–400 m
Power DrawHighMediumUltra-low
Primary UseCellular dataLocal networkingPeripherals/IoT

Hybrid TAGE with Statistical Corrector

The main direction predictor is now a tagged geometric history predictor (TAGE-SC) with eight tables indexed by geometrically increasing global history lengths (from 8 to 240 branches). Capacity grows to roughly 8K entries for the longest-history table, double X4's 4K, plus a loop predictor for tight counted loops and a 2K-entry statistical corrector (SC) that learns from TAGE's systematic bias — typically when history aliasing mispredicts correlated branches. The predictor runs ahead of fetch, delivering one taken branch per cycle and up to two with a folded branch target buffer (BTB).

Crucially, ARM added a second-level “FTQ” — a fetch target queue that decouples prediction from I-cache access. Even on an I-cache miss, the predictor continues running and queuing up to 24 fetch blocks. When the line returns, fetch can burst without starving decode. This hides L1 I misses that previously stalled the predictor in X1–X3 lineage.

Indirect Targets and Returns

Mobile code is indirect-heavy: virtual calls in Android Runtime, pointer authentication branches, and high-level UI dispatch. X925 introduces a dedicated ITTAGE (Indirect TAGE) structure with a 1K-entry target cache indexed by history, separate from the conditional TAGE. Combined with a 32-entry, two-way associative L1 BTB backing a 8K-entry L2 BTB, it cuts indirect mispredicts by 28% over X4 in ART benchmarks.

The return address stack (RAS) also deepens to 48 entries with speculative repair — earlier X cores flushed RAS on mispredict. X925 checkpoints RAS on each call and restores on redirect, avoiding the cascade of return mispredicts after a single wrong-path call.

Why it matters for security: The larger predictor increases speculation depth, so ARM pairs it with stricter speculation barriers — CSV2, FEAT_CSV2_2, and enhanced branch target identification (BTI). For teams hardening devices, predictor state is not architecturally visible, but timing side-channels still require full-disk encryption with hardware-bound keys and kernel pointer authentication to be enabled alongside prediction.

Redirect Latency

Even a perfect predictor still mispredicts. X925 shortens the flush path from 13 cycles (X4) to 11 cycles by resolving branches earlier in the ALU pipes and broadcasting redirect to fetch in the same cycle. The decoupled queue means only the youngest ~16–20 instructions are flushed versus 30+ on X3, preserving prefetcher training and L1 locality after a mispredict.

3. Cache Hierarchy: Private L2 Grows Up

ARM's cache philosophy flipped at X4: the private L2 became mandatory and inclusive, and X925 doubles down. Each X925 core owns its own L2, distinct from the DynamIQ Shared Unit (DSU-120) L3. The configuration spectrum documented in r0p0 is:

  • L1 I-cache: 64KB, 4-way, 64B lines, parity-protected, 3-cycle hit
  • L1 D-cache: 64KB, 4-way, 64B lines, ECC, 4-cycle load-to-use, 4× 128-bit read ports via banking
  • Private L2: 1MB, 1.5MB, or 2MB, 8-way, inclusive of L1, 26-cycle load-to-use at 2MB (24c at 1MB), 32B/cycle per direction
  • DSU-120 L3: 2MB–12MB shared, 16-way, 35–48 cycles depending on slice, up to 8 cores

Inclusive L2 simplifies coherence — the L2 holds a superset of L1 tags, so snoops need only check L2. The trade-off is capacity efficiency, but ARM argues mobile working sets fit neatly: 64KB+1MB captures >92% of Android app footprint without spilling to shared L3, which reduces interconnect traffic and benefits biometric authentication pipelines where L3 contention can jitter latency.

Prefetching and Streaming

Each L1 and the private L2 carries its own stride prefetcher. The L1 D prefetcher tracks up to 32 streams with 4KB distance, the L2 prefetcher tracks 48 streams and can issue prefetches into L3 without polluting L2 unless confidence exceeds 75%. A separate instruction prefetcher monitors L1 I miss patterns and pushes next-line prefetches into L2. For contiguous media workloads, ARM shows bandwidth rising from 28 GB/s (X4 cluster) to 38 GB/s under the same LPDDR5X-8533 PHY — largely because the private L2 filters 31% of L3 accesses.

DSU-120 Shared Fabric

The cluster-level DSU-120 remains the coherence point, supporting up to 14 MB combined L3 (when configured with 12 MB + core L2s). New in this generation is a dynamic exclusive/shared policy: L3 can be configured as exclusive to private L2s for large gaming workloads (avoiding duplication) or inclusive for background-task heavy use. The interconnect is AMBA 5 CHI with 32B data channels, supporting CHI cache stashing for accelerators — relevant for quantum-resistant crypto accelerators that benefit from stashing public keys directly into X925's L2.

FeatureCortex-X3Cortex-X4Cortex-X925
Decode / Rename / Dispatch6 / 6 / 86 / 8 / 810 / 8 / 10
ROB / Scheduler entries320 / 64384 / 96410 / ~110
Branch predictorTAGE 4K + BTB 6KTAGE-SC 4K + BTB 8KTAGE-SC 8K + ITTAGE 1K + SC 2K
Return stack / L1 BTB32 / 32 entries32 / 3248 / 32 (2-way)
L1 I / D64KB / 64KB64KB / 64KB64KB 3c / 64KB 4c (banked)
Private L2512KB–1MB opt. 8-way1–2MB inclusive 8-way1–2MB incl. 26c, 32B/cycle
Shared L3 (DSU)DSU-110 8MBDSU-120 8MBDSU-120 up to 12MB, excl. mode
Mispredict penalty13 cycles13 cycles11 cycles
Peak frequency (3nm)3.2 GHz3.4 GHz3.62 GHz

4. Out-of-Order Memory and Store Behavior

X925's load-store unit couples the larger window with a more aggressive memory disambiguation. The memory order buffer (MOB) holds 72 loads and 56 stores in flight. A 6K-entry memory dependence predictor learns store-load aliases using a hash of PC and address, allowing loads to bypass unresolved stores with ~98.5% accuracy.

Two load pipelines can each deliver 32 bytes per cycle from L1, and store bandwidth is 32B/cycle via the 56-entry store queue that supports coalescing and 128-bit atomic vector stores for SVE2. For encrypted I/O paths, this matters: AES-XTS scheduling benefits from dual-load issue, while the larger store queue prevents ROB stalls during memcpy-heavy file encryption.

Memory tagging (MTE) and pointer authentication remain on the critical path. ARM reduced MTE tag-check latency by merging tag lookup with L1 access, so heap-hardened builds pay only ~1–2% overhead versus ~3% on X3. Realm Management Extension (RME) adds a granule protection check at L2, off the L1 critical path, preserving that 4-cycle load-to-use.

Spec & Configuration Example — ARMv9.2 + L2 Sizing
# Read CTR_EL0 to confirm cache line size and architecture
MRS  X0, CTR_EL0          // CTR: DminLine=64B, IminLine=64B, IDC/DIC present
MRS  X1, CLIDR_EL1        // Caches: L1 I/D + L2 + L3 via DSU-120
MRS  X2, CCSIDR_EL1       // Query L2 size: associativity=8, sets=2048 for 1MB

# Linux DT / ACPI PPTT fragment for a 1× X925 + 3× A725 + 4× A520 cluster
cpu@0: { compatible = "arm,cortex-x925"; reg = <0>;
         i-cache-size = <0x10000>;    // 64KB
         d-cache-size = <0x10000>;
         next-level-cache = <&L2_0>; }
L2_0: { cache-size = <0x200000>; // 2MB private, inclusive
        cache-level = <2>; cache-unified; }

# Prefetcher control (implementation-defined, EL3/EL1 trap)
MSR  S3_6_C15_C1_0, X3    // CPUECTLR_EL1: bits 12-14 L2 prefetch distance=8, stride=on

5. Physical Trade-offs and What It Means for SoCs

Width and predictor storage cost area. ARM lists X925 at ~1.42 mm² per core with 1 MB L2 on TSMC N3E (versus ~1.18 mm² for X4). Most of that delta is L2 data array and TAGE tables — both SRAM-heavy. Dynamic power is offset by clock gating: the decoupled fetch queue allows the predictor to sleep during correct-path bursts, and the second-level BTB is accessed only on L1 BTB miss, saving ~90 mW at 3.3 GHz on a Dhrystone loop.

For system designers, the recommendation is shifting: pair X925 with 2 MB private L2 for sustained gaming flagships, but stay at 1 MB for ultra-thin foldables where die area and leakage dominate. In either case, keep L3 at 4–8 MB for heterogeneous compute — the DSU slice is power-gated per cluster state, so unused L3 ways do not burn leakage during light use, which helps MEC workloads that burst to the X925 and park быстро.

On methodology, expect SPEC CPU 2017 int to be the best showcase for X925 (estimated +36% IPC), while web browsing traces see +15–20% due to front-end bound phases. Thermal throttling compresses the gap after 8–10 seconds; sustained power is the real differentiator, not peak Geekbench.

Bottom line: Cortex-X925 is not just a wider X4. By decoupling prediction, scaling TAGE-SC and ITTAGE, and making a large inclusive private L2 mandatory, ARM attacks the two historical mobile bottlenecks — branch mispredicts and L3 contention — at once. The result is a core that scales better with 3nm frequencies and LPDDR5X bandwidth, provided vendors invest the SRAM budget and tune prefetchers for Android's indirect-heavy reality.

Related Analysis

Frequently Asked Questions

How does Cortex-X925 branch prediction differ from Cortex-X4?

X925 uses a larger 8K-entry TAGE-SC with a 2K statistical corrector and a separate 1K-entry ITTAGE for indirect branches, plus a 48-entry checkpointed RAS. A 24-entry decoupled fetch queue lets prediction run ahead of I-cache misses, and redirect latency drops from 13 to 11 cycles, yielding ~12% lower MPKI vs X4.

What are the L1 and L2 cache sizes in Cortex-X925?

Each core has a 64KB 4-way L1 I-cache (3 cycles) and 64KB 4-way L1 D-cache (4 cycles, 4-cycle load-to-use). The private inclusive L2 is configurable to 1 MB, 1.5 MB, or 2 MB (8-way, ~24–26 cycles). The cluster then shares 4–12 MB of L3 via DSU-120.

Is Cortex-X925 still ARMv9.2-A?

Yes. It implements ARMv9.2-A with SVE2, optional SME2 at the DSU level, pointer authentication (APA3), BTI, memory tagging (MTE), and Realm Management Extensions (RME) for confidential compute. Crypto extensions including AES, SHA-2/3 remain mandatory.

How wide is the Cortex-X925 out-of-order engine?

10-wide decode, 8-wide rename, 10-wide dispatch into a ~410-entry ROB with ~110 scheduler entries and 240 rename registers. Execution has 4 ALU, 3 AGU/load-store, and 2× 128-bit SIMD/FP units (combinable for 256-bit SVE2), retiring up to 10 micro-ops per cycle.

References & Standards: USB Implementers Forum · GSMA Intelligence