Instruction
PCMPEQD
Compares packed doublewords of MMX or XMM registers for equality, into all-ones or all-zeros elements.
PCMPEQD compares 4 pairs of doublewords (2 in the MMX form) and writes
FFFFFFFFh where the two are equal and 00000000h where they differ.
Equality does not care about signs, so it serves int32_t, uint32_t
and pointers alike; the ordered comparison, PCMPGTD,
treats doublewords as signed, and an unsigned one came only with
AVX-512’s VPCMPUD. PCMPEQB covers
what the family shares: the byte-search idiom with
PMOVMSKB, and that comparing a register with itself
sets every bit. On Zen 5, the recorded pcmpeqd xmm1, xmm2 turned
80000000h against FFFFFFFFh (-2147483648 against -1) into 00000000h
and 80000000h against 80000000h into FFFFFFFFh, leaving bits 255:128
of the register as they were (see mixing SSE and
AVX).
Building constants
PCMPEQD is the usual way compiled code gets a vector of all ones: AMD’s
Zen 5 guide lists the legacy PCMPEQB, PCMPEQW, PCMPEQD and PCMPEQQ of a
register with itself among its Ones Idioms, which do not wait for the
register’s old value (Section 2.9.2), the counterpart to the Zeroing
Idioms that use PXOR and the wrapping PSUB forms the same way. In our
builds at -O2, GCC 14 reaches for it whenever a doubleword mask or
constant needs every bit set: the saturating clamp described on
PADDUSW’s page, for one, builds the saturated value
FFFFFFFFh with pcmpeqd xmm6, xmm6 and uses it directly as the “true”
side of a PAND/PANDN/POR
select.
- Masks and selects.
a[i] = b[i] == c[i] ? -1 : 0overint32_tis one PCMPEQD per 4 doublewords in both compilers, andb[i] == c[i] ? 0 : b[i]adds a PANDN. - Finding a match.
_mm_cmpeq_epi32followed by_mm_movemask_pson the result reinterpreted as floats compiles to PCMPEQD and MOVMSKPS in both compilers, a 4-bit mask instead of the 16-bit one PMOVMSKB gives for bytes.
The legacy form’s memory operand must be aligned to 16 bytes, as most legacy SSE instructions require. AMD’s latency spreadsheet for Zen 5 gives it one cycle, four per cycle, on all four vector pipes. Intel’s optimization manual counts the MMX form among those that Skylake runs at half the throughput of earlier cores (Section 15.16.5); the MMX form came with the original MMX instruction set. VPCMPEQD is the VEX form for 128 and 256 bits, still writing a vector; its EVEX form writes a mask register instead, which makes the PMOVMSKB step unnecessary.
In the optimization guide
What the optimization guide says about PCMPEQD, a line per claim. Each links to the claim in the guide, with its sources and where they differ.
Out of order
- Zeroing and dependency-breaking idioms:
pcmpeqd xmm0, xmm0and the other equality comparisons of a register with itself set every bit without waiting for the old value.
Zen 3
- Integer execution: Register-to-register moves of general registers of 32 and 64 bits,
xchgof them and moves of whole XMM and YMM registers take no execution cycle, nor do the zeroing idioms such asxor eax, eaxandvpxor, which also break the dependency on the old value;sbb eax, eaxdepends only on the carry flag, andpcmpeqd xmm0, xmm0sets all ones without waiting. sources differ
Forms
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 doubleword works alike: 2 and 4 doublewords in the mm and xmm forms.
Result doubleword i comes from doubleword i of xmm1 and xmm2. Result doublewords 3 to 0: r3, r2, r1, r0.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
PCMPEQD mm, mm/m64for i in range(2):
a = mm1.d[i]
b = src2.d[i]
mm1.d[i] = -1 if a == b else 0
# x87: TOP = 0, all tags valid, bits 79:64 of mm1's register all onesRun on AMD Zen 5 (EPYC 9645): 2 cases.
PCMPEQD xmm, xmm/m128for i in range(4):
a = xmm1.d[i]
b = src2.d[i]
xmm1.d[i] = -1 if a == b else 0
# bits 128 and up of the register are unchangedRun on AMD Zen 5 (EPYC 9645): 2 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
PCMPEQD mm, mm/m64 | ||
mm | explicit | read, write |
mm/m64 | explicit | read |
PCMPEQD xmm, xmm/m128 | ||
xmm | explicit | read, write |
xmm/m128 | 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.
Attributes
What else XED records about the forms. How to read.
PCMPEQD mm, mm/m64- may abort a TSX transaction
PCMPEQD xmm, m128- aligned memory operand
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to PCMPEQD, 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_cmpeq_epi32
__m128i _mm_cmpeq_epi32(__m128i __a, __m128i __b) |
|
_mm_cmpeq_pi32
__m64 _mm_cmpeq_pi32(__m64 __m1, __m64 __m2) |
|
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.
More MMX instructions
- EMMS
- MOVD
- MOVQ
- PACKSSDW
- PACKSSWB
- PACKUSWB
- PADDB
- PADDD
- PADDSB
- PADDSW
- PADDUSB
- PADDUSW
- PADDW
- PAND
- PANDN
- PCMPEQB
- PCMPEQW
- PCMPGTB
- PCMPGTD
- PCMPGTW
- PMADDWD
- PMULHW
- PMULLW
- POR
- PSLLD
- PSLLQ
- PSLLW
- PSRAD
- PSRAW
- PSRLD
- PSRLQ
- PSRLW
- PSUBB
- PSUBD
- PSUBSB
- PSUBSW
- PSUBUSB
- PSUBUSW
- PSUBW
- PUNPCKHBW
More SSE2 instructions
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-245 (PCMPEQB/
PCMPEQW/ PCMPEQD) - Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 1 (253665-093, September 2026)
- Intel 64 and IA-32 Architectures Optimization Reference Manual, Volume 1 (248966-051, October 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.