2012-04-16 90 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,則會退出循環...謝謝hraold!

+0

難道你不能使用'PCMPEQD'來進行比較而不提取嗎? – dasblinkenlight 2012-04-16 14:14:01

+0

XMM寄存器是否附有標誌寄存器?如果是,則這些位之間必須有一個零標誌。 – 2012-04-16 14:15:12

+3

請參閱'PTEST'是否SSE4可用,否則它會花費更多的努力。 – harold 2012-04-16 14:20:36

回答

9

_mm_testz_si128是不支持某些CPU(如英特爾凌動,AMD羿龍)SSE4.1

下面是一個SSE2兼容變種

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

像保羅一樣[R評價我的原發布:

「您不需要爲PTEST的第二個參數初始化僞參數,即,而不是_mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)),您可以對自己測試一個值。」

ptest用一條指令完成整個工作。

這有幫助。