149 lines
3.7 KiB
C
149 lines
3.7 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1988-1992 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
Align.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
|
||
|
Author:
|
||
|
|
||
|
John Rogers (JohnRo) 15-May-1991
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
This code assumes that sizeof(DWORD) >= sizeof(LPVOID).
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
15-May-1991 JohnRo
|
||
|
Created align.h for NT/LAN from OS/2 1.2 HPFS pbmacros.h.
|
||
|
19-Jun-1991 JohnRo
|
||
|
Make sure pointer-to-wider-then-byte doesn't get messed up.
|
||
|
10-Jul-1991 JohnRo
|
||
|
Added ALIGN_BYTE and ALIGN_CHAR for completeness.
|
||
|
21-Aug-1991 CliffV
|
||
|
Fix ROUND_DOWN_* to include ~
|
||
|
03-Dec-1991 JohnRo
|
||
|
Worst-case on MIPS is 8-byte alignment.
|
||
|
Added COUNT_IS_ALIGNED() and POINTER_IS_ALIGNED() macros.
|
||
|
26-Jun-1992 JohnRo
|
||
|
RAID 9933: ALIGN_WORST should be 8 for x86 builds.
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _ALIGN_
|
||
|
#define _ALIGN_
|
||
|
|
||
|
|
||
|
// BOOL
|
||
|
// COUNT_IS_ALIGNED(
|
||
|
// IN DWORD Count,
|
||
|
// IN DWORD Pow2 // undefined if this isn't a power of 2.
|
||
|
// );
|
||
|
//
|
||
|
#define COUNT_IS_ALIGNED(Count,Pow2) \
|
||
|
( ( ( (Count) & (((Pow2)-1)) ) == 0) ? TRUE : FALSE )
|
||
|
|
||
|
// BOOL
|
||
|
// POINTER_IS_ALIGNED(
|
||
|
// IN LPVOID Ptr,
|
||
|
// IN DWORD Pow2 // undefined if this isn't a power of 2.
|
||
|
// );
|
||
|
//
|
||
|
#define POINTER_IS_ALIGNED(Ptr,Pow2) \
|
||
|
( ( ( ((ULONG_PTR)(Ptr)) & (((Pow2)-1)) ) == 0) ? TRUE : FALSE )
|
||
|
|
||
|
|
||
|
#define ROUND_DOWN_COUNT(Count,Pow2) \
|
||
|
( (Count) & (~(((LONG)(Pow2))-1)) )
|
||
|
|
||
|
#define ROUND_DOWN_POINTER(Ptr,Pow2) \
|
||
|
( (LPVOID) ROUND_DOWN_COUNT( ((ULONG_PTR)(Ptr)), (Pow2) ) )
|
||
|
|
||
|
|
||
|
// If Count is not already aligned, then
|
||
|
// round Count up to an even multiple of "Pow2". "Pow2" must be a power of 2.
|
||
|
//
|
||
|
// DWORD
|
||
|
// ROUND_UP_COUNT(
|
||
|
// IN DWORD Count,
|
||
|
// IN DWORD Pow2
|
||
|
// );
|
||
|
#define ROUND_UP_COUNT(Count,Pow2) \
|
||
|
( ((Count)+(Pow2)-1) & (~(((LONG)(Pow2))-1)) )
|
||
|
|
||
|
// LPVOID
|
||
|
// ROUND_UP_POINTER(
|
||
|
// IN LPVOID Ptr,
|
||
|
// IN DWORD Pow2
|
||
|
// );
|
||
|
|
||
|
// If Ptr is not already aligned, then round it up until it is.
|
||
|
#define ROUND_UP_POINTER(Ptr,Pow2) \
|
||
|
( (LPVOID) ( (((ULONG_PTR)(Ptr))+(Pow2)-1) & (~(((LONG)(Pow2))-1)) ) )
|
||
|
|
||
|
|
||
|
// Usage: myPtr = ROUND_UP_POINTER( unalignedPtr, ALIGN_LPVOID )
|
||
|
|
||
|
#define ALIGN_BYTE sizeof(UCHAR)
|
||
|
#define ALIGN_CHAR sizeof(CHAR)
|
||
|
#define ALIGN_DESC_CHAR sizeof(DESC_CHAR)
|
||
|
#define ALIGN_DWORD sizeof(DWORD)
|
||
|
#define ALIGN_LONG sizeof(LONG)
|
||
|
#define ALIGN_LPBYTE sizeof(LPBYTE)
|
||
|
#define ALIGN_LPDWORD sizeof(LPDWORD)
|
||
|
#define ALIGN_LPSTR sizeof(LPSTR)
|
||
|
#define ALIGN_LPTSTR sizeof(LPTSTR)
|
||
|
#define ALIGN_LPVOID sizeof(LPVOID)
|
||
|
#define ALIGN_LPWORD sizeof(LPWORD)
|
||
|
#define ALIGN_TCHAR sizeof(TCHAR)
|
||
|
#define ALIGN_WCHAR sizeof(WCHAR)
|
||
|
#define ALIGN_WORD sizeof(WORD)
|
||
|
|
||
|
//
|
||
|
// For now, use a hardcoded constant. however, this should be visited again
|
||
|
// and maybe changed to sizeof(QUAD).
|
||
|
//
|
||
|
|
||
|
#define ALIGN_QUAD 8
|
||
|
|
||
|
#if defined(_X86_)
|
||
|
|
||
|
#define ALIGN_WORST 8
|
||
|
|
||
|
#elif defined(_AMD64_)
|
||
|
|
||
|
#define ALIGN_WORST 8
|
||
|
|
||
|
#elif defined(_ALPHA_)
|
||
|
|
||
|
//
|
||
|
// Worst-case alignment on ALPHA is 8 bytes (for double). Specify this here,
|
||
|
// in case our allocator is used for structures containing this. (That is,
|
||
|
// even though NT/LAN doesn't need this for our data structures, let's be
|
||
|
// permissive.) The alignment requirements apply to Alpha.
|
||
|
//
|
||
|
|
||
|
#define ALIGN_WORST 8
|
||
|
|
||
|
#elif defined(_IA64_)
|
||
|
|
||
|
//
|
||
|
// IA64 note for QUAD: The NT QUAD type definition is NOT the EM 16byte quad type.
|
||
|
// Because of some NT constraints, QUAD type size cannot be changed.
|
||
|
//
|
||
|
|
||
|
#define ALIGN_WORST 16
|
||
|
|
||
|
#else // none of the above
|
||
|
|
||
|
#error "Unknown alignment requirements for align.h"
|
||
|
|
||
|
#endif // none of the above
|
||
|
|
||
|
#endif // _ALIGN_
|