Instruction
PUNPCKHQDQ
Interleaves the high quadwords of two XMM operands.
- Extensions
- Forms
- 2 (2 Legacy)
- Data
- Intel XED v2026.08.23
PUNPCKHQDQ takes the high quadword of its source and writes it above
the high quadword of its destination: the result is the destination’s
bits 127:64 followed by the source’s bits 127:64, and both low halves
are dropped. On Zen 5, punpckhqdq xmm7, xmmword ptr [mem] moved the
destination’s own bits 127:64 (4E4134271A0D00F3h) down to bits 63:0 and
wrote the memory operand’s bits 127:64 (3AFFC4894E13D89Dh) into bits
127:64, leaving the low eight bytes of the 16-byte memory operand
unused and bits 511:128 of ZMM7 as they were. Like
PUNPCKLQDQ, which joins the low halves, it has no
MMX form and came only with SSE2.
Moving the high half down
The usual job is a horizontal reduction: summing the two 64-bit lanes
of a vector needs the high one brought down first. For
_mm_cvtsi128_si64(_mm_add_epi64(v, _mm_unpackhi_epi64(v, v))), GCC 14
at -O2 copies v, unpacks its high quadword into both halves of
another register with PUNPCKHQDQ and adds the copy to it; Clang 23
instead moves the high doubleword pair down with
PSHUFD and EEh, never using this pack for the job, at
the default target and at -march=x86-64-v2 alike.
The floating twin is UNPCKHPD. For
double t[2]; _mm_storeu_pd(t, v); return t[1];, which reads the
high double back out of a store, GCC 14 at -O2 compiles the extraction
to UNPCKHPD and Clang 23 to MOVHLPS, at the default
target and at -march=x86-64-v2 alike.
AMD’s latency spreadsheet for Zen 5 gives PUNPCKHQDQ one macro-op with a latency of one cycle, four per cycle. VPUNPCKHQDQ, the VEX and EVEX form, unpacks each 128-bit lane on its own, as VPUNPCKLQDQ shows.
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.
Result quadwords 1 to 0: b1, a1.
Operation
What the forms do, in pseudocode that our tests run against results recorded on real processors. How to read.
src1 = xmm1.read() # xmm1 as it was
for i in range(2):
j = i // 2 + 1
if i % 2 == 0:
xmm1.q[i] = src1.q[j]
else:
xmm1.q[i] = src2.q[j]
# bits 128 and up of the register are unchangedRun on AMD Zen 5 (EPYC 9645): 2 cases.
Operands
| Operand | Kind | Action |
|---|---|---|
PUNPCKHQDQ 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.
- All forms
SSE_TYPE_4
Attributes
What else XED records about the forms. How to read.
- Memory forms
- aligned memory operand
Intrinsics
The C intrinsics of Clang 23.1.2 that compile to PUNPCKHQDQ, 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_unpackhi_epi64
__m128i _mm_unpackhi_epi64(__m128i __a, __m128i __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 |
|---|---|---|
SSE2 | SSE2 | Every x86-64 processor in XED’s model and Zen 3 to Zen 6 |
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-502 (PUNPCKHBW/
PUNPCKHWD/ PUNPCKHDQ/ PUNPCKHQDQ) - 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.