__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);
转载于:https://blog.51cto.com/magicyang/1065700