_mm_min_epi8

Microsoft Specific

Emits the Streaming SIMD Extensions 4 (SSE4) instruction pminsb. This instruction chooses the smaller value of the two parameters.

__m128i _mm_min_epi8( 
   __m128i a,
   __m128i b 
);

Parameters

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

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

Return value

A 128-bit parameter that can be defined with the following equations:

r0 := (a0 < b0) ? a0 : b0
r1 := (a1 < b1) ? a1 : b1
...
r15 := (a15 < b15) ? a15 : b15

Requirements

Intrinsic

Architecture

_mm_min_epi8

x86, x64

Header file <smmintrin.h>

Remarks

r0-r15, a0-a15, and b0-b15 are the sequentially ordered 8-bit components of return value r and parameters a and b. r0, a0, and b0 are the least significant 8 bits.

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

Example

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

int main ()
{
    __m128i a, b;

    a.m128i_i8[0] = 1;
    a.m128i_i8[1] = 2;
    a.m128i_i8[2] = 4;
    a.m128i_i8[3] = 8;
    a.m128i_i8[4] = 16;
    a.m128i_i8[5] = 32;
    a.m128i_i8[6] = 64;
    a.m128i_i8[7] = 127;
    a.m128i_i8[8] = -15;
    a.m128i_i8[9] = 15;
    a.m128i_i8[10] = 1;
    a.m128i_i8[11] = -45;
    a.m128i_i8[12] = 31;
    a.m128i_i8[13] = -100;
    a.m128i_i8[14] = 100;
    a.m128i_i8[15] = -23;

    b.m128i_i8[0] = 127;
    b.m128i_i8[1] = -64;
    b.m128i_i8[2] = 32;
    b.m128i_i8[3] = -16;
    b.m128i_i8[4] = 8;
    b.m128i_i8[5] = -4;
    b.m128i_i8[6] = 2;
    b.m128i_i8[7] = -1;
    b.m128i_i8[8] = 0;
    b.m128i_i8[9] = 0;
    b.m128i_i8[10] = -1;
    b.m128i_i8[11] = -50;
    b.m128i_i8[12] = 31;
    b.m128i_i8[13] = -4;
    b.m128i_i8[14] = 50;
    b.m128i_i8[15] = -24;

    __m128i res = _mm_min_epi8(a, b);

    printf_s("   a\t   b\t res\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n",
                a.m128i_i8[0], b.m128i_i8[0], res.m128i_i8[0],
                a.m128i_i8[1], b.m128i_i8[1], res.m128i_i8[1],
                a.m128i_i8[2], b.m128i_i8[2], res.m128i_i8[2]);
    printf_s("%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n",
                a.m128i_i8[3], b.m128i_i8[3], res.m128i_i8[3],
                a.m128i_i8[4], b.m128i_i8[4], res.m128i_i8[4],
                a.m128i_i8[5], b.m128i_i8[5], res.m128i_i8[5],
                a.m128i_i8[6], b.m128i_i8[6], res.m128i_i8[6]);
    printf_s("%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n",
                a.m128i_i8[7], b.m128i_i8[7], res.m128i_i8[7],
                a.m128i_i8[8], b.m128i_i8[8], res.m128i_i8[8],
                a.m128i_i8[9], b.m128i_i8[9], res.m128i_i8[9],
                a.m128i_i8[10], b.m128i_i8[10], res.m128i_i8[10]);
    printf_s("%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n%4d\t%4d\t%4d\n",
                a.m128i_i8[11], b.m128i_i8[11], res.m128i_i8[11],
                a.m128i_i8[12], b.m128i_i8[12], res.m128i_i8[12],
                a.m128i_i8[13], b.m128i_i8[13], res.m128i_i8[13],
                a.m128i_i8[14], b.m128i_i8[14], res.m128i_i8[14]);
    printf_s("%4d\t%4d\t%4d\n",
                a.m128i_i8[15], b.m128i_i8[15], res.m128i_i8[15]);

    return 0;
}
   a       b     res
   1     127       1
   2     -64     -64
   4      32       4
   8     -16     -16
  16       8       8
  32      -4      -4
  64       2       2
 127      -1      -1
 -15       0     -15
  15       0       0
   1      -1      -1
 -45     -50     -50
  31      31      31
-100      -4    -100
 100      50      50
 -23     -24     -24

See Also

Reference

Compiler Intrinsics