diff -r c1f20ce4abcf -r 3e88ff8f41d5 kernel/eka/common/win32/cmem.cpp --- a/kernel/eka/common/win32/cmem.cpp Tue Aug 31 16:34:26 2010 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). -// All rights reserved. -// This component and the accompanying materials are made available -// under the terms of the License "Eclipse Public License v1.0" -// which accompanies this distribution, and is available -// at the URL "http://www.eclipse.org/legal/epl-v10.html". -// -// Initial Contributors: -// Nokia Corporation - initial contribution. -// -// Contributors: -// -// Description: -// e32\common\win32\cmem.cpp -// -// - -#include "common.h" - -#ifdef __MEMMOVE_MACHINE_CODED__ - -extern "C" { - -// See header file e32cmn.h for the in-source documentation. -EXPORT_C __NAKED__ TAny* memmove(TAny* , const TAny* , unsigned int) - { - _asm push ebx ; // Save used registers - _asm push esi - _asm push edi - _asm push ebp - - _asm cmp dword ptr [esp+0x1c],0x0 ; // Is aLength == 0? - _asm mov eax,dword ptr [esp+0x14] ; // Ptr to destination - _asm mov ebx,dword ptr [esp+0x18] ; // Ptr to source - _asm je End ; // aLength is 0, just return - - _asm mov ecx,eax ; // Copy destination - _asm xor ebp,ebp ; // ebp = 0 - _asm test ecx,0x3 ; // Dest word aligned? - _asm mov edx,ebx ; // Copy ptr to source - _asm jne Misaligned ; // No - _asm test edx,0x3 ; // Source word aligned? - _asm jne Misaligned ; // No - _asm mov ebp,dword ptr [esp+0x1c] ; // ebp = aLength - _asm shr ebp,0x2 ; // ebp = aLength in words - -Misaligned: - - _asm lea edx,dword ptr [ebp*4+0x0] ; // edx = aLength in words - _asm sal ebp,0x2 ; // ebp = aLength in bytes - _asm add ebp,ecx ; // Point to end of destination - _asm mov edi,dword ptr [esp+0x1c] ; // Get number of bytes to copy - _asm sub edi,edx ; // Find remainder (aLength % 3) - _asm cmp eax,ebx ; // Dest >= source? - _asm mov edx,ebp ; // Ptr to end of destination - _asm jae DoDescendingCopy ; // Yes, copy downwards - - _asm jmp AscendingCopy ; // No, copy upwards - -AscendingCopyLoop: - - _asm mov ebp,dword ptr [ebx] ; // Get a word - _asm mov dword ptr [ecx],ebp ; // And store it - _asm add ebx,0x4 ; // Increment source by a word - _asm add ecx,0x4 ; // Increment destination by a word - -AscendingCopy: - - _asm cmp ecx,edx ; // Still data to copy? - _asm jb AscendingCopyLoop ; // Yes - - _asm mov ebp,eax ; // Copy ptr to destination - _asm add ebp,dword ptr [esp+0x1c] ; // Point to end of destination - _asm jmp CopyRemainder ; // Copy left over (aLength % 3) bytes - -CopyRemainderLoop: - - _asm movzx edx,byte ptr [ebx] ; // Get a byte - _asm mov byte ptr [ecx],dl ; // And store it - _asm inc ebx ; // Increment source by a byte - _asm inc ecx ; // Increment destination by a byte - -CopyRemainder: - - _asm cmp ecx,ebp ; // Any remaining bytes to copy? - _asm jb CopyRemainderLoop ; // Yes, go do it - - _asm jmp End ; // All done - -DoDescendingCopy: - - _asm cmp eax,ebx ; // Still data to copy? - _asm jbe End ; // No, all done - - _asm lea esi,dword ptr [edi+ebp] ; // Get ptr to end of destination - _asm mov edi,ebx ; // Get ptr to source - _asm add edi,dword ptr [esp+0x1c] ; // Point to end of source - _asm jmp DescendingCopyRemainder ; // Copy copy some data - -DescendingCopyRemainderLoop: - - _asm dec edi ; // Decrement source by a byte - _asm dec esi ; // Decrement dest by a byte - _asm movzx ebx,byte ptr [edi] ; // Get a byte - _asm mov byte ptr [esi],bl ; // And store it - -DescendingCopyRemainder: - - _asm cmp esi,ebp ; // Still data to copy? - _asm ja DescendingCopyRemainderLoop ; // Yes, go do it - - _asm jmp DescendingCopy ; // Go copy the bulk of the data - -DescendingCopyLoop: - - _asm sub edi,0x4 ; // Decrement source by a word - _asm sub edx,0x4 ; // Decrement dest by a word - _asm mov ebx,dword ptr [edi] ; // Get a word - _asm mov dword ptr [edx],ebx ; // And store it - -DescendingCopy: - - _asm cmp edx,ecx ; // Still data to copy - _asm ja DescendingCopyLoop ; // Yes, go do it - -End: - - _asm pop ebp ; // Restore used registers - _asm pop edi - _asm pop esi - _asm pop ebx - _asm ret - } - -// See header file e32cmn.h for the in-source documentation. -EXPORT_C __NAKED__ TAny* memcpy(TAny* , const TAny* , unsigned int) - { - __asm jmp (memmove); ; // memmove() will perform the same function - } -} - -#endif // defined(__MEMMOVE_MACHINE_CODED__)