Extensions
Forms
1 (1 VEX)
Data
Intel XED v2026.08.23

KTESTW sets two flags from two 16-bit masks without writing a register: ZF when their AND is zero, so that no element is selected by both, and CF when the second ANDed with the inverted first is zero, so that every element the second selects is selected by the first as well. OF, SF, AF and PF are cleared. It is PTEST for mask registers, and the bits above 15 of both operands play no part.

A later arrival

KTESTW is not part of AVX-512F. It came with AVX512DQ, together with the byte form KTESTB, and KTESTD and KTESTQ need AVX512BW. A processor with only AVX-512F, such as Knights Landing, has KORTESTW but no KTESTW: there, testing the AND of two masks takes a KANDW first.

In compiled code

With GCC 14 and Clang 23 at -O2 and -mavx512f -mavx512dq, the test whether two compares select a common element, (_mm512_cmpeq_epi32_mask(a, b) & _mm512_cmpeq_epi32_mask(a, c)) != 0, compiled two ways:

  • Clang: both compares and ktestw k0, k1, then SETNE;
  • GCC: the second compare under the first’s mask, which leaves the AND in one register, then KORTESTW of it with itself.

The subset test that CF answers, (m2 & ~m1) == 0, got KTESTW from neither compiler: Clang computed it in general-purpose registers and GCC inverted one mask and used a masked compare. The intrinsics _ktestz_mask16_u8 and _ktestc_mask16_u8 give KTESTW in both, followed by SETE, or by SETC in GCC’s spelling and SETB in Clang’s, which are one instruction.

The instruction table of AMD’s Zen 5 guide lists KTESTW, like KORTESTW, as two macro-ops. The cases recorded on Zen 5 include a mask tested against itself, which sets CF and leaves ZF clear unless the mask is zero.

Forms

Every encoding of KTESTW that Intel XED knows, one row per XED instruction form (iform). How to read the notation.
InstructionEncodingRequires
KTESTW k, k KTESTW_MASKmskw_MASKmskw_AVX512VEX.LZ.NP.0F.W0 99 /rAVX10.1 or AVX512DQ

Latency and throughput

What the scheduling models of LLVM 23.1.2 give for each form, not measurements: latency / reciprocal throughput in cycles, the ports under them. A row is a model, or models that agree; a dash, a form that its processors lack. Memory forms: latency from the address, ports without the load and store units. Which processors each model covers.
Modelk, k
Skylake-SP, Ice Lake, Sapphire Rapids3 / 1p0
Zen 41 / 0.5FP2 FP3

Operation

What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.

a = low(k1, 16)                  # bits 63:16 of both are ignored
b = low(k2, 16)
zf = (a & b) == 0                # no bit set in both
cf = (b & ~a) == 0               # every bit of b set in a too
of = sf = af = pf = 0

Run on AMD Zen 5 (EPYC 9645): 12 cases.

Operands

What each form reads and writes, as Intel XED records it: the operands of its syntax, in order, and the implicit ones that the syntax does not name. How to read.
OperandKindAction
KTESTW k, k
kexplicitread
kexplicitread
RFLAGSimplicitwrite

Flags

M modified, 0 cleared; blank: not affected. How to read.
OFSFZFAFPFCF
All forms
00M00M

Exceptions

The exception class is XED's name for the set of exception conditions that a form follows. How to read.

All forms
AVX512-K20

Intrinsics

The C intrinsics of Clang 23.1.2 that compile to KTESTW, 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.

IntrinsicCompiles to
_ktestc_mask16_u8 unsigned char _ktestc_mask16_u8(__mmask16 __A, __mmask16 __B)

KTESTW k, k VEX.LZ -mavx512dq

_ktestz_mask16_u8 unsigned char _ktestz_mask16_u8(__mmask16 __A, __mmask16 __B)

KTESTW k, k VEX.LZ -mavx512dq

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.

CPUID requirements and processors of the XED ISA sets above. Alternatives are separated by “or”; processors follow XED’s chip model, whose AMD processors end with Zen 2, and the CPU data of this site for Zen 3 to Zen 6.
ISA setCPUIDProcessors
AVX512DQ_KOPW

AVX10.1
CPUID.(EAX=07H,ECX=1):EDX[19] AVX10
CPUID.(EAX=24H,ECX=0):EBX[7:0] ≥ 1 AVX10 version

or

AVX512DQ
CPUID.(EAX=07H,ECX=0):EBX[17] AVX512DQ

Cannon Lake, Ice Lake (client), Tiger Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Zen 4, Zen 5, Zen 6

More AVX10.1 instructions

All 686 AVX10.1 instructions

Sources

  1. Intel XED v2026.08.23 (commit 0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model.
  2. The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s -march feature sets and AMD’s Processor Programming References, which the page of each processor cites.
  3. 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.
  4. LLVM 23.1.2's x86 scheduling models (commit 85ac56026243): the latency, reciprocal throughput and ports of each form, as llvm-mca reports them.
  5. Intel Advanced Vector Extensions 10.2 Architecture Specification, revision 7.0 (361050-007, April 2026)
  6. Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2A, page 3-527 (KTESTW/KTESTB/KTESTQ/KTESTD)
  7. Software Optimization Guide for the AMD Zen5 Microarchitecture (58455, rev. 1.00, August 2024), Wayback Machine copy of AMD's ZIP

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 and the timings from LLVM's scheduling models, both part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.