__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);

}
          
        

参照

Reference

__m64

コンパイラ組み込み関数。