316 lines
7.1 KiB
C
316 lines
7.1 KiB
C
/********************************************************************************
|
|
Copyright (C) 2001-2012 Hugh Bailey <obs.jim@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
|
|
********************************************************************************/
|
|
|
|
|
|
#pragma once
|
|
|
|
//disable this warning just for this file
|
|
#pragma warning(disable : 4035)
|
|
|
|
|
|
#ifdef WIN32
|
|
#pragma intrinsic(memcpy, memset, memcmp)
|
|
#endif
|
|
|
|
|
|
#ifndef USE_CUSTOM_MEMORY_FUNCTIONS
|
|
|
|
inline void STDCALL mcpy(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
memcpy(pDest, pSrc, iLen);
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
#ifdef C64
|
|
|
|
|
|
#ifdef USE_CUSTOM_MEMORY_FUNCTIONS
|
|
|
|
inline void STDCALL mcpy(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register QWORD *srcQW = (QWORD*)pSrc, *destQW = (QWORD*)pDest;
|
|
while(iLenDiv8--)
|
|
*(destQW++) = *(srcQW++);
|
|
|
|
register BYTE *srcB = (BYTE*)srcQW, *destB = (BYTE*)destQW;
|
|
while(iLenMod8--)
|
|
*(destB++) = *(srcB++);
|
|
}
|
|
|
|
#endif
|
|
|
|
inline BOOL STDCALL mcmp(const void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register QWORD *srcQW = (QWORD*)pSrc, *destQW = (QWORD*)pDest;
|
|
while(iLenDiv8--)
|
|
{
|
|
if(*(srcQW++) != *(destQW++))
|
|
return FALSE;
|
|
}
|
|
|
|
register BYTE *srcB = (BYTE*)srcQW, *destB = (BYTE*)destQW;
|
|
while(iLenMod8--)
|
|
{
|
|
if(*(srcB++) != *(destB++))
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
inline void STDCALL zero(void *pDest, size_t iLen)
|
|
{
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register QWORD *destQW = (QWORD*)pDest;
|
|
while(iLenDiv8--)
|
|
*(destQW++) = 0;
|
|
|
|
register BYTE *destB = (BYTE*)destQW;
|
|
while(iLenMod8--)
|
|
*(destB++) = 0;
|
|
}
|
|
|
|
inline void STDCALL msetd(void *pDest, DWORD val, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
|
|
QWORD newVal = ((QWORD)val)|(((QWORD)val)<<32);
|
|
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register QWORD *destQW = (QWORD*)pDest;
|
|
while(iLenDiv8--)
|
|
*(destQW++) = newVal;
|
|
|
|
register BYTE *destB = (BYTE*)destQW;
|
|
register BYTE *pVal = (BYTE*)&newVal;
|
|
while(iLenMod8--)
|
|
*(destB++) = *(pVal++);
|
|
}
|
|
|
|
inline void STDCALL mswap(void *pDest, void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register QWORD *srcQW = (QWORD*)pSrc, *destQW = (QWORD*)pDest;
|
|
while(iLenDiv8--)
|
|
{
|
|
QWORD qw = *destQW;
|
|
*(destQW++) = *srcQW;
|
|
*(srcQW++) = qw;
|
|
}
|
|
|
|
register BYTE *srcB = (BYTE*)srcQW, *destB = (BYTE*)destQW;
|
|
while(iLenMod8--)
|
|
{
|
|
BYTE b = *destB;
|
|
*(destB++) = *srcB;
|
|
*(srcB++) = b;
|
|
}
|
|
}
|
|
|
|
inline void STDCALL mcpyrev(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod8 = iLen&7;
|
|
register size_t iLenDiv8 = iLen>>3;
|
|
|
|
register BYTE *srcB = (BYTE*)pSrc, *destB = (BYTE*)pDest;
|
|
register QWORD *srcQW = (QWORD*)(srcB+iLen), *destQW = (QWORD*)(destB+iLen);
|
|
while(iLenDiv8--)
|
|
*(--destQW) = *(--srcQW);
|
|
|
|
srcB = (BYTE*)srcQW;
|
|
destB = (BYTE*)destQW;
|
|
while(iLenMod8--)
|
|
*(--destB) = *(--srcB);
|
|
}
|
|
|
|
inline unsigned int PtrTo32(void *ptr)
|
|
{
|
|
return ((unsigned int)((unsigned long long)ptr));
|
|
}
|
|
|
|
#else
|
|
|
|
#pragma warning(disable : 4311)
|
|
|
|
inline unsigned int PtrTo32(void *ptr)
|
|
{
|
|
return ((unsigned int)ptr);
|
|
}
|
|
|
|
#pragma warning(default : 4311)
|
|
|
|
#ifdef USE_CUSTOM_MEMORY_FUNCTIONS
|
|
inline void STDCALL mcpy(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register DWORD *srcDW = (DWORD*)pSrc, *destDW = (DWORD*)pDest;
|
|
while(iLenDiv4--)
|
|
*(destDW++) = *(srcDW++);
|
|
|
|
register BYTE *srcB = (BYTE*)srcDW, *destB = (BYTE*)destDW;
|
|
while(iLenMod4--)
|
|
*(destB++) = *(srcB++);
|
|
}
|
|
#endif
|
|
|
|
inline void STDCALL zero(void *pDest, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register DWORD *destDW = (DWORD*)pDest;
|
|
while(iLenDiv4--)
|
|
*(destDW++) = 0;
|
|
|
|
register BYTE *destB = (BYTE*)destDW;
|
|
while(iLenMod4--)
|
|
*(destB++) = 0;
|
|
}
|
|
|
|
inline BOOL STDCALL mcmp(const void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register DWORD *srcDW = (DWORD*)pSrc, *destDW = (DWORD*)pDest;
|
|
while(iLenDiv4--)
|
|
{
|
|
if(*(srcDW++) != *(destDW++))
|
|
return FALSE;
|
|
}
|
|
|
|
register BYTE *srcB = (BYTE*)srcDW, *destB = (BYTE*)destDW;
|
|
while(iLenMod4--)
|
|
{
|
|
if(*(srcB++) != *(destB++))
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
inline void STDCALL msetd(void *pDest, DWORD val, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register DWORD *destDW = (DWORD*)pDest;
|
|
while(iLenDiv4--)
|
|
*(destDW++) = val;
|
|
|
|
register BYTE *destB = (BYTE*)destDW;
|
|
register BYTE *pVal = (BYTE*)&val;
|
|
while(iLenMod4--)
|
|
*(destB++) = *(pVal++);
|
|
}
|
|
|
|
inline void STDCALL mswap(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register DWORD *srcDW = (DWORD*)pSrc, *destDW = (DWORD*)pDest;
|
|
while(iLenDiv4--)
|
|
{
|
|
DWORD dw = *destDW;
|
|
*(destDW++) = *srcDW;
|
|
*(srcDW++) = dw;
|
|
}
|
|
|
|
register BYTE *srcB = (BYTE*)srcDW, *destB = (BYTE*)destDW;
|
|
while(iLenMod4--)
|
|
{
|
|
BYTE b = *destB;
|
|
*(destB++) = *srcB;
|
|
*(srcB++) = b;
|
|
}
|
|
}
|
|
|
|
inline void STDCALL mcpyrev(void *pDest, const void *pSrc, size_t iLen)
|
|
{
|
|
assert(pDest);
|
|
assert(pSrc);
|
|
|
|
register size_t iLenMod4 = iLen&3;
|
|
register size_t iLenDiv4 = iLen>>2;
|
|
|
|
register BYTE *srcB = (BYTE*)pSrc, *destB = (BYTE*)pDest;
|
|
register DWORD *srcDW = (DWORD*)(srcB+iLen), *destDW = (DWORD*)(destB+iLen);
|
|
while(iLenDiv4--)
|
|
*(--destDW) = *(--srcDW);
|
|
|
|
srcB = (BYTE*)srcDW;
|
|
destB = (BYTE*)destDW;
|
|
while(iLenMod4--)
|
|
*(--destB) = *(--srcB);
|
|
}
|
|
|
|
#endif
|
|
|
|
inline void STDCALL mset(void *pDest, unsigned char val, size_t iLen)
|
|
{
|
|
msetd(pDest, (val)|(val<<8)|(val<<16)|(val<<24), iLen);
|
|
}
|
|
|
|
inline void nop()
|
|
{
|
|
}
|
|
|
|
#pragma warning(default : 4035)
|