_mm_insert_ps

Microsoft Specific

Emits the Streaming SIMD Extensions 4 (SSE4) instruction insertps. This instruction insets a 32-bit integer into a 128-bit parameter.

__m128 _mm_insert_ps( 
   __m128 a,
   __m128 b,
   const int sel 
);

Parameters

  • [in] a
    A 128-bit parameter that contains four 32-bit floating point values.

  • [in] b
    A 128-bit parameter that contains four 32-bit floating point values.

  • [in] sel
    A constant that indicates which values to insert into the return value.

Result value

A 128-bit parameter that is a copy of the input parameter a, with a couple of exceptions. A value from b will be copied into an index indicated by sel. Also, sel may indicate that specific index values should be set to 0.

This can be expressed with the following equations:

sx := sel6-7
sval := (sx == 0) ? b0 : ((sx == 1) ? b1 : ((sx == 2) ? b2 : b3))

dx := sel4-5
r0 := (dx == 0) ? sval : a0
r1 := (dx == 1) ? sval : a1
r2 := (dx == 2) ? sval : a2
r3 := (dx == 3) ? sval : a3

zmask := sel0-3
r0 := (zmask0 == 1) ? +0.0 : r0
r1 := (zmask1 == 1) ? +0.0 : r1
r2 := (zmask2 == 1) ? +0.0 : r2
r3 := (zmask3 == 1) ? +0.0 : r3

Requirements

Intrinsic

Architecture

_mm_insert_ps

x86, x64

Header file <smmintrin.h>

Remarks

r0-r3, a0-a3, and b0-b3 are the sequentially ordered 32-bit components of return value r and parameters a and b, respectively. r0, a0, and b0 are the least significant 32 bits.

seli and zmaski denote bit i of parameter sel and temporary value zmask, with bit 0 being the least significant bit.

Before you use this intrinsic, software must ensure that the processor supports the instruction.

Example

#include <stdio.h>
#include <smmintrin.h>

int main ()
{
    __m128 a, b;
    const int sel = 0xD9;
    // The D means that b3 will be stored in r1
    // The 9 means that r0 and r3 will be set to 0

    a.m128_f32[0] = 1.0;
    a.m128_f32[1] = -1.0;
    a.m128_f32[2] = 1.5;
    a.m128_f32[3] = 105.5;
    b.m128_f32[0] = -5.0;
    b.m128_f32[1] = 10;
    b.m128_f32[2] = -325.0625;
    b.m128_f32[3] = 81.125;

    __m128 res = _mm_insert_ps(a, b, sel);

    printf_s("res0 should equal 0: %f\nres1 should equal %f: %f\n",
                res.m128_f32[0], b.m128_f32[3], res.m128_f32[1]);
    printf_s("res2 should equal %f: %f\nres3 should equal 0: %f\n",
                a.m128_f32[2], res.m128_f32[2], res.m128_f32[3]);

    return 0;
}
res0 should equal 0: 0.000000
res1 should equal 81.125000: 81.125000
res2 should equal 1.500000: 1.500000
res3 should equal 0: 0.000000

See Also

Reference

Compiler Intrinsics