2012-04-16 3 views
10

__m128i 변수의 모든 비트/바이트/단어 등이 0인지 확인하는 방법이 있습니까?
내 응용 프로그램에서 __m128i 변수에있는 모든 정수가 0인지 확인해야합니다. 나는 그것들을 추출하고 그것들을 각각 따로 비교해야합니까?

편집 : 모든 0에 대해 XMM 레지스터를 확인하십시오.


내가 지금 뭐하는 거지 것은 :
내가 필요로하는 IDATA 각 개별 요소에 액세스 할 필요없이 모두 0 인 경우 확인하고, 만약 그들이 루프를 종료하는 것입니다

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)); 
,536 : ... 해롤드의 의견을 바탕으로

이 해결책이다

idata에서 각 DW의 모든 하위 비트가 0이면 루프를 종료합니다 ... 감사합니다. hraold!

+0

추출하지 않고 비교하려면 'PCMPEQD'를 사용할 수 없습니까? – dasblinkenlight

+0

XMM 레지스터에는 플래그 레지스터가 연결되어 있습니까? 그렇다면이 비트들 중에는 0 플래그가 있어야합니다. –

+3

'PTEST'는 SSE4를 사용할 수 있습니다. 그렇지 않으면 약간 더 많은 노력이 필요합니다. – harold

답변

9

_mm_testz_si128 여기

는 SSE2 호환 변형

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

처럼 바울 R 내 원래 주석 일부 CPU를 (예를 들어, 인텔 아톰, AMD 페넘)에서 지원되지 않습니다 SSE4.1입니다 게시물 :

"PTEST의 두 번째 매개 변수에 더미 인수를 초기화 할 필요가 없습니다. 즉, _mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)) 대신 값을 테스트 할 수 있습니다."

ptest 하나의 명령으로 전체 작업을 수행합니다.

도움이되었습니다.

관련 문제