
///////////////////////////////////////////////////////////////////////////////
//
// File   : Asura_Platform_Mem.h
// Author : Andy Tate
// Date   : 16-Jul-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __ASURA_PLATFORM_MEM_H__
#define __ASURA_PLATFORM_MEM_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include <xmmintrin.h>
#include <string.h>


////////////////////////////////////////////////////////////////////////////////
// Inlined functions...
////////////////////////////////////////////////////////////////////////////////

inline int Asura_Mem::Platform_Compare(const void* pMem1, const void* pMem2, size_t uBytes)
{
	return(memcmp(pMem1, pMem2, uBytes));
}

inline void* Asura_Mem::Platform_Copy(void* pDest, const void* pSrc, size_t uBytes)
{
	return(memcpy(pDest, pSrc, uBytes));
}

inline void* Asura_Mem::Platform_SafeCopy(void* pDest, const void* pSrc, size_t uBytes)
{
	return(memcpy(pDest, pSrc, uBytes));
}

inline void* Asura_Mem::Platform_Move(void* pDest, const void* pSrc, size_t uBytes)
{
	return(memmove(pDest, pSrc, uBytes));
}

inline void* Asura_Mem::Platform_Set(void* pMem, int iChar, size_t uCount)
{
	return(memset(pMem, iChar, uCount));
}

inline void Asura_Mem::Platform_PreFetchData(const void* pData, const u_int uNumBytes)
{
	const char*	pcDataStart	= static_cast<const char*>(pData);
	const char*	pcDataEnd	= pcDataStart + uNumBytes;

	for(const char*	pcData = pcDataStart; pcData < pcDataEnd; pcData += 16)
	{
		_mm_prefetch(pcData, _MM_HINT_T2);
	}
}

#endif   // ifndef __ASURA_PLATFORM_MEM_H__


/// End of file. ///
