概要
「intrinsic」は英語で「固有の、本質的な」という意味である。
SSEなどのCPUの拡張命令を関数の形で呼び出せるようにしたもの。
C言語からインラインアセンブラなどを使わずに使えるため、デバッグもしやすい。
※「ジック」ではなく「シック」。あえて書くなら「スィック」。
インテル:x86
参考URL https://software.intel.com/sites/landingpage/IntrinsicsGuide/
整数(short)の足し算:_mm_add_epi16
16bit整数(short)を8つ同時に足し算する命令。結果も当然8つ。
書式
/** @brief 指定した整数a, bを足し算し、その結果を返します。 * @param[in] a 8つの符号付き16bit整数または符号なし16bit整数 * @param[in] b 8つの符号付き16bit整数または符号なし16bit整数 * @return aとbを足した8つの符号付き16bit整数または符号なし16bit整数 */ __m128i _mm_add_epi16 (__m128i a, __m128i b);
サンプル
smp_mm_add_epi16.cpp
#include <cstdio> #include <tmmintrin.h>
int main () { /* イントリンジックの整数足し算命令を利用する。 */ /* 下記は、16bit 整数を8つ同時に計算できる _mm_add_epi32() を使用している。 */ __m128i a, b; a.m128i_i16[0] = 1; b.m128i_i16[0] = -128; a.m128i_i16[1] = 1; b.m128i_i16[1] = -64; a.m128i_i16[2] = 100; b.m128i_i16[2] = 32; a.m128i_i16[3] = -100; b.m128i_i16[3] = 4096; a.m128i_i16[4] = -1000; b.m128i_i16[4] = 2; a.m128i_i16[5] = 1000; b.m128i_i16[5] = -2; a.m128i_i16[6] = 100; b.m128i_i16[6] = 32000; a.m128i_i16[7] = 52; b.m128i_i16[7] = 0;
__m128i res = _mm_add_epi16(a, b);
printf_s(" A:%6d, %6d, %6d, %6d, %6d, %6d, %6d, %6d\n", a.m128i_i16[0], a.m128i_i16[1], a.m128i_i16[2], a.m128i_i16[3], a.m128i_i16[4], a.m128i_i16[5], a.m128i_i16[6], a.m128i_i16[7]); printf_s(" B:%6d, %6d, %6d, %6d, %6d, %6d, %6d, %6d\n", b.m128i_i16[0], b.m128i_i16[1], b.m128i_i16[2], b.m128i_i16[3], b.m128i_i16[4], b.m128i_i16[5], b.m128i_i16[6], b.m128i_i16[7]); printf_s("A+B:%6d, %6d, %6d, %6d, %6d, %6d, %6d, %6d\n", res.m128i_i16[0], res.m128i_i16[1], res.m128i_i16[2], res.m128i_i16[3], res.m128i_i16[4], res.m128i_i16[5], res.m128i_i16[6], res.m128i_i16[7]);
return 0; }
結果
A: 1, 1, 100, -100, -1000, 1000, 100, 52 B: -128, -64, 32, 4096, 2, -2, 32000, 0 A+B: -127, -63, 132, 3996, -998, 998, 32100, 52