2012-04-16 41 views
10

__m128i değişkenindeki tüm bit/bayt/sözcüklerin vb. Olup olmadığını kontrol etmenin bir yolu var mı?
Uygulamamda, __m128i değişkeninde paketlenmiş tüm tam sayıların sıfır olup olmadığını kontrol etmeliyim. Onları ayıklamak ve ayrı ayrı karşılaştırmak zorunda mıyım?

Düzenleme: Tüm sıfırlar için XMM kaydını kontrol edin


Şimdi ne yapıyorum geçerli:
Benim ihtiyacım idata her tek bir öğesine erişmek zorunda kalmadan tüm sıfırları olup olmadığını kontrol edin ve eğer olurlarsa döngü çıkmak için ise

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


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

bu çözüm

Bu, idatadaki her DW'nin tüm düşük bitlerinin 0 olması durumunda döngüden çıkar ... teşekkürler hraold!

+0

"PCMPEQD" ifadesini çıkarma olmadan karşılaştırmak için kullanamaz mısınız? – dasblinkenlight

+0

XMM kayıtlarında bunlara bağlı bir bayrak kaydı var mı? Eğer evet ise, bu bitler arasında sıfır bayrak bulunmalıdır. –

+3

Bkz. "PTEST" SSE4 kullanılabilir, aksi halde biraz daha fazla çaba gerektirir. – harold

cevap

9

_mm_testz_si128 İşte

bir SSE2 uyumlu varyant

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

gibi Paul R benim orijinaline yorumladı bazı CPU'lar (örneğin Intel Atom AMD Phenom) desteklenmez SSE4.1 olduğunu post:

"PTEST'un ikinci parametresi için bir kukla argüman başlatmanız gerekmiyor, yani _mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)) yerine bir değeri kendi başına test edebilirsiniz." Tüm iş bir yönerge ile iş yapıyor mu?

ptest

Bu yardımcı oldu.

İlgili konular