Files
reactos/reactos/lib/rtl/byteswap.c
T
Timo Kreuzer d0d304b342 [RTL]
On x86 builds use the asm versions of the byte swap functions. This is neccessary for RtlUlonglongByteswap, because the function breaks the calling convention on Windows, not cleaning up the stack. Make the asm compatible to ML and improve it a bit. Investigated by Thomas Faber.

svn path=/trunk/; revision=54097
2011-10-12 21:11:02 +00:00

97 lines
1.9 KiB
C

/* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: lib/rtl/mem.c
* PURPOSE: Memory functions
* PROGRAMMER: David Welch ([email protected])
*/
/* INCLUDES *****************************************************************/
#include <rtl.h>
#define NDEBUG
#include <debug.h>
#if defined(_M_IX86)
/* RtlUlonglongByteSwap is broken and cannot be done in C on x86 */
#error "Use rtlswap.S!"
#endif
#undef RtlUlonglongByteSwap
#undef RtlUlongByteSwap
#undef RtlUshortByteSwap
/*************************************************************************
* RtlUshortByteSwap
*
* Swap the bytes of an unsigned short value.
*
* NOTES
* Based on the inline versions in Wine winternl.h
*
* @implemented
*/
USHORT
FASTCALL
RtlUshortByteSwap(
IN USHORT Source)
{
#if defined(_M_AMD64)
return _byteswap_ushort(Source);
#else
return (Source >> 8) | (Source << 8);
#endif
}
/*************************************************************************
* RtlUlongByteSwap [NTDLL.@]
*
* Swap the bytes of an unsigned int value.
*
* NOTES
* Based on the inline versions in Wine winternl.h
*
* @implemented
*/
ULONG
FASTCALL
RtlUlongByteSwap(
IN ULONG Source)
{
#if defined(_M_AMD64)
return _byteswap_ulong(Source);
#else
return ((ULONG)RtlUshortByteSwap((USHORT)Source) << 16) | RtlUshortByteSwap((USHORT)(Source >> 16));
#endif
}
/*************************************************************************
* RtlUlonglongByteSwap
*
* Swap the bytes of an unsigned long long value.
*
* PARAMS
* i [I] Value to swap bytes of
*
* RETURNS
* The value with its bytes swapped.
*
* @implemented
*/
ULONGLONG FASTCALL
RtlUlonglongByteSwap(
IN ULONGLONG Source)
{
#if defined(_M_AMD64)
return _byteswap_uint64(Source);
#else
return ((ULONGLONG) RtlUlongByteSwap (Source) << 32) | RtlUlongByteSwap (Source>>32);
#endif
}
/* EOF */