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