2011-08-26 22 views
11

Tôi đang gặp một số sự cố khi tìm ra tương đương NEON của một vài hoạt động SSE của Intel. Có vẻ như NEON không có khả năng xử lý toàn bộ thanh ghi Q cùng một lúc (kiểu dữ liệu giá trị 128 bit). Tôi không tìm thấy bất kỳ điều gì trong tiêu đề arm_neon.h hoặc trong số NEON intrinsics reference.NEON vs Intel SSE - tương đương với một số hoạt động nhất định

Những gì tôi muốn làm là như sau:

// Intel SSE 
// shift the entire 128 bit value with 2 bytes to the right; this is done 
// without sign extension by shifting in zeros 
__m128i val = _mm_srli_si128(vector_of_8_s16, 2); 
// insert the least significant 16 bits of "some_16_bit_val" 
// the whole thing in this case, into the selected 16 bit 
// integer of vector "val"(the 16 bit element with index 7 in this case) 
val = _mm_insert_epi16(val, some_16_bit_val, 7); 

Tôi đã xem xét các hoạt động chuyển cung cấp bởi NEON nhưng không thể tìm thấy một cách tương đương với cách làm ở trên (Tôi không có nhiều kinh nghiệm với NEON). Có thể làm điều trên (tôi đoán đó là tôi chỉ không biết làm thế nào)? Bất kỳ con trỏ nào được đánh giá cao.

Trả lời

6

Bạn muốn có hướng dẫn VEXT. Ví dụ bạn sẽ giống như thế:

int16x8_t val = vextq_s16(vector_of_8_s16, another_vector_s16, 1); 

Sau này, bit 0-111 của val sẽ chứa bit 16-127 của vector_of_8_s16, và bit 112-127 của val sẽ chứa bit 0-15 của another_vector_s16.

+0

Tôi thực sự đã triển khai nó theo cách đó. Bạn có thể cung cấp một ví dụ để tôi xác thực phương pháp tiếp cận của mình không? – celavek

+0

đã xóa câu trả lời của tôi về vtbl và vtbx. vext là con đường để đi! –

+0

@celavek: Tôi đã cung cấp một ví dụ, nhưng cách để xác thực phương pháp tiếp cận của bạn là bằng cách thử nghiệm nó, không phải bằng cách so sánh nó với một ví dụ. Nó hoạt động hoặc không. –