Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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