我正在使用VC++ 2010中的以下设置编译一些代码:/ O2/Ob2/Oi/Ot
但是我在理解生成的程序集的某些部分时遇到了一些问题,我在代码中提出了一些问题作为注释.
此外,现代cpu通常建议使用什么预取距离?我可以在我自己的cpu上进行测试,但我希望能够在更广泛的cpu上运行良好的价值.也许可以使用动态预取距离?
< - 编辑:
我很惊讶的另一件事是编译器不以某种形式交错movdqa和movntdq指令?由于这些指令在某种意义上与我的理解不同步.
此代码在预取时也假设32字节高速缓存行,但高端cpus似乎有64字节高速缓存行,因此可能会删除2个预取.
- >
void memcpy_aligned_x86(void* dest, const void* source, size_t size)
{
0052AC20 push ebp
0052AC21 mov ebp,esp
const __m128i* source_128 = reinterpret_cast<const __m128i*>(source);
for(size_t n = 0; n < size/16; n += 8)
0052AC23 mov edx,dword ptr [size]
0052AC26 mov ecx,dword ptr [dest]
0052AC29 mov eax,dword ptr [source]
0052AC2C shr edx,4
0052AC2F test edx,edx
0052AC31 je copy+9Eh (52ACBEh)
__m128i xmm0 = _mm_setzero_si128();
__m128i xmm1 = _mm_setzero_si128();
__m128i xmm2 = _mm_setzero_si128(); …Run Code Online (Sandbox Code Playgroud)