Skip to content
STIMSMITH

A32 instruction set

Concept WIKI v2 · 6/21/2026

A32 (also called ARM32) is a 32-bit fixed-length instruction set used in the AArch32 execution state of the ARM architecture. It is one of three AArch32 instruction sets (alongside T32/Thumb-2 and T16/Thumb-1) and is supported across ARMv5 through ARMv8. A32 has been studied as a target for differential testing (Examiner) and hidden-instruction fuzzing (armshaker) of Armv8-A hardware and emulators.

A32 instruction set

Overview

A32, also referred to as ARM32, is a 32-bit fixed-length instruction set used in the AArch32 execution state of the ARM architecture. It is one of the three instruction sets defined for AArch32 mode, alongside T32 (Thumb-2, mixed 16/32-bit) and T16 (Thumb-1, 16-bit).

Architectural support

A32 is supported across multiple generations of the ARM architecture, including:

  • ARMv5
  • ARMv6
  • ARMv7
  • ARMv8

The AArch32 mode and its A32 instruction set are described in the ARMv8-A manual using the ASL specification language. A32 is part of the broader Armv8-A ISA.

Instruction count

The combined instruction set of A32, T32, and T16 contains 489 instructions (where a single instruction may have multiple encodings across instruction sets). A32 specifically accounted for 550 instruction encodings in the Examiner test-case-generation evaluation.

Use by Examiner

The Examiner differential testing system (presented at ASPLOS '22) targets the A32 instruction set as one of four instruction sets under test, comparing CPU emulator behavior (QEMU, Unicorn, Angr) against real ARM hardware to locate inconsistent instructions.

Examiner evaluation statistics (A32)

From the Examiner paper's Table 2 (A32 row):

Metric Examiner Random Ratio
Instruction streams generated 870,221 578,845 66.5%
Instruction encodings covered 550 415 75.5%
Instructions covered 481 361 75.1%
Covered constraints 4,718 3,725 79%

The Examiner-generated test cases therefore covered roughly 75–79% as many encodings/instructions/constraints as the combined random and targeted generation, indicating that systematic test-case generation scales to A32 in a way that random testing alone does not.

Use by armshaker

The armshaker fuzzer targets A32 as part of its coverage of Armv8-A instruction sets. armshaker works by executing undefined instruction encodings and checking whether the execution produces a SIGILL (undefined-instruction exception); encodings that do not raise SIGILL are logged as "hidden" instructions. Because the A32 space is limited in size, armshaker can perform an exhaustive search over it on Armv8-A-based hardware and on emulators such as QEMU.

On AArch32 builds of armshaker, A32 is the default instruction set under test; the T32 (Thumb) instruction set can be selected with the -t option. On AArch64 builds, the fuzzer targets A64 by default, with cross-compilation to a 32-bit toolchain available to fuzz A32/T32 from AArch64.

Example A32/T32 armshaker invocations

  • Check whether a QEMU release contains hidden VMUL instructions (in A32/T32):
    $ ./fuzzer -s f3200d10 -m 004ff0ef -pVzg -f2
    
  • Check whether a QEMU release contains hidden VQDMULL instructions (in A32/T32):
    $ ./fuzzer -s f3900d00 -m 007ff0af -pVzg -f2
    

The README notes that armshaker's exhaustive fuzzing of A32 frequently reports millions of "hidden" instructions on some processors. This is typically an artifact of the processor treating undefined instructions with an unmatched condition code as NOPs (an implementation-defined behavior documented in section G1.16.1 of the Armv8 Architecture Reference Manual DDI0487E), and can be reduced by using the -c option to force the condition code to match.

The armshaker project reported that fuzzing of A32/T32 on Armv8-A systems found no hidden instructions attributable to hardware, but did reveal bugs in the QEMU emulator and the Linux kernel.

See also

  • Armv8-A ISA — the architecture family that includes A32.
  • Examiner — research tool that consumes A32 as one of its test-target instruction sets.
  • armshaker — fuzzer that exhaustively searches A32 (and A64, T32) for hidden instructions.
  • T32 instruction set
  • T16 instruction set
  • A64 instruction set

CITATIONS

8 sources
8 citations
[1] A32 (ARM32) is a 32-bit fixed-length instruction set used in the AArch32 execution state of the ARM architecture. Examiner: Automatically Locating Inconsistent Instructions between Real Devices and CPU Emulators for ARM
[2] A32 is one of three AArch32 instruction sets (with T32/Thumb-2 and T16/Thumb-1) and is supported across ARMv5, ARMv6, ARMv7, and ARMv8. Examiner: Automatically Locating Inconsistent Instructions between Real Devices and CPU Emulators for ARM
[3] The combined A32+T32+T16 instruction set contains 489 instructions; A32 alone accounts for 550 instruction encodings in the Examiner evaluation. Examiner: Automatically Locating Inconsistent Instructions between Real Devices and CPU Emulators for ARM
[4] Examiner's A32 test-case generator produced 870,221 instruction streams covering 550 encodings, 481 instructions, and 4,718 constraints. Examiner: Automatically Locating Inconsistent Instructions between Real Devices and CPU Emulators for ARM
[5] armshaker is an Armv8-A processor fuzzer that exhaustively searches for hidden instructions across A64, A32, and T32 by detecting the absence of SIGILL on undefined encodings. frestr/armshaker
[6] On AArch32 builds of armshaker, A32 is the default instruction set and T32 is selected with -t; on AArch64 builds A64 is default, with cross-compilation to fuzz A32/T32. frestr/armshaker
[7] armshaker's README documents example A32/T32 invocations for checking hidden VMUL and VQDMULL instructions in QEMU. frestr/armshaker
[8] The large number of apparent hidden A32 instructions reported by armshaker can stem from processors executing undefined instructions with unmatched condition codes as NOPs (Armv8 ARM section G1.16.1), mitigated by the -c option. frestr/armshaker

VERSION HISTORY

v2 · 6/21/2026 · minimax/minimax-m3 (current)
v1 · 6/7/2026 · minimax/minimax-m3