We recommend using Visual Studio 2017
This documentation is archived and is not being maintained.


Microsoft Specific

Generates the Convert Packed Doubleword Integers to Packed Single-Precision Floating-Point Values (cvtpi2ps) instruction, which converts the two packed 32-bit integers in b to single-precision floating-point values.

__m128 _mm_cvt_pi2ps( 
   __m128 a, 
   __m64 b 

[in] a

An __m128 structure containing four packed floating-point values.

[in] b

An __m64 structure containing two packed 32-bit integers.

An __m128 structure containing the result of the conversions as the first two elements; the third and fourth elements are copied from a.




x86 with SSE2

Header file <intrin.h>

The results are stored in the first two elements of the __m128 structure returned; the other two elements of the return value are copied from the high quadword of a. The __m128 structure represents an XMM register and the __m64 structure represents an MMX register, so the instruction generated does not involve system memory.

This routine is only available as an intrinsic.

// _mm_cvt_pi2ps.cpp
// processor: x86
#include <intrin.h>
#include <stdio.h>

#pragma intrinsic(_mm_cvt_pi2ps)

int main()
    __m128 a;
    __m64 b;

    // Aligned because you are using _mm_load_ps to load these
    // numbers into the XMM registers.
    __declspec(align(16)) float af[4] = { 100.5, 200.5,300.5, 400.5 };

    // Load a, which maps to the XMM registers, with the floating point
    //  values. _mm_load_ps requires a 16-byte aligned address.
    a = _mm_load_ps(af);

    // Load b with the two 32-bit signed integers.
    b = _mm_set_pi32(32, 33); 

    // Copy the ints in a to the lower floating point slots of b.
    a = _mm_cvt_pi2ps(a, b);

    // Use the EMMS instruction to signal the transition from XMM
    // registers to floating point registers (used to access the 
    // floating point values for printing to stdout).

    // Print out the values in a.
    printf_s("%lf %lf %lf %lf\n",
             a.m128_f32[0], a.m128_f32[1],
             a.m128_f32[2], a.m128_f32[3]);
33.000000 32.000000 300.500000 400.500000