2013-05-16 56 views

Trả lời

10

Đó là khá dễ dàng để đảo ngược 32 bit int yếu tố sau một tải bình thường:

__m128i v = _mm_load_si128(buff);     // MOVDQA 
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b 

Bạn có thể làm điều tương tự cho 16 bit short yếu tố, nhưng phải mất nhiều hướng dẫn:

__m128i v = _mm_load_si128(buff);     // MOVDQA 
v = _mm_shuffle_epi32(v, _MM_SHUFFLE(0, 1, 2, 3)); // PSHUFD - mask = 00 01 10 11 = 0x1b 
v = _mm_shufflelo_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFLW - mask = 10 11 00 01 = 0xb1 
v = _mm_shufflehi_epi16(v, _MM_SHUFFLE(2, 3, 0, 1)); // PSHUFHW - mask = 10 11 00 01 = 0xb1 

Lưu ý rằng bạn có thể thực hiện việc này với ít hướng dẫn hơn bằng cách sử dụng _mm_shuffle_epi8 (PSHUFB), nếu SSSE3 có sẵn:

const __m128i vm = _mm_setr_epi8(14, 15, 12, 13, 10, 11, 8, 9, 6, 7, 4, 5, 2, 3, 0, 1); 
            // initialise vector mask for use with PSHUFB 
            // NB: do this once, outside any processing loop 
... 
__m128i v = _mm_load_si128(buff); // MOVDQA 
v = _mm_shuffle_epi8(v, vm);   // PSHUFB 
+0

Cảm ơn Paul.Giao diện của bạn đang hoạt động tốt.Nhưng tôi không thể hiểu việc sử dụng tham số thứ hai "0x1B". Có một số loại mặt nạ? Một nghi ngờ khác là .. Có thể thực hiện thao tác tương tự trên quần short không? – Andy

+0

Tôi đã thêm một ví dụ thứ hai để tải và đảo ngược quần short. Mặt nạ được bao phủ trong các tài liệu của Intel nhưng tôi đã thêm các bình luận để hiển thị nó được xây dựng như thế nào. –

+0

P.S. Tôi rất khuyên bạn nên tải xuống [Hướng dẫn nội tại của Intel] (http://software.intel.com/en-us/articles/intel-intrinsics-guide) - một công cụ rất hữu ích cho WIN/Mac OS X/Linux có tài liệu tất cả Hướng dẫn và bản chất SSE/AVX theo cách rất dễ tiếp cận. –

-2

EDIT: (Sau đây là cho vô hướng điểm chính xác duy nhất nổi, để lại nó ở đây chỉ trong trường hợp)

Các xấp xỉ nhất (và tiện dụng) là _mm_loadr_ps nội tại. Hãy nhận biết địa chỉ phải được liên kết 16byte.

Mặc dù nội tại này dịch sang số nhiều hơn chỉ dẫn (MOVAPS + xáo trộn).

+0

Cảm ơn bạn đã trả lời nhưng hướng dẫn này tải bốn giá trị độ chính xác, dấu phẩy động theo thứ tự ngược. Tôi đang tìm kiếm phép toán tương tự cho số nguyên nhưng tôi đoán không có hỗ trợ cho điều đó. – Andy

+0

Có, tôi không nhận thấy bạn đang nói về các giá trị số nguyên (nên đọc lại tiêu đề của bạn). Paul R câu trả lời là những gì bạn cần. – Trax

+0

Có.Chỉ cần tò mò, có thể thực hiện cùng một thao tác với giá trị ngắn không? – Andy