;	VirtualDub - Video processing and capture application
;	System library component
;	Copyright (C) 1998-2004 Avery Lee, All Rights Reserved.
;
;	Beginning with 1.6.0, the VirtualDub system library is licensed
;	differently than the remainder of VirtualDub.  This particular file is
;	thus licensed as follows (the "zlib" license):
;
;	This software is provided 'as-is', without any express or implied
;	warranty.  In no event will the authors be held liable for any
;	damages arising from the use of this software.
;
;	Permission is granted to anyone to use this software for any purpose,
;	including commercial applications, and to alter it and redistribute it
;	freely, subject to the following restrictions:
;
;	1.	The origin of this software must not be misrepresented; you must
;		not claim that you wrote the original software. If you use this
;		software in a product, an acknowledgment in the product
;		documentation would be appreciated but is not required.
;	2.	Altered source versions must be plainly marked as such, and must
;		not be misrepresented as being the original software.
;	3.	This notice may not be removed or altered from any source
;		distribution.

		segment	.text

	global	_VDFastMemcpyPartialScalarAligned8
_VDFastMemcpyPartialScalarAligned8:
		mov		eax, [esp+12]
		mov		edx, [esp+4]
		mov		ecx, [esp+8]
		add		ecx, eax
		add		edx, eax
		neg		eax
		jz		.nobytes
		add		eax, 8
		jz		.doodd
		jmp		short .xloop
		align	16
.xloop:
		fild	qword [ecx+eax-8]
		fild	qword [ecx+eax]
		fxch
		fistp	qword [edx+eax-8]
		fistp	qword [edx+eax]
		add		eax,16
		jnc		.xloop
		jnz		.nobytes
.doodd:
		fild	qword [ecx-8]
		fistp	qword [edx-8]
.nobytes:
		ret

	global	_VDFastMemcpyPartialMMX
_VDFastMemcpyPartialMMX:
		push	edi
		push	esi

		mov		edi, [esp+4+8]
		mov		esi, [esp+8+8]
		mov		ecx, [esp+12+8]
		mov		edx, ecx
		shr		ecx, 2
		and		edx, 3
		rep		movsd
		mov		ecx, edx
		rep		movsb
		pop		esi
		pop		edi
		ret

	global	_VDFastMemcpyPartialMMX2
_VDFastMemcpyPartialMMX2:
		push	ebp
		push	edi
		push	esi
		push	ebx

		mov		ebx, [esp+4+16]
		mov		edx, [esp+8+16]
		mov		eax, [esp+12+16]
		neg		eax
		add		eax, 63
		jbe		.skipblastloop
.blastloop:
		movq	mm0, [edx]
		movq	mm1, [edx+8]
		movq	mm2, [edx+16]
		movq	mm3, [edx+24]
		movq	mm4, [edx+32]
		movq	mm5, [edx+40]
		movq	mm6, [edx+48]
		movq	mm7, [edx+56]
		movntq	[ebx], mm0
		movntq	[ebx+8], mm1
		movntq	[ebx+16], mm2
		movntq	[ebx+24], mm3
		movntq	[ebx+32], mm4
		movntq	[ebx+40], mm5
		movntq	[ebx+48], mm6
		movntq	[ebx+56], mm7
		add		ebx, 64
		add		edx, 64
		add		eax, 64
		jnc		.blastloop
.skipblastloop:
		sub		eax, 63-7
		jns		.noextras
.quadloop:
		movq	mm0, [edx]
		movntq	[ebx], mm0
		add		edx, 8
		add		ebx, 8
		add		eax, 8
		jnc		.quadloop
.noextras:
		sub		eax, 7
		jz		.nooddballs
		mov		ecx, eax
		neg		ecx
		mov		esi, edx
		mov		edi, ebx
		rep		movsb
.nooddballs:
		pop		ebx
		pop		esi
		pop		edi
		pop		ebp
		ret


		end

