10

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


編集:

私が今していることは:

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

の各DWのすべての下位ビットidataが0の場合、これはループを終了します...ハロルドに感謝します!

4

2 に答える 2

9

_mm_testz_si128はSSE4.1であり、一部のCPU(Intel Atom、AMD Phenomなど)ではサポートされていません。

これがSSE2互換のバリアントです

inline bool isAllZeros(__m128i xmm) {
    return _mm_movemask_epi8(_mm_cmpeq_epi8(xmm, _mm_setzero_si128())) == 0xFFFF;
}
于 2012-04-20T16:49:48.773 に答える
4

ポールRが私の元の投稿にコメントしたように:

「の2番目のパラメータのダミー引数を初期化する必要はありませんPTEST。つまり_mm_testz_si128(idata, _mm_set1_epi32(0xFFFF))、値をそれ自体に対してテストするだけで済みます。」

ptest1つの命令ですべての仕事をします。

これは役に立ちました。

于 2012-12-05T12:44:04.990 に答える