support.h revision ef5aa93b9cdc5bfea3e4c59bafd784a9ff968dec
192a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// -*- C++ -*-
2efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant//===----------------------- support/win32/support.h ----------------------===//
392a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//
492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//                     The LLVM Compiler Infrastructure
592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//
692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// This file is dual licensed under the MIT and the University of Illinois Open
792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant// Source Licenses. See LICENSE.TXT for details.
892a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//
992a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant//===----------------------------------------------------------------------===//
1092a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant
11efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#ifndef _LIBCPP_SUPPORT_WIN32_SUPPORT_H
12efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define _LIBCPP_SUPPORT_WIN32_SUPPORT_H
13efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
1492a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant/*
1592a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant   Functions and constants used in libc++ that are missing from the Windows C library.
1692a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant  */
1792a07003b2ce449b22709fbd9b4f1e49b3a2fd3eHoward Hinnant
18ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#include <wchar.h>  // mbstate_t
199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include <cstdarg> // va_ macros
20efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define swprintf _snwprintf
21efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vswprintf _vsnwprintf
22efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
23ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#ifndef NOMINMAX
24ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#define NOMINMAX
25ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#endif
26ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant#include <Windows.h>
27ef5aa93b9cdc5bfea3e4c59bafd784a9ff968decHoward Hinnant
289e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantextern "C" {
29efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
309e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint vasprintf( char **sptr, const char *__restrict fmt, va_list ap );
319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint asprintf( char **sptr, const char *__restrict fmt, ...);
3278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
3378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant                   size_t nmc, size_t len, mbstate_t *__restrict ps );
3478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
3578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant                   size_t nwc, size_t len, mbstate_t *__restrict ps );
369e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
37f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant
38e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#if defined(_LIBCPP_MSVCRT)
3978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define snprintf _snprintf
4078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <xlocinfo.h>
4178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define atoll _atoi64
4278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoll _strtoi64
4378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoull _strtoui64
4478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoll _wcstoi64
4578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoull _wcstoui64
4678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE float strtof( const char *nptr, char **endptr )
4778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stof(nptr, endptr, 0); }
4878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE double strtod( const char *nptr, char **endptr )
4978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stod(nptr, endptr, 0); }
5078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE long double strtold( const char *nptr, char **endptr )
5178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stold(nptr, endptr, 0); }
5278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
5378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define _Exit _exit
5478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
559f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#ifndef __clang__ // MSVC-based Clang also defines _MSC_VER
5678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <intrin.h>
57438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
58438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcount(unsigned int x) {
59438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m1 = 0x55555555; //binary: 0101...
60438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m2 = 0x33333333; //binary: 00110011..
61438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m4 = 0x0f0f0f0f; //binary:  4 zeros,  4 ones ...
62438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int h01= 0x01010101; //the sum of 256 to the power of 0,1,2,3...
63438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
64438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits
65438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits
66438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   return (x * h01) >> 24;  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24)
67438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
68438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
69438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountl(unsigned long x) {
70438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant  return __builtin_popcount(static_cast<int>(x));
71438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
72438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
73438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountll(unsigned long long x) {
74438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m1  = 0x5555555555555555; //binary: 0101...
75438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m2  = 0x3333333333333333; //binary: 00110011..
76438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m4  = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...
77438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...
78438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
79438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits
80438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits
81438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   return static_cast<int>((x * h01)>>56);  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ...
82438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
8378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
8478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctz( unsigned int x )
8578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
8678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   DWORD r = 0;
8778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   _BitScanReverse(&r, x);
8878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   return static_cast<int>(r);
8978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
909e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
9178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows
9278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzl( unsigned long x )
9378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_ctz( static_cast<int>(x) ); }
949e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
9578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzll( unsigned long long x )
9678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
9778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant    DWORD r = 0;
98f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    _BitScanReverse64(&r, x);
99f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    return static_cast<int>(r);
10078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
10178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clz( unsigned int x )
10278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
10378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   DWORD r = 0;
10478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   _BitScanForward(&r, x);
10578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   return static_cast<int>(r);
10678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
10778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows
10878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzl( unsigned long x )
10978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_clz( static_cast<int>(x) ); }
11078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzll( unsigned long long x )
11178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
11278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant    DWORD r = 0;
113f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    _BitScanForward64(&r, x);
114f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    return static_cast<int>(r);
11578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
1169f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#endif // !__clang__
117e9df0a5c6c864f1ea86486881a3ee559c56105e7Howard Hinnant#endif // _LIBCPP_MSVCRT
118efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
119d41b60b2b42114bc7664b016f6be619c46095e59Bob Wilson#endif // _LIBCPP_SUPPORT_WIN32_SUPPORT_H
120