Instruction
VPANDN
Computes the bitwise AND of the inverted first source with the second, in XMM or YMM registers (YMM with AVX2).
VPANDN inverts its first source and ANDs the result with the second,
vpandn ymm0, ymm1, ymm2 computing NOT ymm1 AND ymm2, over 128 or 256
bits with no element boundaries. It is the VEX form of
PANDN and belongs to the family that
VPAND describes: a separate destination, a memory
operand at any address, the bits above the width cleared, and no EVEX
form of its own, where VPANDND and
VPANDNQ take a write mask. Only the first source is
inverted, and only the second may come from memory. On Zen 5, vpandn xmm8, xmm15, [mem] with 00000001h in XMM15 and FFFFFFFFh in memory gave
FFFFFFFEh; with the operands the other way round, the result would have
been zero. VANDNPS is the same operation under a
floating-point name.
In compiled code
GCC 14 and Clang 23 at -O2 with -march=x86-64-v3 use VPANDN where a
mask clears what it selects: b[i] > c[i] ? 0 : b[i] over ints is a
VPCMPGTD whose result, inverted, keeps b with
VPANDN. _mm256_andnot_si256(a, b) keeps the order of the instruction,
inverting a.
For b[i] & ~c[i] in a loop, the two differ. Clang loads c, the
operand to invert, into a register and takes b from memory with
VANDNPS, as it prefers the floating-point name for a result that is only
stored. GCC 14 makes all ones with VPCMPEQD, inverts
c with VPXOR and ANDs with VPAND, two operations where
one would do. With -march=x86-64-v4, it compiles the same loop to
VPTERNLOGD with immediate 44h on zmm registers, and
the intrinsic to VPANDNQ even on ymm registers.
A zeroing idiom
NOT x AND x is zero whatever x holds: vpandn xmm12, xmm6, xmm6 left
all of ZMM12 zero on Zen 5. AMD’s Zen 5 guide lists VPANDN with one
register twice among the zeroing idioms, which take no cycle and do not
wait for the old value (Section 2.9.2), and its latency spreadsheet
gives VPANDN one cycle and four per cycle otherwise. Zen 5’s 4 recorded
cases cover the register and memory forms at both widths.
Forms
| Instruction | Encoding | Requires |
|---|---|---|
VPANDN xmm, xmm, m128
VPANDN_XMMdq_XMMdq_MEMdq | VEX.128.66.0F.WIG DF /r | AVX |
VPANDN xmm, xmm, xmm
VPANDN_XMMdq_XMMdq_XMMdq | VEX.128.66.0F.WIG DF /r | AVX |
VPANDN ymm, ymm, m256
VPANDN_YMMqq_YMMqq_MEMqq | VEX.256.66.0F.WIG DF /r | AVX2 |
VPANDN ymm, ymm, ymm
VPANDN_YMMqq_YMMqq_YMMqq | VEX.256.66.0F.WIG DF /r | AVX2 |
Data flow
Where the elements of the sources go, element 0 on the right; results that depend on a control value are drawn for an example. How to read.
Every quadword works alike: 2 and 4 quadwords in the xmm and ymm forms.
Result quadword i comes from quadword i of xmm2 and xmm3. Result quadwords 1 to 0: ~a1&b1, ~a0&b0.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
for i in range(VL // 64):
ymm1.q[i] = ~ymm2.q[i] & src3.q[i]
# ymm1 is zeroed from bit VL upRun on AMD Zen 5 (EPYC 9645): 4 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
VPANDN xmm, xmm, xmm/m128 VPANDN ymm, ymm, ymm/m256 | ||
xmm, ymm | explicit | write |
xmm, ymm | explicit | read |
xmm/m128, ymm/m256 | 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.
- All forms
avx-type-4
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to VPANDN, 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 |
|---|---|
_mm_andnot_epi32
__m128i _mm_andnot_epi32(__m128i __A, __m128i __B) |
|
_mm_andnot_epi64
__m128i _mm_andnot_epi64(__m128i __A, __m128i __B) |
|
_mm_andnot_pd
__m128d _mm_andnot_pd(__m128d __a, __m128d __b) |
|
_mm_andnot_si128
__m128i _mm_andnot_si128(__m128i __a, __m128i __b) |
|
_mm256_andnot_epi32
__m256i _mm256_andnot_epi32(__m256i __A, __m256i __B) |
|
_mm256_andnot_epi64
__m256i _mm256_andnot_epi64(__m256i __A, __m256i __B) |
|
_mm256_andnot_si256
__m256i _mm256_andnot_si256(__m256i __a, __m256i __b) |
|
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 |
|---|---|---|
AVX | AVX | Sandy Bridge, Ivy Bridge, Haswell, Broadwell, Skylake, Comet Lake, Cannon Lake, Ice Lake (client), Tiger Lake, Alder Lake, Arrow Lake, Panther Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Sierra Forest, Clearwater Forest, Knights Landing, Knights Mill, Bulldozer, Piledriver, Zen, Zen+, Zen 2, Zen 3, Zen 4, Zen 5, Zen 6 |
AVX2 | AVX2 | Haswell, Broadwell, Skylake, Comet Lake, Cannon Lake, Ice Lake (client), Tiger Lake, Alder Lake, Arrow Lake, Panther Lake, Nova Lake, Skylake-SP, Cascade Lake, Cooper Lake, Ice Lake (server), Sapphire Rapids, Emerald Rapids, Granite Rapids, Diamond Rapids, Sierra Forest, Clearwater Forest, Knights Landing, Knights Mill, Zen, Zen+, Zen 2, Zen 3, Zen 4, Zen 5, Zen 6 |
More AVX instructions
- VMULSS
- VORPD
- VORPS
- VPABSB
- VPABSD
- VPABSW
- VPACKSSDW
- VPACKSSWB
- VPACKUSDW
- VPACKUSWB
- VPADDB
- VPADDD
- VPADDQ
- VPADDSB
- VPADDSW
- VPADDUSB
- VPADDUSW
- VPADDW
- VPALIGNR
- VPAND
- VPAVGB
- VPAVGW
- VPBLENDVB
- VPBLENDW
- VPCLMULQDQ
- VPCMPEQB
- VPCMPEQD
- VPCMPEQQ
- VPCMPEQW
- VPCMPESTRI
- VPCMPESTRM
- VPCMPGTB
- VPCMPGTD
- VPCMPGTQ
- VPCMPGTW
- VPCMPISTRI
- VPCMPISTRM
- VPERM2F128
- VPERMILPD
- VPERMILPS
More AVX2 instructions
- VINSERTI128
- VMOVNTDQA
- VMPSADBW
- VPABSB
- VPABSD
- VPABSW
- VPACKSSDW
- VPACKSSWB
- VPACKUSDW
- VPACKUSWB
- VPADDB
- VPADDD
- VPADDQ
- VPADDSB
- VPADDSW
- VPADDUSB
- VPADDUSW
- VPADDW
- VPALIGNR
- VPAND
- VPAVGB
- VPAVGW
- VPBLENDD
- VPBLENDVB
- VPBLENDW
- VPBROADCASTB
- VPBROADCASTD
- VPBROADCASTQ
- VPBROADCASTW
- VPCMPEQB
- VPCMPEQD
- VPCMPEQQ
- VPCMPEQW
- VPCMPGTB
- VPCMPGTD
- VPCMPGTQ
- VPCMPGTW
- VPERM2I128
- VPERMD
- VPERMPD
Sources
- Intel XED v2026.08.23 (commit
0bcb6237345c): forms, encodings, operands, flags, exception classes, attributes, ISA sets, CPUID bits and chip model. - The CPU data of x86-64.net: Zen 3 to Zen 6, from GCC’s
-marchfeature sets and AMD’s Processor Programming References, which the page of each processor cites. - 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 64 and IA-32 Architectures Software Developer's Manual, Volume 2 (325383-093, September 2026): Volume 2B, page 4-223 (PANDN)
- Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
- 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, part of the LLVM Project, licensed under the Apache License 2.0 with LLVM Exceptions. The text is our own.