Divide 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)DIVPD instruction divides two, four, or eight packed double-precision floating-point values from the first source operand by those in the second. The result is stored in the destination operand.

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

Operation

public void DIVPD(SimdF64 dest, SimdF64 src)
{
    dest[0] /= src[0];
    dest[1] /= src[1];
    // dest[2..] is unmodified
}

void VDIVPD_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 VDIVPD_Vex128(SimdF64 dest, SimdF64 src1, SimdF64 src2) =>
    VDIVPD_Vex(dest, src1, src2, 2);
public void VDIVPD_Vex256(SimdF64 dest, SimdF64 src1, SimdF64 src2) =>
    VDIVPD_Vex(dest, src1, src2, 4);

void VDIVPD_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 VDIVPD_Evex128Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_EvexMemory(dest, src1, src2, k, 2);
public void VDIVPD_Evex256Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_EvexMemory(dest, src1, src2, k, 4);
public void VDIVPD_Evex512Memory(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_EvexMemory(dest, src1, src2, k, 8);

void VDIVPD_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 VDIVPD_Evex128Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_EvexRegister(dest, src1, src2, k, 2);
public void VDIVPD_Evex256Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_EvexRegister(dest, src1, src2, k, 4);
public void VDIVPD_Evex512Register(SimdF64 dest, SimdF64 src1, SimdF64 src2, KMask k) =>
    VDIVPD_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.
  • #Z - Divide-by-zero.

Other Exceptions

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