Most of the atomic_ops functionality is available under Win32 with
the Microsoft tools, but the build process is somewhat different from
that on Linux/Unix platforms.

To build and test the package:
1) Make sure the Microsoft command-line tools (e.g. nmake) are available.
2) Go to the src directory in the distribution and run
"nmake -f Makefile.msft check".  This should build atomic_ops.lib and
atomic_ops_gpl.lib, and execute some tests.
Alternatively, CMake could be used (e.g., see how to in README_details.txt).

To compile applications, you will need to retain or copy the following
pieces from the resulting src directory contents:
       "atomic_ops.h" - Header file defining low-level primitives.  This
                        includes files from the following folder.
       "atomic_ops" - Subdirectory containing implementation header files.
                      The atomic_ops.h implementation is entirely in the
                      header files in Win32.
       "atomic_ops.lib" - Library containing implementation of AO_pause()
                          defined in atomic_ops.c (AO_pause is needed for
                          the almost lock-free stack implementation).
       "atomic_ops_stack.h" - Header file describing almost lock-free stack.
       "atomic_ops_malloc.h" - Header file describing almost lock-free malloc.
       "atomic_ops_gpl.lib" - Library containing implementation of the
                              above two.

Note that atomic_ops_gpl.lib is covered by the GNU General Public License,
while the top 3 of these pieces allow use in proprietary code.

There are several macros a client could use to configure the build with the
Microsoft tools (except for AO_CMPXCHG16B_AVAILABLE one, others should be
rarely needed in practice):
* AO_ASM_X64_AVAILABLE - inline assembly available (only x86_64)
* AO_ASSUME_VISTA - assume Windows Server 2003, Vista or later target (only
 x86, implied if Visual Studio 2015 or older)
* AO_CMPXCHG16B_AVAILABLE - assume target is not old AMD Opteron chip (only
 x86_64)
* AO_OLD_STYLE_INTERLOCKED_COMPARE_EXCHANGE - assume ancient MS VS Win32
 headers (only arm and x86)
* AO_PREFER_GENERALIZED - prefer generalized definitions to direct
 assembly-based ones
* AO_UNIPROCESSOR - assume single-core target (only arm)
* AO_USE_INTERLOCKED_INTRINSICS - assume Win32 _Interlocked* primitives
 available as intrinsics (only arm)
* AO_USE_PENTIUM4_INSTRS - use mfence instruction instead of xchg (only x86,
 implied if SSE2 is available)