2012-04-16 15 views
10

__m128i変数のすべてのビット/バイト/ワードなどが0かどうかを確認する方法はありますか?
私のアプリでは、__m128i変数にパックされているすべての整数がゼロであるかどうかをチェックする必要があります。私はそれらを抽出し、それぞれを別々に比較する必要がありますか?

編集: すべてのゼロについてXMMレジスタを確認してください


私が今やっている何がある:

int next = 0; 
do{ 
    //some code 

    next = idata.m128i_i32[0] + idata.m128i_i32[1] + idata.m128i_i32[2] + idata.m128i_i32[3]; 
}while(next > 0); 

私が必要とする彼らは何をしている場合Idataが、個々の要素にアクセスすることなく、すべてゼロであるかどうかをチェックし、ループを終了することがあります


__m128i idata = _mm_setr_epi32(i,j,k,l); 
do{ 
    //some code 
}while(!_mm_testz_si128(idata, idata)); 
:...

ハロルドさんのコメントに基づいて、これが解決策です

idataの各DWのすべての下位ビットが0の場合、これはループを終了します... thanks hraold!

+0

抽出せずに比較するのに 'PCMPEQD'を使用することはできませんか? – dasblinkenlight

+0

XMMレジスタにフラグレジスタが付いていますか?もしそうであれば、これらのビットの中にゼロフラグがなければならない。 –

+3

'PTEST'が利用可能なSSE4を参照してください。それ以外の場合は少し努力します。 – harold

答えて

9

_mm_testz_si128は、ここではいくつかのCPUでサポートされていませんSSE4.1(例えばインテルAtom、AMDのPhenom)

であるポール・Rは、私の元に、コメントのように

inline bool isAllZeros(__m128i xmm) { 
    return _mm_movemask_epi8(_mm_cmpeq_epi8(xmm, _mm_setzero_si128())) == 0xFFFF; 
} 
4

SSE2互換変種であります投稿:

"PTESTの第2パラメータの仮引数を初期化する必要はありません。すなわち、_mm_testz_si128(idata, _mm_set1_epi32(0xFFFF))の代わりに、値自体をテストすることができます。

ptestジョブ全体を1つの命令で処理します。

これは助けになりました。

関連する問題