Convert Packed Double-Precision Floating-Point Values to Packed Single-Precision Floating-Point Values

Encoding

EncodingOperand 1Operand 2Operand 3
rmn/aModRM.reg[w]ModRM.r/m[r]
ermfullModRM.reg[w]ModRM.r/m[r]

Description

The (V)CVTPD2PS instruction converts two, four, or eight double-precision floating-point values from the source operand into single-precision floating-point values. The result is stored in the destination operand.

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

Operation

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

void VCVTPD2PS_Vex(SimdF32 dest, SimdF64 src, int kl)
{
    for (int n = 0; n < kl; n++)
        dest[n] = ConvertToF32(src[n]);
    dest[kl..] = 0;
}
public void VCVTPD2PS_Vex128(SimdF32 dest, SimdF64 src) =>
    VCVTPD2PS_Vex(dest, src, 2);
public void VCVTPD2PS_Vex256(SimdF32 dest, SimdF64 src) =>
    VCVTPD2PS_Vex(dest, src, 4);

void VCVTPD2PS_EvexMemory(SimdF32 dest, SimdF64 src, KMask k, int kl)
{
    for (int n = 0; n < kl; n++)
    {
        if (k[n])
            dest[n] = ConvertToF32(EVEX.b ? src[0] : src[n]);
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 0;
}
public void VCVTPD2PS_Evex128Memory(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemory(dest, src, k, 2);
public void VCVTPD2PS_Evex256Memory(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemory(dest, src, k, 4);
public void VCVTPD2PS_Evex512Memory(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemory(dest, src, k, 8);

void VCVTPD2PS_EvexRegister(SimdF32 dest, SimdF64 src, KMask k, int kl)
{
    if (kl == 8 && EVEX.b)
        OverrideRoundingModeForThisInstruction(EVEX.rc);

    for (int n = 0; n < kl; n++)
    {
        if (k[n])
            dest[n] = ConvertToF32(src[n]);
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 0;
}
public void VCVTPD2PS_Evex128Register(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemoryRegister(dest, src, k, 2);
public void VCVTPD2PS_Evex256Register(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemoryRegister(dest, src, k, 4);
public void VCVTPD2PS_Evex512Register(SimdF32 dest, SimdF64 src, KMask k) =>
    VCVTPD2PS_EvexMemoryRegister(dest, src, 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.

#UD
  • If VEX.vvvv is not 1111b.
  • If EVEX.vvvvv is not 11111b.