[英]Check whether __m128i is zero?
我發現了這個問題:
我用來創建以下示例:
int main(){
__m128i intrinreg;
intrinreg.m128i_i64[0] = 0;
intrinreg.m128i_i64[1] = 6;
__m128i zero = _mm_setzero_si128();
if (0 == _mm_movemask_epi8(_mm_cmpeq_epi32(intrinreg, zero)))
{
std::cout << "true" << std::endl;
}
else{
std::cout << "false" << std::endl;
}
}
但是,無論我將兩個64位int組件設置為0還是非零,我總是得到“ false”的打印輸出?
由於已標記了AVX,因此我假設您具有SSE4.1,在這種情況下,所需的指令是ptest
,可以從_mm_testz_si128
或_mm_test_all_zeros()
。
bool test1, test2;
__m128i r1 = _mm_setzero_si128();
__m128i r2 = _mm_set1_epi64x(42);
test1 = _mm_testz_si128(r1,r1);
test2 = _mm_testz_si128(r2,r2);
printf("%d %d\n", test1, test2); //prints 1 0
如果沒有SSE4.1,請使用_mm_movemask_epi8(_mm_cmpeq_epi32(x,_mm_setzero_si128())) == 0xFFFF
。 這需要pcmpeqd
, pmovmskb
和test
。
但是, ptest
設置了零標志(ZF),因此只需要一條指令。 有關更多詳細信息,請參見檢查兩個sse寄存器是否都不為零而不破壞它們 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.