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_NO_ASM_XADD - do not define asm-based AO_char_fetch_and_add_full and
  AO_short_fetch_and_add_full primitives (x86 only)
* AO_NO_ASM_XCHG - use Win32 _InterlockedExchange primitive to implement
  test-and-set and AO_nop_full operations (x86 only)
* 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)
