__m64_pmpyshr2、__m64_pmpyshr2u
[このドキュメントはプレビュー版であり、後のリリースで変更されることがあります。 Blank topics are included as placeholders.]
Microsoft 固有の仕様 →
並列が向上し右シフト pmpyshr() 命令を生成します。
__m64 __m64_pmpyshr2(
__m64 a,
__m64 b,
const int nBit
);
__m64 __m64_pmpyshr2u(
__m64 a,
__m64 b,
const int nBit
);
パラメーター
[入力] a
4 個の 16 ビット整数の配列を含む __m64 の和集合。[入力] b
4 個の 16 ビット整数の配列を含む __m64 の和集合。[入力] nBit
4 個の 16 ビット値に切り捨てられますの結果をシフトするビット数。 許可値は 0715または 16 です。
必要条件
組み込み |
アーキテクチャ |
---|---|
__m64_pmpyshr2 |
IPF |
__m64_pmpyshr2u |
IPF |
ヘッダー ファイル <intrin.h>
解説
次に __m64_pmpyshr2 は b の対応する整数と a の整数の符号付き乗算nBit のビットごとの右シフトを実行します ; たとえばi に番号を持つ要素の a[i]*b[i] >> nBit ; __m64_pmpyshr2u は同じですが未署名の乗算を実行します。
使用例
// pmpyshr2.cpp
// processor: IPF
#include <stdio.h>
#include <intrin.h>
#pragma intrinsic(__m64_pmpyshr2, __m64_pmpyshr2u)
void print16(__int16* ia)
{
printf_s("{ %#x, %#x, %#x, %#x }\n", ia[0], ia[1], ia[2], ia[3]);
}
void printresult(__int16* hi, __int16* lo)
{
printf_s("{ 0x%x%x, 0x%x%x 0x%x%x 0x%x%x }\n",
hi[0], lo[0], hi[1], lo[1],
hi[2], lo[2], hi[3], lo[3]);
}
int main()
{
__int16 a[4] = { 0xffff, 1, 8, 0x5000 };
__int16 b[4] = { 0xffff, 2, 0x10, 0x5000 };
int i;
__m64 m, n, result_lo, result_hi;
printf_s("a: \n");
print16(a);
printf_s("b: \n");
print16(b);
for (int i = 0; i < 4; i++)
{
m.m64_i16[i] = a[i];
n.m64_i16[i] = b[i];
}
printf_s("__m64_pmpyshr2 computes :\n");
result_lo = __m64_pmpyshr2(m, n, 0);
result_hi = __m64_pmpyshr2(m, n, 16);
printresult(result_hi.m64_i16, result_lo.m64_i16);
result_lo = __m64_pmpyshr2u(m, n, 0);
result_hi = __m64_pmpyshr2u(m, n, 16);
printf_s("__m64_pmpyshr2u computes :\n");
printresult(result_hi.m64_i16, result_lo.m64_i16);
}