Introduction
AMX (Intel Advanced Matrix Extensions) multiplies small matrices held in tiles: eight new registers, tmm0 to tmm7, each up to 16 rows of 64 bytes (1 KiB). A program first describes the shape of each tile in a 64-byte block, TILECFG, and loads it with LDTILECFG. It then loads tiles from memory, multiplies them with the dot-product instructions (Intel calls this unit TMUL), which add into an accumulator tile, and stores the result. TILERELEASE puts the tiles back in their initial, unconfigured state.
AMX works in 64-bit mode only. Its state is two XSAVE components: 17, XTILECFG (the 64
bytes of TILECFG), and 18, XTILEDATA (the 8 KiB of tile data). The operating system
must enable both in XCR0. On Linux, a program must also ask for the tile data with
arch_prctl(ARCH_REQ_XCOMP_PERM, XFEATURE_XTILEDATA) before its first AMX
instruction. CPUID leaf 1DH describes the palettes (the tile shapes a processor
supports) and leaf 1EH the TMUL unit.
Intel first described AMX in 2020, and brought it with the Xeon processors code-named Sapphire Rapids (January 2023). Each later extension has its own CPUID bit:
| Extension | What it adds | CPUID | Processor |
|---|---|---|---|
| AMX-TILE | The tiles, TILECFG, loads and stores | (EAX=07H, ECX=0):EDX[bit 24] | Intel Sapphire Rapids, 2023 |
| AMX-INT8 | Dot products of bytes | (EAX=07H, ECX=0):EDX[bit 25] | Intel Sapphire Rapids, 2023 |
| AMX-BF16 | Dot products of BF16 numbers | (EAX=07H, ECX=0):EDX[bit 22] | Intel Sapphire Rapids, 2023 |
| AMX-FP16 | Dot products of halves | (EAX=07H, ECX=1):EAX[bit 21] | Intel Granite Rapids, 2024 |
| AMX-COMPLEX | Multiplies of complex halves | (EAX=07H, ECX=1):EDX[bit 8] | Intel Granite Rapids-D, 2025 |
| AMX-FP8 | Dot products of 8-bit floats | (EAX=1EH, ECX=1):EAX[bit 4] | Announced for Intel Diamond Rapids |
| AMX-TRANSPOSE | Transposes, and multiplies with a transposed source | (EAX=1EH, ECX=1):EAX[bit 5] | Announced in October 2024; withdrawn in September 2025 |
| AMX-TF32 | Multiplies of singles at TF32 precision | (EAX=1EH, ECX=1):EAX[bit 6] | Announced in October 2024; withdrawn in June 2026 |
| AMX-AVX512 | Moves and conversions of a tile row to a zmm register | (EAX=1EH, ECX=1):EAX[bit 7] | Announced for Intel Diamond Rapids |
| AMX-MOVRS | Tile loads with the read-shared hint | (EAX=1EH, ECX=1):EAX[bit 8] | Announced for Intel Diamond Rapids |
Withdrawn and announced. Intel announced AMX-FP8, AMX-TRANSPOSE, AMX-TF32, AMX-AVX512 and AMX-MOVRS in its Architecture Instruction Set Extensions reference in October 2024. It removed AMX-TRANSPOSE from revision 059 of that reference (September 2025), and AMX-TF32 from the June 2026 revision (062). Diamond Rapids, for which the others were announced, was not on sale when this page was written (November 2026); Intel has given 2027. LLVM 21 still decodes AMX-TRANSPOSE, and so does our disassembler, so its instructions are listed here.
When the explorer disassembles a program, each instruction it shows links to its row on these pages.
TILECFG
LDTILECFG reads, and STTILECFG writes, this 64-byte block. With palette 1, the only one defined so far, tiles 0 to 7 are used and the entries for 8 to 15 must be zero. A reserved byte that is not zero, a palette the processor lacks, or a shape larger than the palette allows makes LDTILECFG raise #GP.
| Offset | Size | Field | Meaning |
|---|---|---|---|
| 0 | 1 | palette_id | 0: the initial state, no tiles; 1: eight tiles of up to 16 rows of 64 bytes |
| 1 | 1 | start_row | The row a tile load or store restarts from after a fault; normally 0 |
| 2 | 14 | reserved | Must be 0 |
| 16 | 32 | colsb[16] | The bytes in each row of tiles 0 to 15, 2 bytes each |
| 48 | 16 | rows[16] | The number of rows of tiles 0 to 15, 1 byte each |
Instructions
Every AMX instruction is VEX.128 with W0, apart from AMX-AVX512’s, which are EVEX.512. The forms marked APX are the same instructions in EVEX form, which APX added so that the address registers can be r16 to r31 (see the APX page). In the dot products, tmm1 is the accumulator (ModRM.reg), tmm2 the first source (ModRM.rm) and tmm3 the second (VEX.vvvv).
Configuration (AMX-TILE)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
ldtilecfg | m512 | VEX.128.NP.0F38.W0 49 /0; APX: EVEX.128.NP.0F38.W0 49 /0 | Loads TILECFG from memory and configures the tiles, zeroing them. | AMX-TILE (Intel Sapphire Rapids, 2023) |
sttilecfg | m512 | VEX.128.66.0F38.W0 49 /0; APX: EVEX.128.66.0F38.W0 49 /0 | Stores the current TILECFG (all zeros if the tiles are not configured). | AMX-TILE (Intel Sapphire Rapids, 2023) |
tilerelease | (none) | VEX.128.NP.0F38.W0 49 C0 | Returns the tiles and TILECFG to the initial state. | AMX-TILE (Intel Sapphire Rapids, 2023) |
tilezero | tmm1 | VEX.128.F2.0F38.W0 49 11:rrr:000 | Sets every byte of a tile to zero. | AMX-TILE (Intel Sapphire Rapids, 2023) |
Loads and stores
Tile memory is addressed with a SIB byte (sibmem): the base and
displacement give the address of the first row, and the index register, scaled, the
distance in bytes from one row to the next.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
tileloadd | tmm1, sibmem | VEX.128.F2.0F38.W0 4B /r; APX: EVEX.128.F2.0F38.W0 4B /r | Loads a tile, row by row, as TILECFG shapes it. | AMX-TILE (Intel Sapphire Rapids, 2023) |
tileloaddt1 | tmm1, sibmem | VEX.128.66.0F38.W0 4B /r; APX: EVEX.128.66.0F38.W0 4B /r | The same, with a hint that the data will not be reused soon (as PREFETCHT1). | AMX-TILE (Intel Sapphire Rapids, 2023) |
tilestored | sibmem, tmm1 | VEX.128.F3.0F38.W0 4B /r; APX: EVEX.128.F3.0F38.W0 4B /r | Stores a tile, row by row. | AMX-TILE (Intel Sapphire Rapids, 2023) |
tileloaddrs | tmm1, sibmem | VEX.128.F2.0F38.W0 4A /r; APX: EVEX.128.F2.0F38.W0 4A /r | TILELOADD with the read-shared hint: the data will be read by other cores and not written. | AMX-MOVRS (Intel Diamond Rapids, announced) |
tileloaddrst1 | tmm1, sibmem | VEX.128.66.0F38.W0 4A /r; APX: EVEX.128.66.0F38.W0 4A /r | TILELOADDT1 with the read-shared hint. | AMX-MOVRS (Intel Diamond Rapids, announced) |
Dot products
Each is a matrix multiply: an element of tmm1 (row m, column n) gains the sum of the products of row m of tmm2 with column n of tmm3. tmm3 is in Intel’s VNNI layout: each dword of it holds the consecutive values (four bytes, or two 16-bit numbers) that meet one dword of tmm2. The floating-point forms accumulate into singles.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
tdpbssd | tmm1, tmm2, tmm3 | VEX.128.F2.0F38.W0 5E 11:rrr:bbb | Signed bytes × signed bytes, in groups of four, into dwords. | AMX-INT8 (Intel Sapphire Rapids, 2023) |
tdpbsud | tmm1, tmm2, tmm3 | VEX.128.F3.0F38.W0 5E 11:rrr:bbb | Signed bytes (tmm2) × unsigned bytes (tmm3). | AMX-INT8 (Intel Sapphire Rapids, 2023) |
tdpbusd | tmm1, tmm2, tmm3 | VEX.128.66.0F38.W0 5E 11:rrr:bbb | Unsigned bytes (tmm2) × signed bytes (tmm3). | AMX-INT8 (Intel Sapphire Rapids, 2023) |
tdpbuud | tmm1, tmm2, tmm3 | VEX.128.NP.0F38.W0 5E 11:rrr:bbb | Unsigned bytes × unsigned bytes. | AMX-INT8 (Intel Sapphire Rapids, 2023) |
tdpbf16ps | tmm1, tmm2, tmm3 | VEX.128.F3.0F38.W0 5C 11:rrr:bbb | BF16 pairs × BF16 pairs, into singles. | AMX-BF16 (Intel Sapphire Rapids, 2023) |
tdpfp16ps | tmm1, tmm2, tmm3 | VEX.128.F2.0F38.W0 5C 11:rrr:bbb | Half pairs × half pairs, into singles. | AMX-FP16 (Intel Granite Rapids, 2024) |
tdpbf8ps | tmm1, tmm2, tmm3 | VEX.128.NP.MAP5.W0 FD 11:rrr:bbb | bf8 (E5M2) × bf8, in groups of four, into singles. | AMX-FP8 (Intel Diamond Rapids, announced) |
tdpbhf8ps | tmm1, tmm2, tmm3 | VEX.128.F2.MAP5.W0 FD 11:rrr:bbb | bf8 (tmm2) × hf8 (E4M3, tmm3). | AMX-FP8 (Intel Diamond Rapids, announced) |
tdphbf8ps | tmm1, tmm2, tmm3 | VEX.128.F3.MAP5.W0 FD 11:rrr:bbb | hf8 (tmm2) × bf8 (tmm3). | AMX-FP8 (Intel Diamond Rapids, announced) |
tdphf8ps | tmm1, tmm2, tmm3 | VEX.128.66.MAP5.W0 FD 11:rrr:bbb | hf8 × hf8. | AMX-FP8 (Intel Diamond Rapids, announced) |
tcmmimfp16ps | tmm1, tmm2, tmm3 | VEX.128.66.0F38.W0 6C 11:rrr:bbb | Multiplies matrices of complex halves (a dword each: real part low, imaginary part high) and adds the imaginary parts of the products to the singles of tmm1. | AMX-COMPLEX (Intel Granite Rapids-D, 2025) |
tcmmrlfp16ps | tmm1, tmm2, tmm3 | VEX.128.NP.0F38.W0 6C 11:rrr:bbb | The same, adding the real parts. | AMX-COMPLEX (Intel Granite Rapids-D, 2025) |
tmmultf32ps | tmm1, tmm2, tmm3 | VEX.128.66.0F38.W0 48 11:rrr:bbb | Multiplies matrices of singles, read at TF32 precision (10 fraction bits), and adds the products to the singles of tmm1. | AMX-TF32 (announced 2024, withdrawn 2026) |
ttmmultf32ps | tmm1, tmm2, tmm3 | VEX.128.NP.0F38.W0 48 11:rrr:bbb | The same with tmm2 transposed (AMX-TF32 with AMX-TRANSPOSE). | AMX-TF32 (announced 2024, withdrawn 2026) |
Transposes (AMX-TRANSPOSE, withdrawn)
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
ttransposed | tmm1, tmm2 | VEX.128.F3.0F38.W0 5F 11:rrr:bbb | Transposes a tile of dwords. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
ttdpbf16ps | tmm1, tmm2, tmm3 | VEX.128.F3.0F38.W0 6C 11:rrr:bbb | TDPBF16PS with tmm2 transposed. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
ttdpfp16ps | tmm1, tmm2, tmm3 | VEX.128.F2.0F38.W0 6C 11:rrr:bbb | TDPFP16PS with tmm2 transposed. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
ttcmmimfp16ps | tmm1, tmm2, tmm3 | VEX.128.F2.0F38.W0 6B 11:rrr:bbb | TCMMIMFP16PS with tmm2 transposed. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
ttcmmrlfp16ps | tmm1, tmm2, tmm3 | VEX.128.F3.0F38.W0 6B 11:rrr:bbb | TCMMRLFP16PS with tmm2 transposed. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
tconjtcmmimfp16ps | tmm1, tmm2, tmm3 | VEX.128.NP.0F38.W0 6B 11:rrr:bbb | TCMMIMFP16PS with tmm2 transposed and conjugated. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
tconjtfp16 | tmm1, tmm2 | VEX.128.66.0F38.W0 6B 11:rrr:bbb | Transposes a tile of complex halves and conjugates them (negates the imaginary parts). | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
t2rpntlvwz0 | tmm1, sibmem | VEX.128.NP.0F38.W0 6E /r; APX: EVEX.128.NP.0F38.W0 6E /r | Loads a pair of tiles, transposed, into the VNNI layout. tmm1 is the even tile of the pair; ModRM.reg’s bit 0 is ignored. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
t2rpntlvwz0t1 | tmm1, sibmem | VEX.128.NP.0F38.W0 6F /r; APX: EVEX.128.NP.0F38.W0 6F /r | The same, with the T1 hint. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
t2rpntlvwz1 | tmm1, sibmem | VEX.128.66.0F38.W0 6E /r; APX: EVEX.128.66.0F38.W0 6E /r | The second form of the pair load (Z1). | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
t2rpntlvwz1t1 | tmm1, sibmem | VEX.128.66.0F38.W0 6F /r; APX: EVEX.128.66.0F38.W0 6F /r | The Z1 form, with the T1 hint. | AMX-TRANSPOSE (announced 2024, withdrawn 2025) |
t2rpntlvwz0rs | tmm1, sibmem | VEX.128.NP.MAP5.W0 F8 /r; APX: EVEX.128.NP.MAP5.W0 F8 /r | T2RPNTLVWZ0 with the read-shared hint (AMX-MOVRS with AMX-TRANSPOSE). | AMX-MOVRS (Intel Diamond Rapids, announced) |
t2rpntlvwz0rst1 | tmm1, sibmem | VEX.128.NP.MAP5.W0 F9 /r; APX: EVEX.128.NP.MAP5.W0 F9 /r | T2RPNTLVWZ0T1 with the read-shared hint. | AMX-MOVRS (Intel Diamond Rapids, announced) |
t2rpntlvwz1rs | tmm1, sibmem | VEX.128.66.MAP5.W0 F8 /r; APX: EVEX.128.66.MAP5.W0 F8 /r | T2RPNTLVWZ1 with the read-shared hint. | AMX-MOVRS (Intel Diamond Rapids, announced) |
t2rpntlvwz1rst1 | tmm1, sibmem | VEX.128.66.MAP5.W0 F9 /r; APX: EVEX.128.66.MAP5.W0 F9 /r | T2RPNTLVWZ1T1 with the read-shared hint. | AMX-MOVRS (Intel Diamond Rapids, announced) |
Tile rows to zmm registers (AMX-AVX512)
Each reads one row of a tile, picked by a general register or an immediate, into a zmm register.
| Instruction | Forms | Encoding | What it does | Set |
|---|---|---|---|---|
tilemovrow | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.66.0F38.W0 4A /r; EVEX.512.66.0F3A.W0 07 /r ib | Copies a row of the tile. | AMX-AVX512 (Intel Diamond Rapids, announced) |
tcvtrowd2ps | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.F3.0F38.W0 4A /r; EVEX.512.F3.0F3A.W0 07 /r ib | Converts a row of signed dwords to singles. | AMX-AVX512 (Intel Diamond Rapids, announced) |
tcvtrowps2phh | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.NP.0F38.W0 6D /r; EVEX.512.NP.0F3A.W0 07 /r ib | Converts a row of singles to halves, into the high half of each dword. | AMX-AVX512 (Intel Diamond Rapids, announced) |
tcvtrowps2phl | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.66.0F38.W0 6D /r; EVEX.512.F2.0F3A.W0 77 /r ib | The same, into the low half of each dword. | AMX-AVX512 (Intel Diamond Rapids, announced) |
tcvtrowps2bf16h | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.F2.0F38.W0 6D /r; EVEX.512.F2.0F3A.W0 07 /r ib | Converts a row of singles to BF16, into the high half of each dword. | AMX-AVX512 (Intel Diamond Rapids, announced) |
tcvtrowps2bf16l | zmm1, tmm2, r32; zmm1, tmm2, imm8 | EVEX.512.F3.0F38.W0 6D /r; EVEX.512.F3.0F3A.W0 77 /r ib | The same, into the low half of each dword. | AMX-AVX512 (Intel Diamond Rapids, announced) |
Notes
- 64-bit mode only. Outside it the opcodes are invalid.
- Eight tiles. A tile number needs only the three bits of ModRM.reg, ModRM.rm or VEX.vvvv. We treat an encoding whose extra register bits (VEX.R, VEX.B, the top bit of vvvv, and in EVEX form R4, X and B4) would name tile 8 or above as invalid, as LLVM does.
- Tile memory. A load or store without a SIB byte is invalid. A SIB index of 100 (no index register) is shown with no index, as LLVM shows it.
- Unconfigured tiles. The tile instructions other than LDTILECFG, STTILECFG and TILERELEASE raise #UD while the tiles are in the initial state (palette 0).
- AMX-TRANSPOSE’s pair loads name a pair of tiles by its even register; LLVM shows it as that one tile, and so do we.
Links
Reference
- Intel 64 and IA-32 Architectures Software Developer’s Manuals – Intel’s manual, which describes the tiles, TILECFG and the AMX instructions of shipping processors
- Intel Architecture Instruction Set Extensions and Future Features Programming Reference – Intel’s reference to the later AMX extensions before they reach the manual
- AMD64 Architecture Programmer’s Manual, Volume 4 – AMD’s reference to the 128-bit, 256-bit and 512-bit media instructions
- Using XSTATE features in user space applications – the Linux kernel’s documentation of the permission a program needs before using AMX