MOVAPD explained

In the x86 assembly programming language, MOVAPD is the name for a specific action performable by modern x86 processors with 2nd-generation Streaming SIMD Extensions (SSE2). This action involves copying a pair of numbers to temporary space in the processor for use in other computations. MOVAPD is one of the fastest ways to accomplish this effect - it is faster than the comparable instruction MOVSD.

Specifically, MOVAPD causes a 16-byte-aligned packed-doubles source to be copied to an XMM register or a 16-byte memory region.

Usage

OpcodeAssembly (Intel syntax)Assembly (AT&T syntax) intrinsic equivalent(s) built-in(s)
66 0F 28 ''/r'' MOVAPD ''xmm1'', ''xmm2''/''m128''MOVAPD ''xmm2''/''m128'', ''xmm1''__m128 _mm_load_pd(double* p)
66 0F 29 ''/r''MOVAPD ''xmm1''/''m128'', ''xmm2''MOVAPD ''xmm2'', ''xmm1''/''m128''void _mm_store_pd(double* p, __m128 a)

The source operand can be either an XMM register (xmm2) or a memory address (m128).

The destination operand can be either an XMM register (xmm1) or a memory address (m128). Note, however, that the source and destination operands cannot both be memory addresses.

Potential Exceptions

If a memory address operand is not 16-byte-aligned, a general protection exception (#GP) will be raised. This can cause strange interoperability bugs when ordinary code calls an external code that was compiled with the assumption of a 16-byte-aligned stack frame boundary.[1]

References

See also

x86 instruction listings

Notes and References

  1. Web site: The Hell that MOVAPS Hath Wrought | Mystery Bail Theater.