Add Packed Double-Precision Floating-Point Values

Encoding

EncodingOperand 1Operand 2Operand 3Operand 4
rmn/aModRM.reg[rw]ModRM.r/m[r]
rvmn/aModRM.reg[rw]VEX.vvvv[r]ModRM.r/m[r]
ervmfullModRM.reg[rw]EVEX.vvvvv[r]ModRM.r/m[r]

Description

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

All forms except the legacy SSE one will zero the upper (untouched) bits.

Operation

public void ADDPD(SimdF64 dest, SimdF64 src)
{
    dest[0] += src[0];
    dest[1] += src[1];
    // dest[2..] is 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..] = 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])
            dest[n] = src1[n] + (EVEX.b ? src2[0] : src2[n]);
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 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)
        OverrideRoundingModeForThisInstruction(EVEX.rc);

    for (int n = 0; n < kl; n++)
    {
        if (k[n])
            dest[n] = src1[n] + src2[n];
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 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);

Intrinsics

Exceptions

SIMD Floating-Point

#XM
  • #D - Denormal operand.
  • #I - Invalid operation.
  • #O - Numeric overflow.
  • #P - Inexact result.
  • #U - Numeric underflow.

Other Exceptions

VEX Encoded Form: See Type 2 Exception Conditions.
EVEX Encoded Form: See Type E2 Exception Conditions.