Instruction
TCVTROWPS2BF16H
Moves one row of a tile to a ZMM register, converting single precision to bfloat16 in the high half of each dword and zeroing the low half.
- Extensions
- Forms
- 2 (2 EVEX)
- Data
- Intel XED v2026.08.23
TCVTROWPS2BF16H moves one row of singles from a tile into a ZMM register as TILEMOVROW does and rounds each to bfloat16, which goes in the high half of its dword; the low half is zero. TCVTROWPS2BF16L puts it in the low half instead. So 16 singles stay 16 dwords, unlike VCVTNEPS2BF16, which packs them into half a register. As in TILEMOVROW, a row past the tile’s rows gives a zero register, and elements past the row’s width are zero dwords.
The rounding
A bfloat16 number is the upper 16 bits of a single, so the conversion drops the low 16 bits, always rounding to nearest even: 1 + 2^-8 (3F808000H) is a tie and gives 3F80H, 1 + 3 × 2^-8 (3F818000H) gives 3F82H, and -pi (C0490FDBH) gives C049H. The largest single rounds up to +infinity (7F80H). A denormal single becomes a zero of its sign, such as 80000001H to 8000H, and an infinity stays one. A NaN keeps its upper bits and is made quiet: the signaling 7F800001H gives 7FC0H. MXCSR is neither read nor written and nothing is flagged, and there is no embedded rounding.
Pairs for the next multiply
A zero half makes a row easy to merge. TDPBF16PS wants two consecutive rows of its B interleaved in pairs, and that is what a bitwise OR of a TCVTROWPS2BF16L of one row with a TCVTROWPS2BF16H of the next produces, element by element. VCVTNE2PS2BF16 packs two sources one after the other rather than pairing them, so it does not give that layout.
In our builds
GCC 14 has no -mamx-avx512 option. With it and -mavx512bf16, Clang 23 at
-O2 compiles _tile_cvtrowps2bf16h(2, r) to tcvtrowps2bf16h zmm0, tmm2, edi; _tile_cvtrowps2bf16hi(2, 1) gives the immediate form,
whose bytes for ZMM1 and TMM2 are 62 F3 7F 48 07 CA 01. An OR of the two
immediate intrinsics on rows 0 and 1 came out as TCVTROWPS2BF16L,
TCVTROWPS2BF16H and VORPS. Zen 5 has no AMX, and this site’s recorded
cases include none of TCVTROWPS2BF16H.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
TCVTROWPS2BF16H zmm, tmm, r32 64-bit mode only
TCVTROWPS2BF16H_ZMMbf16_TMMf32_GPR32u32 | EVEX.512.F2.0F38.W0 6D /r | ACE v1 or AMX_AVX512 |
TCVTROWPS2BF16H zmm, tmm, imm8 64-bit mode only
TCVTROWPS2BF16H_ZMMbf16_TMMf32_IMM8 | EVEX.512.F2.0F3A.W0 07 /r ib | ACE v1 or AMX_AVX512 |
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
on = xcr0 if cr4 >> 18 & 1 else 0 # XCR0, where CR4.OSXSAVE is set
if on >> 17 & 3 != 3: # TILECFG and TILEDATA
fault(UD)
if on & 0xE6 != 0xE6: # AVX-512's state, AVX's and
fault(UD) # SSE's
if palette == 0 or not tmm2.rows: # no configuration, or a tile it
fault(UD) # leaves out
if tmm2.colsb % 4: # whole dwords
fault(UD)
if cr0 >> 3 & 1 or xfd >> 18 & 1: # CR0.TS, or the OS keeps the
fault(NM) # tiles from this thread
# ACE's exception class for these forms asks for XCR0 bit 20
# (SCALEDATA) too
r = src3 & 15 # bits 3:0 of imm8 or r32
x = tmm2.row[r]
n = tmm2.colsb // 4 if r < tmm2.rows else 0
for i in range(16):
if i < n:
v = to_bf16_ne(x.f32[i])
zmm1.d[i] = v << 16 # the low half 0
else: # past the tile's rows or colsb
zmm1.d[i] = 0
start_row = 0Not run on a processor: none of these processors has AMX.
Operands
| Operand | Kind | Action |
|---|---|---|
TCVTROWPS2BF16H zmm, tmm, r32 64-bit mode only | ||
zmm | explicit | write |
tmm | explicit | read |
r32 | explicit | read |
TCVTROWPS2BF16H zmm, tmm, imm8 64-bit mode only | ||
zmm | explicit | write |
tmm | explicit | read |
imm8 | explicit | read |
Flags
None: XED records no flag that the forms test or change.
Exceptions
The exception class is XED's name for the set of exception conditions that a form follows. How to read.
TCVTROWPS2BF16H zmm, tmm, r3264-bit mode onlyAMX-E8-EVEXTCVTROWPS2BF16H zmm, tmm, imm864-bit mode onlyAMX-E7-EVEX
Attributes
What else XED records about the forms. How to read.
- All forms
- may abort a TSX transaction
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to TCVTROWPS2BF16H, each with the form it compiles to and the Clang options it needs. The forms come from compiling every intrinsic and decoding the result with Intel XED; all intrinsics A–Z explains the method.
| Intrinsic | Compiles to |
|---|---|
_tile_cvtrowps2bf16h
__m512bh _tile_cvtrowps2bf16h(const int tsrc, const int row) |
|
_tile_cvtrowps2bf16hi
__m512bh _tile_cvtrowps2bf16hi(const int tsrc, const int imm8) |
|
CPUID and processors
Each form belongs to an XED ISA set. A form can be used when the processor reports every CPUID bit of one of its ISA set's alternatives.
| ISA set | CPUID | Processors |
|---|---|---|
AMX_AVX512 | ACE v1 or AMX_AVX512 | Diamond Rapids |
More AMX-AVX512 instructions
More ACE instructions
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - Clang's x86 intrinsic headers, LLVM 23.1.2 (commit
85ac56026243): the intrinsics, their signatures and doc comments, and the Clang of that release, which compiled each of them. - Intel Architecture Instruction Set Extensions and Future Features Programming Reference (319433-062, June 2026): page 3-17 (TCVTROWPS2BF16[H,L])
- x86 Ecosystem Advisory Group: AI Compute Extensions (ACE) Specification, version 1.16.2 (July 2026)
The tables are derived from Intel XED, Copyright Intel Corporation, licensed under the Apache License 2.0; x86-64.net converted and reformatted them. The intrinsics and their signatures come from Clang, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.