SIMD Instruction Format
Did you know, that Intel has a naming scheme for their SIMD instructions? Neither did I.
I found, by watching a CppCon talk by Tim Haines, that
SIMD instruction have a pre-defined scheme which can be used to easily decode the, sometimes, cryptic mnemonics.
To much of my surprise, it’s not mentioned nor explained in any of Intel’s manuals.
Format
An instruction is composed of these parts:
[PREFIX][OPCODE][ALIGNMENT][PACKING][PRECISION]
PREFIX (Optional): Whether the instruction is AVX or SSE. Possible values: A[V]X, or left out
OPCODE: The operation to perform. Possible values: Any basic arithmetic instruction (e.g ADD/SUB/MUL), MOV
ALIGNMENT (Optional): The alignment requirements of the data, only applicable to a few instructions. Possible values: [A]ligned, [U]naligned
PACKING: Whether it’s a packed operation or operation on a single scalar. Possible values: [P]acked, [S]calar
PRECISION: Whether it operates on single or double precision floats. Possible values: [S]ingle-Precision float, [D]ouble-Precision float
Examples
MOVAPD: [MOV][A][P][D]. [MOV]e [A]ligned [P]acked [D]ouble-Precision float
SUBSS: [SUB][S][S]. [SUB]tract [S]calar [S]ingle-Precision float
VMOVSS: [V][MOV][S][S]. A[V]X [MOV]e [S]calar [S]ingle-Precision float
Caveat
This does only apply to a few basic instructions, namely the basic arithmetic and MOV instructions.
Many instructions, added later in SSE2/3/4 are very specialized, which can be applied vertically or horizontally, use non-temporal stores, etc.
Feedback
Feedback, criticism? Tweet me at @ArvidGerstmann.