2012-04-16 27 views
10

Có cách nào để kiểm tra xem tất cả bit/byte/từ, vv trong biến __m128i là 0 không?
Trong ứng dụng của tôi, tôi phải kiểm tra xem tất cả các số nguyên được đóng gói trong một biến __m128i là số không. Tôi sẽ phải trích xuất chúng và so sánh riêng biệt?

Edit: Kiểm tra đăng ký XMM cho tất cả các số không


Những gì tôi đang làm bây giờ là:

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

Những gì tôi cần là để kiểm tra xem idata là tất cả zero mà không cần phải truy cập vào từng yếu tố cá nhân, và bỏ vòng lặp nếu họ ...

Dựa trên nhận xét của Harold đây là giải pháp:


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

Điều này sẽ thoát khỏi vòng lặp nếu tất cả các bit thấp của mỗi DW trong idata là 0 ... cảm ơn hraold!

+0

Bạn không thể sử dụng 'PCMPEQD' để so sánh mà không cần trích xuất? – dasblinkenlight

+0

Sổ đăng ký XMM có đăng ký cờ gắn với chúng không? Nếu có, phải có một lá cờ bằng không trong số các bit này. –

+3

Xem 'PTEST' là SSE4 có sẵn, nếu không sẽ tốn nhiều công sức hơn. – harold

Trả lời

9

_mm_testz_si128 là SSE4.1 mà không được hỗ trợ trên một số CPU (ví dụ như Intel Atom, bộ xử lý AMD Phenom)

Dưới đây là một SSE2 tương thích với phiên bản

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

Giống như Paul R nhận xét để ban đầu của tôi post:

"Bạn không cần phải khởi tạo đối số giả cho tham số thứ hai là PTEST, tức là thay vì _mm_testz_si128(idata, _mm_set1_epi32(0xFFFF)) bạn chỉ có thể thử nghiệm một giá trị với chính nó".

ptest thực hiện toàn bộ công việc với một hướng dẫn.

Điều này đã giúp ích.

Các vấn đề liên quan