inline float DotProduct(float *pInVecA, float *pInVecB, DWORD nLen) { float rOutVal = 0; _asm { lea ecx, rOutVal mov esi, pInVecA mov edi, pInVecB xorps xmm7, xmm7 mov eax, nLen xor edx, edx mov ebx, 0xC div ebx BEGIN_12: cmp eax, 0x0 je END_12 movaps xmm0, [esi] movaps xmm1, [esi+0x10] movaps xmm2, [esi+0x20] prefetchnta [esi+0x30] movaps xmm4, [edi] movaps xmm5, [edi+0x10] movaps xmm6, [edi+0x20] prefetchnta [edi+0x30] mulps xmm0, xmm4 add esi, 0x30 mulps xmm1, xmm5 add edi, 0x30 mulps xmm2, xmm6 haddps xmm0, xmm1 haddps xmm0, xmm2 haddps xmm0, xmm0 haddps xmm0, xmm0 addss xmm7, xmm0 dec eax jmp BEGIN_12 END_12: mov ax, dx mov bl, 0x8 div bl BEGIN_8: cmp al, 0x0 je END_8 movaps xmm0, [esi] movaps xmm1, [esi+0x10] prefetchnta [esi+0x20] movaps xmm4, [edi] movaps xmm5, [edi+0x10] prefetchnta [edi+0x20] mulps xmm0, xmm4 add esi, 0x20 mulps xmm1, xmm5 add edi, 0x20 haddps xmm0, xmm1 haddps xmm0, xmm0 haddps xmm0, xmm0 addss xmm7, xmm0 dec al jmp BEGIN_8 END_8: mov al, ah xor ah, ah mov bl, 0x4 div bl BEGIN_4: cmp al, 0x0 je END_4 movaps xmm0, [esi] prefetchnta [esi+0x10] movaps xmm4, [edi] prefetchnta [edi+0x10] mulps xmm0, xmm4 add esi, 0x10 add edi, 0x10 haddps xmm0, xmm0 haddps xmm0, xmm0 addss xmm7, xmm0 dec al jmp BEGIN_4 END_4: BEGIN_1: cmp ah, 0x0 je END_1 movss xmm0, [esi] prefetchnta [esi+0x4] movss xmm4, [edi] prefetchnta [edi+0x4] mulss xmm0, xmm4 add esi, 0x4 add edi, 0x4 addss xmm7, xmm0 dec ah jmp BEGIN_1 END_1: movss [ecx], xmm7 } return rOutVal; } inline void TransformAdd2(float *pOutVec, float *pInVec, DWORD nLen) { _asm { mov esi, pOutVec mov edi, pInVec mov eax, nLen xor edx, edx mov ebx, 0x10 div ebx BEGIN_16: cmp eax, 0x0 je END_16 movaps xmm0, [esi] movaps xmm1, [esi+0x10] movaps xmm2, [esi+0x20] movaps xmm3, [esi+0x30] prefetchnta [esi+0x40] movaps xmm4, [edi] movaps xmm5, [edi+0x10] movaps xmm6, [edi+0x20] movaps xmm7, [edi+0x30] prefetchnta [edi+0x40] addps xmm0, xmm4 add esi, 0x40 addps xmm1, xmm5 add edi, 0x40 addps xmm2, xmm6 addps xmm3, xmm7 movaps [esi-0x40], xmm0 movaps [esi-0x40+0x10], xmm1 movaps [esi-0x40+0x20], xmm2 movaps [esi-0x40+0x30], xmm3 dec eax jmp BEGIN_16 END_16: mov ax, dx mov bl, 0x8 div bl BEGIN_8: cmp al, 0x0 je END_8 movaps xmm0, [esi] movaps xmm1, [esi+0x10] prefetchnta [esi+0x20] movaps xmm4, [edi] movaps xmm5, [edi+0x10] prefetchnta [edi+0x20] addps xmm0, xmm4 add esi, 0x20 addps xmm1, xmm5 add edi, 0x20 movaps [esi-0x20], xmm0 movaps [esi-0x20+0x10], xmm1 dec al jmp BEGIN_8 END_8: mov al, ah xor ah, ah mov bl, 0x4 div bl BEGIN_4: cmp al, 0x0 je END_4 movaps xmm0, [esi] prefetchnta [esi+0x10] movaps xmm4, [edi] prefetchnta [edi+0x10] addps xmm0, xmm4 add edi, 0x10 movss [esi], xmm0 add esi, 0x10 dec al jmp BEGIN_4 END_4: BEGIN_1: cmp ah, 0x0 je END_1 movss xmm0, [esi] prefetchnta [esi+0x4] movss xmm4, [edi] prefetchnta [edi+0x4] addss xmm0, xmm4 add edi, 0x4 movss [esi], xmm0 add esi, 0x4 dec ah jmp BEGIN_1 END_1: } }