All pastes #740172 Raw Edit

Unnamed

public text v1 · immutable
·published 2007-10-17 19:05 UTC
rendered paste body

	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:
		}
	}