Instruction
PADDD
Adds packed doublewords of MMX or XMM registers, wrapping around on overflow.
PADDD adds doublewords element by element and keeps the low 32 bits of each sum, so overflow wraps around, the same for signed and unsigned numbers. Unlike ADD, it sets no flags and nothing records that a sum overflowed. Saturating additions exist only for bytes and words: PADDSB and PADDSW for signed elements, PADDUSB and PADDUSW for unsigned ones.
In compiled code
Vectorized integer loops are where PADDD comes from. GCC 14 and Clang 23
at -O2 compile a[i] = b[i] + c[i] over ints to MOVDQU loads, PADDD
and an unaligned store. A sum of the elements vectorizes too, unlike a
sum of floats (see ADDPS), because wrapping integer
addition gives the same total in any order: the loop keeps four partial
sums in a register, one per element, and adds them together at the end
with shifts or shuffles and two more PADDDs.
A constant of all ones needs no memory: pcmpeqd xmm0, xmm0 sets every
bit, and AMD’s guide for Zen 5 lists it among the idioms that do not
wait for the register’s old value (Section 2.9.2). All ones is -1 in
every element, so both compilers subtract 1 with PADDD of it, and Clang
23 also adds 1 by subtracting it with PSUBD instead of
building a vector of ones with MOVD and PSHUFD, as GCC 14 does.
SSE2, MMX and VEX
- The legacy SSE2 form needs a memory operand aligned to 16 bytes, so compilers load unaligned data with MOVDQU first.
- The MMX form adds two doublewords of an MMX register. Like every MMX instruction it puts the x87 unit in MMX state, and EMMS must follow before x87 code runs.
- VPADDD is the VEX form for 128 and 256 bits and the EVEX form with masking and a broadcast doubleword.
PADDB, PADDW and PADDQ do the same for other element sizes.
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: a3+b3, a2+b2, a1+b1, a0+b0.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
PADDD mm, mm/m64for i in range(2):
mm1.d[i] = mm1.d[i] + src2.d[i]
# x87: TOP = 0, all tags valid, bits 79:64 of mm1's register all onesRun on AMD Zen 5 (EPYC 9645): 2 cases.
PADDD xmm, xmm/m128for i in range(4):
xmm1.d[i] = xmm1.d[i] + src2.d[i]
# bits 128 and up of the register are unchangedRun on AMD Zen 5 (EPYC 9645): 2 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
PADDD mm, mm/m64 | ||
mm | explicit | read, write |
mm/m64 | explicit | read |
PADDD 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.
PADDD mm, mm/m64- may abort a TSX transaction
PADDD xmm, m128- aligned memory operand
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to PADDD, 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_add_epi32
__m128i _mm_add_epi32(__m128i __a, __m128i __b) |
|
_mm_add_pi32
__m64 _mm_add_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
- PADDSB
- PADDSW
- PADDUSB
- PADDUSW
- PADDW
- PAND
- PANDN
- PCMPEQB
- PCMPEQD
- 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-201 (PADDB/
PADDW/ PADDD/ PADDQ) - 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.