ADDPD: Add Packed Double-Precision Floating-Point Values

For information about interpreting this page, see the help page.
Opcode and MnemonicEncoding16 bit Mode32 bit Mode64 bit ModeCPUID Feature FlagDescription
66 0F 58 /r
ADDPD xmm1, xmm2/m128
LEGACYInvalidValidValidSSE2Adds packed double-precision floating-point values from xmm2/m128 and xmm1. Stores the result in xmm1.
VEX.128.66.0F.WIG 58 /r
VADDPD xmm1, xmm2, xmm3/m128
VEXInvalidValidValidAVXAdds packed double-precision floating-point values from xmm3/m128 and xmm2. Stores the result in xmm1.
VEX.256.66.0F.WIG 58 /r
VADDPD ymm1, ymm2, ymm3/m256
VEXInvalidValidValidAVXAdds packed double-precision floating-point values from ymm3/m256 and ymm2. Stores the result in ymm1.
EVEX.128.66.0F.W1 58 /r
VADDPD xmm1 {k1}{z}, xmm2, xmm3/m128/m64bcst
EVEXInvalidValidValidAVX512VL
AVX512F
Adds packed double-precision floating-point values from xmm3/m128/m64bcst and xmm2. Stores the result in xmm1 using writemask k1.
EVEX.256.66.0F.W1 58 /r
VADDPD ymm1 {k1}{z}, ymm2, ymm3/m256/m64bcst
EVEXInvalidValidValidAVX512VL
AVX512F
Adds packed double-precision floating-point values from ymm3/m256/m64bcst and ymm2. Stores the result in ymm1 using writemask k1.
EVEX.512.66.0F.W1 58 /r
VADDPD zmm1 {k1}{z}, zmm2, zmm3/m512/m64bcst {er}
EVEXInvalidValidValidAVX512FAdds packed double-precision floating-point values from zmm3/m512/m64bcst and zmm2. Stores the result in zmm1 using writemask k1.

Encoding

EncodingTuple TypeOperand 1Operand 2Operand 3
LEGACYN/AModRM.reg[rw]ModRM.r/m[r]
VEXN/AModRM.reg[w]VEX.vvvv[r]ModRM.r/m[r]
EVEXFullModRM.reg[w]EVEX.vvvv[r]ModRM.r/m[r]

Description

The (V)ADDPD instruction adds two, four, or eight double-precision floating-point values from the first source operand to the second source operand. The result is stored in in the destination operand.

All versions except the legacy SSE version zero the unused upper SIMD register bits.

Operation

This pseudo-code uses C# syntax. A list of the types used is available here.
public void ADDPD(SimdF64 dest, SimdF64 src)
{
  dest[0] += src[0];
  dest[1] += src[1];
  // dest[2..Simd.Max] (unmodified)
}

void VADDPD_Vex(SimdF64 dest, SimdF64 src1, SimdF64 src2, int kl)
{
  for (int n = 0; n < kl, n++)
    dest[n] = src1[n] + src2[n];
  dest[kl..Simd.MAX] = 0;
}
public void VADDPD_Vex128(SimdF64 dest, SimdF64 src1, SimdF64 src2)
{
  VADDPD_Vex(dest, src1, src2, 2);
}
public void VADDPD_Vex256(SimdF64 dest, SimdF64 src1, SimdF64 src2)
{
  VADDPD_Vex(dest, src1, src2, 4);
}

void VADDPD_EvexMemory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k, int kl)
{
  for (int n = 0; n < kl, n++)
  {
    if (k[n])
    {
      if (EVEX.b)
        dest[n] = src1[n] + src2[0];
      else
        dest[n] = src1[n] + src2[n];
    }
    else if (EVEX.z)
    {
      dest[n] = 0;
    }
  }
  dest[kl..Simd.MAX] = 0;
}
public void VADDPD_Evex128Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexMemory(dest, src1, src2, k, 2);
}
public void VADDPD_Evex256Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexMemory(dest, src1, src2, k, 4);
}
public void VADDPD_Evex512Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexMemory(dest, src1, src2, k, 8);
}

void VADDPD_EvexRegister(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k, int kl)
{
  if (kl == 8 && EVEX.b)
    SetRoundingForThisInstruction(EVEX.rc);
  else
    SetRoundingForThisInstruction(MXCSR.rc);

  for (int n = 0; n < kl, n++)
  {
    if (k[n])
      dest[n] = src1[n] + src2[n];
    else if (EVEX.z)
      dest[n] = 0;
  }
  dest[kl..Simd.MAX] = 0;
}
public void VADDPD_Evex128Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexRegister(dest, src1, src2, k, 2);
}
public void VADDPD_Evex256Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexRegister(dest, src1, src2, k, 4);
}
public void VADDPD_Evex512Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k)
{
  VADDPD_EvexRegister(dest, src1, src2, k, 8);
}

C Intrinsics

Exceptions

SIMD Floating-Point

Overflow, Underflow, Invalid, Precision, Denormal

Other

VEX encoded form: see Exceptions Type 2.

EVEX encoded form: see Exceptions Type E2.