Convert Packed Doubleword Integers 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)CVTDQ2PS instruction converts four, eight, or 16 doubleword integers 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 CVTDQ2PS(SimdF32 dest, SimdI32 src)
{
    dest[0] = ConvertToF32(src[0]);
    dest[1] = ConvertToF32(src[1]);
    dest[2] = ConvertToF32(src[2]);
    dest[3] = ConvertToF32(src[3]);
    // dest[4..] is unmodified
}

void VCVTDQ2PS_Vex(SimdF32 dest, SimdI32 src, int kl)
{
    for (int n = 0; n < kl; n++)
        dest[n] = ConvertToF32(src[n]);
    dest[kl..] = 0;
}
public void VCVTDQ2PS_Vex128(SimdF32 dest, SimdI32 src) =>
    VCVTDQ2PS_Vex(dest, src, 4);
public void VCVTDQ2PS_Vex128(SimdF32 dest, SimdI32 src) =>
    VCVTDQ2PS_Vex(dest, src, 8);

void VCVTDQ2PS_EvexMemory(SimdF32 dest, SimdI32 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 VCVTDQ2PS_Evex128Memory(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexMemory(dest, src, k, 4);
public void VCVTDQ2PS_Evex256Memory(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexMemory(dest, src, k, 8);
public void VCVTDQ2PS_Evex512Memory(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexMemory(dest, src, k, 16);

void VCVTDQ2PS_EvexRegister(SimdF32 dest, SimdI32 src, KMask k, int kl)
{
    if (kl == 16 && 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 VCVTDQ2PS_Evex128Register(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexRegister(dest, src, k, 4);
public void VCVTDQ2PS_Evex256Register(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexRegister(dest, src, k, 8);
public void VCVTDQ2PS_Evex512Register(SimdF32 dest, SimdI32 src, KMask k) =>
    VCVTDQ2PS_EvexRegister(dest, src, k, 16);

Intrinsics

Exceptions

SIMD Floating-Point

#XM
  • #P - Inexact result.

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.