__m128i* p_aoffsets = (__m128i*)aoffsets;
__m128i* p_boffsets = (__m128i*)boffsets;
int n_count = MATCH_MASK / 8 + 1;
for(int i = 0; i < n_count; ++i)
{
p_aoffsets[i] = _mm_subs_epi16(p_aoffsets[i], p_boffsets[i]);
}
__m128i* p_boffsets = (__m128i*)boffsets;
int n_count = MATCH_MASK / 8 + 1;
for(int i = 0; i < n_count; ++i)
{
p_aoffsets[i] = _mm_subs_epi16(p_aoffsets[i], p_boffsets[i]);
}
#pragma pack(16),__declspec(align(16))就是兩坨屎,想搞
SSE,絕對,千萬,永遠,不要用!!! 我用了一整年的movupd啊!!!!!!
最後找遍了整個中文世界沒有,還是請教寫彙編的老外得到了精華,
想對齊16字節,最好的辦法是人肉手動對齊內存...
SSE,絕對,千萬,永遠,不要用!!! 我用了一整年的movupd啊!!!!!!
最後找遍了整個中文世界沒有,還是請教寫彙編的老外得到了精華,
想對齊16字節,最好的辦法是人肉手動對齊內存...
整理後的對齊函數:
static inline void* align(const void* x, int n)
{
int p = (int)x;
p = (p % n == 0)? (p) : (p + n - p % n);
return (void*)p;
}
{
int p = (int)x;
p = (p % n == 0)? (p) : (p + n - p % n);
return (void*)p;
}
使用時先分配比需要的字節數多n個字節(n爲希望的對齊數),然後調用函數返回對齊後的地址,示例:
char a_block_head[MATCH_MASK * 2 + 16u] = {0};
uint16_t* aoffsets = align(a_block_head, 16);
uint16_t* aoffsets = align(a_block_head, 16);