イントリンシック命令

Last-modified: 2016-05-13 (金) 00:55:38

概要

「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