_mm_blendv_epi8

Microsoft Specific

Emits the Streaming SIMD Extensions 4 (SSE4) instruction pblendvb. This instruction blends packed 8-bit integers.

__m128i _mm_blendv_epi8( 
   __m128i a,
   __m128i b,
   __m128i mask 
);

Parameters

  • [in] a
    A 128-bit parameter that contains sixteen 8-bit integers to be blended.

  • [in] b
    A 128-bit parameter that contains sixteen 8-bit integers to be blended.

  • [in] mask
    A 128-bit mask that selects components for the blend operation.

Result value

A 128-bit result that consists of packed 8-bit integer values. Each value corresponds to one of the integers from parameter a or b, depending on bit settings that are specified by the mask parameter. The high bit of each corresponding mask byte determines the selection.

Requirements

Intrinsic

Architecture

_mm_blendv_epi8

x86, x64

Header file <smmintrin.h>

Remarks

The result is defined as follows:

r0 := (mask0 & 0x80) ? b0 : a0
r1 := (mask1 & 0x80) ? b1 : a1
...
r15 := (mask15 & 0x80) ? b15 : a15

Parameters a, b, and mask, and the return value r each consist of 128 bits. r0-r15, a0-a15, b0-b15, and mask0-mask15 are the sequentially ordered 8-bit components of these parameters, where r0, a0, b0, and mask0 indicate the least significant 8 bits.

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

Example

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

int main () {
    __m128i a, b, mask;

    mask.m128i_u8[15] = 0x80;
    mask.m128i_u8[14] = 0x80;
    mask.m128i_u8[13] = 0x80;
    mask.m128i_u8[12] = 0x80;
    mask.m128i_u8[11] = 0x80;
    mask.m128i_u8[10] = 0x80;
    mask.m128i_u8[9] = 0x80;
    mask.m128i_u8[8] = 0x80;
    mask.m128i_u8[7] = 0x00;
    mask.m128i_u8[6] = 0x00;
    mask.m128i_u8[5] = 0x00;
    mask.m128i_u8[4] = 0x00;
    mask.m128i_u8[3] = 0x00;
    mask.m128i_u8[2] = 0x00;
    mask.m128i_u8[1] = 0x00;
    mask.m128i_u8[0] = 0x00;

    a.m128i_u64[1] = 0xFFFFFFFFFFFFFFFF;
    a.m128i_u64[0] = 0xEEEEEEEEEEEEEEEE;
    b.m128i_u64[1] = 0x8888888888888888;
    b.m128i_u64[0] = 0x7777777777777777;

    __m128i res = _mm_blendv_epi8( a, b, mask );

    printf_s("Original a: 0x%016I64x%016I64x\nOriginal b: 0x%016I64x%016I64x\n",
        a.m128i_u64[1], a.m128i_u64[0],
        b.m128i_u64[1], b.m128i_u64[0]);
    printf_s("Result res: 0x%016I64x%016I64x\n",
        res.m128i_u64[1], res.m128i_u64[0]);

    return 0;
}
Original a: 0xffffffffffffffffeeeeeeeeeeeeeeee
Original b: 0x88888888888888887777777777777777
Result res: 0x8888888888888888eeeeeeeeeeeeeeee

See Also

Reference

Compiler Intrinsics