我在理解SSE2指令时遇到了一些麻烦。根据microsoft文档,_mm_load_si128需要一个16字节对齐的地址作为参数。在我试图理解的代码中,情况似乎并非如此:
void f(uchar* buf0, const int n)
{
ushort* buf = (ushort*)alignPtr(buf0, 16);
for(int i = 0; i < n; i += 16)
{
__m128i v0 = _mm_load_si128((__m128i*)(buf+i)); // 16-byte-aligned, since buf is 16-byte-aligned and i is divisable by 16.
__m128i v1 = _mm_load_si128((__m128i*)(buf+i+8)); // If buf+i is 16-byte-aligned, then buf+i+8 cannot be 16-byte-aligned.
}
}
我将代码缩减到相关部分并重命名了一些变量。原始代码来自Konoliges块匹配算法的OpenCV实现(stereobm.cpp,尤其是第313行)。我的问题是,为什么代码是正确的以及写入v1的内容是什么?