R
knivil schrieb:
Macht Visual Studio daraus nicht automatisch einen unaligned read?
So sieht das assemblermäßig aus:
; __m128 tmp1 = _mm_add_ps(p1[i], p2[i]);
mov edx, DWORD PTR _i$4326[ebp]
shl edx, 4
add edx, DWORD PTR _p2$4332[ebp]
movaps xmm0, XMMWORD PTR [edx]
mov eax, DWORD PTR _i$4326[ebp]
shl eax, 4
add eax, DWORD PTR _p1$4330[ebp]
movaps xmm1, XMMWORD PTR [eax]
addps xmm1, xmm0
movaps XMMWORD PTR $T4335[ebp], xmm1
movaps xmm0, XMMWORD PTR $T4335[ebp]
movaps XMMWORD PTR _tmp1$4334[ebp], xmm0
p1[i] und p2[i] werden mit movaps geladen - also aligned. p2[i] kann allerdings nicht aligned sein, wenn p2 nur 4 Bytes hinter p1 beginnt. Es ist bedauerlich, dass VC zwar darauf achtet, dass __m128-Variablen an 16-Bytes-Grenzen ausgerichtet werden (http://msdn.microsoft.com/en-us/library/ayeb3ayc.aspx), aber nicht merkt, wenn (gecastete) __m128-Zeiger nicht restlos durch 16 teilbar sind.
viele grüße
ralph