Сейчас я работаю над небольшой оптимизацией функции базового точечного произведения, используя инструкции SSE в visual studio.
Вот мой код: (соглашение о вызове функции - cdecl):
float SSEDP4(const vect & vec1, const vect & vec2)
{
__asm
{
// get addresses
mov ecx, dword ptr[vec1]
mov edx, dword ptr[vec2]
// get the first vector
movups xmm1, xmmword ptr[ecx]
// get the second vector (must use movups, because data is not assured to be aligned to 16 bytes => TODO align data)
movups xmm1, xmmword ptr[edx]
// OP by OP multiply with second vector (by address)
mulps xmm1, xmm2
// add everything with horizontal add func (SSE3)
haddps xmm1, xmm1
// is one addition enough ?
// try to extract, we'll see
pextrd eax, xmm1, 03h
}
}
vect
- это простая структура, которая содержит 4 плавающих одинарной точности, не выровненных по 16 байтам (поэтому я использую movups
, а не movaps
)
vec1
инициализируетсяс (1.0, 1.2, 1.4, 1.0)
и vec2
с (2.0, 1.8, 1.6, 1.0)
Все компилируется хорошо, но при выполнении я получил 0 в обоих регистрах XMM, и поэтому в результате отладки Visual Studio показывает мне 2 регистра (MMX1 иMMX2, или иногда MMX2 и MMX3), которые представляют собой 64-битные регистры, но без XMM и всего до 0.
Кто-нибудь имеет представление о том, что происходит?
Заранее спасибо :))