summaryrefslogtreecommitdiffstats
path: root/private/inc/align.h
diff options
context:
space:
mode:
authorAdam <you@example.com>2020-05-17 05:51:50 +0200
committerAdam <you@example.com>2020-05-17 05:51:50 +0200
commite611b132f9b8abe35b362e5870b74bce94a1e58e (patch)
treea5781d2ec0e085eeca33cf350cf878f2efea6fe5 /private/inc/align.h
downloadNT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.gz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.bz2
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.lz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.xz
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.tar.zst
NT4.0-e611b132f9b8abe35b362e5870b74bce94a1e58e.zip
Diffstat (limited to 'private/inc/align.h')
-rw-r--r--private/inc/align.h147
1 files changed, 147 insertions, 0 deletions
diff --git a/private/inc/align.h b/private/inc/align.h
new file mode 100644
index 000000000..3a320acf7
--- /dev/null
+++ b/private/inc/align.h
@@ -0,0 +1,147 @@
+/*++
+
+Copyright (c) 1988-1992 Microsoft Corporation
+
+Module Name:
+
+ Align.h
+
+Abstract:
+
+ BUGBUG
+
+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) \
+ ( ( ( ((DWORD)(Ptr)) & (((Pow2)-1)) ) == 0) ? TRUE : FALSE )
+
+
+#define ROUND_DOWN_COUNT(Count,Pow2) \
+ ( (Count) & (~((Pow2)-1)) )
+
+#define ROUND_DOWN_POINTER(Ptr,Pow2) \
+ ( (LPVOID) ROUND_DOWN_COUNT( ((DWORD)(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) & (~((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) ( (((DWORD)(Ptr))+(Pow2)-1) & (~((Pow2)-1)) ) )
+
+
+// Usage: myPtr = ROUND_UP_POINTER(unalignedPtr, ALIGN_DWORD);
+
+
+#if defined(_X86_)
+
+#define ALIGN_BYTE 1
+#define ALIGN_CHAR 1
+#define ALIGN_DESC_CHAR sizeof(DESC_CHAR)
+#define ALIGN_DWORD 4
+#define ALIGN_LONG 4
+#define ALIGN_LPBYTE 4
+#define ALIGN_LPDWORD 4
+#define ALIGN_LPSTR 4
+#define ALIGN_LPTSTR 4
+#define ALIGN_LPVOID 4
+#define ALIGN_LPWORD 4
+#define ALIGN_TCHAR sizeof(TCHAR)
+#define ALIGN_WCHAR sizeof(WCHAR)
+#define ALIGN_WORD 2
+#define ALIGN_QUAD 8
+
+#define ALIGN_WORST 8
+
+#elif defined(_MIPS_) || defined(_ALPHA_) || defined(_PPC_)
+
+#define ALIGN_BYTE 1
+#define ALIGN_CHAR 1
+#define ALIGN_DESC_CHAR sizeof(DESC_CHAR)
+#define ALIGN_DWORD 4
+#define ALIGN_LONG 4
+#define ALIGN_LPBYTE 4
+#define ALIGN_LPDWORD 4
+#define ALIGN_LPSTR 4
+#define ALIGN_LPTSTR 4
+#define ALIGN_LPVOID 4
+#define ALIGN_LPWORD 4
+#define ALIGN_TCHAR sizeof(TCHAR)
+#define ALIGN_WCHAR sizeof(WCHAR)
+#define ALIGN_WORD 2
+#define ALIGN_QUAD 8
+
+//
+// Worst-case alignment on MIPS 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
+
+#else // none of the above
+
+#error "Unknown alignment requirements for align.h"
+
+#endif // none of the above
+
+
+#endif // _ALIGN_