Convert Packed Single-Precision Floating-Point Values to Packed Double-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)CVTPS2PD instruction converts two, four, or eight single-precision floating-point values from the source operand into double-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 CVTPS2PD(SimdF64 dest, SimdF32 src)
{
    dest[0] = ConvertToF64(src[0]);
    dest[1] = ConvertToF64(src[1]);
    // dest[4..] is unmodified
}

void VCVTPS2PD_Vex(SimdF64 dest, SimdF32 src, int kl)
{
    for (int n = 0; n < kl; n++)
        dest[n] = ConvertToF64(src[n]);
    dest[kl..] = 0;
}
public void VCVTPS2PD_Vex128(SimdF64 dest, SimdF32 src) =>
    VCVTPS2PD_Vex(dest, src, 4);
public void VCVTPS2PD_Vex256(SimdF64 dest, SimdF32 src) =>
    VCVTPS2PD_Vex(dest, src, 8);

void VCVTPS2PD_EvexMemory(SimdF64 dest, SimdF32 src, KMask k, int kl)
{
    for (int n = 0; n < kl; n++)
    {
        if (k[n])
            dest[n] = ConvertToF64(EVEX.b ? src[0] : src[n]);
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 0;
}
public void VCVTPS2PD_Evex128Memory(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexMemory(dest, src, k, 4);
public void VCVTPS2PD_Evex256Memory(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexMemory(dest, src, k, 8);
public void VCVTPS2PD_Evex512Memory(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexMemory(dest, src, k, 16);

void VCVTPS2PD_EvexRegister(SimdF64 dest, SimdF32 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] = ConvertToF64(src[n]);
        else if (EVEX.z)
            dest[n] = 0;
        // otherwise unchanged
    }
    dest[kl..] = 0;
}
public void VCVTPS2PD_Evex128Register(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexRegister(dest, src, k, 4);
public void VCVTPS2PD_Evex256Register(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexRegister(dest, src, k, 8);
public void VCVTPS2PD_Evex512Register(SimdF64 dest, SimdF32 src, KMask k) =>
    VCVTPS2PD_EvexRegister(dest, src, k, 16);

Intrinsics

Exceptions

SIMD Floating-Point

#XM
  • #I - Invalid operation.
  • #P - Inexact result.

Other Exceptions

VEX Encoded Form: See Type 3 Exception Conditions.
EVEX Encoded Form: See Type E3 Exception Conditions.

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