我試圖將SSE3內部函數中編寫的代碼轉換爲NEON SIMD,並且因爲洗牌功能而卡住了。我曾看過GCC Intrinsic s,ARM manuals和其他論壇,但尚未能夠找到解決方案。SSE和NEON之間的轉換Intrinsics-Shuffling
CODE:
_m128i upper = _mm_loadu_si128((__m128i*)p1);
register __m128i mask1 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1);
register __m128i mask2 = _mm_set_epi8 (0x80,0x80,0x80,0x80,0x80,0x80,12,0x80,10,0x80,7,0x80,4,0x80,1,0x80);
__m128i temp1_upper = _mm_or_si128(_mm_shuffle_epi8(upper,mask1),_mm_shuffle_epi8(upper,mask2));
雖然vtbl1_u8(uint8x8_t,uint8x8_t)指令創建可用於將值分配給一目的地寄存器的查找表,它只能對。也洗牌64位寄存器操作在NEON中進行的開始比較,我不知道如何有效地做到這一點。
r0 =(mask0 & 0x80)? 0:SELECT(a,mask0 & 0x0f)// SELECT(a,n)從a中提取第n個8位參數。
r1 =(mask1 & 0x80)? 0:SELECT(一,MASK1 &爲0x0F)
...
我無法找到一個指令,它首先檢查掩模的高比特,然後選擇掩模efficiently.I的低4位知道我們可以比較寄存器中的每一位,然後在條件被指定時選擇低4位,但是我希望能夠有效地做到這一點。希望有人能夠提供幫助或提供參考。
非常感謝,
乾杯!