support.h revision 9e98b34a8c03460dacab05068d900dd424e45e53
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
189e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include <cwchar>  // mbstate_t
199e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant#include <cstdarg> // va_ macros
20efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define swprintf _snwprintf
21efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant#define vswprintf _vsnwprintf
22efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
239e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantextern "C" {
24efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
259e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint vasprintf( char **sptr, const char *__restrict fmt, va_list ap );
269e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnantint asprintf( char **sptr, const char *__restrict fmt, ...);
2778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t mbsnrtowcs( wchar_t *__restrict dst, const char **__restrict src,
2878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant                   size_t nmc, size_t len, mbstate_t *__restrict ps );
2978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnantsize_t wcsnrtombs( char *__restrict dst, const wchar_t **__restrict src,
3078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant                   size_t nwc, size_t len, mbstate_t *__restrict ps );
319e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant}
32f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant
3378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#if defined(_MSC_VER)
3478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define snprintf _snprintf
3578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <xlocinfo.h>
3678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define atoll _atoi64
3778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoll _strtoi64
3878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define strtoull _strtoui64
3978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoll _wcstoi64
4078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define wcstoull _wcstoui64
4178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE float strtof( const char *nptr, char **endptr )
4278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stof(nptr, endptr, 0); }
4378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE double strtod( const char *nptr, char **endptr )
4478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stod(nptr, endptr, 0); }
4578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE long double strtold( const char *nptr, char **endptr )
4678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return _Stold(nptr, endptr, 0); }
4778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
4878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#define _Exit _exit
4978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
509f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#ifndef __clang__ // MSVC-based Clang also defines _MSC_VER
5178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant#include <intrin.h>
52438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
53438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcount(unsigned int x) {
54438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m1 = 0x55555555; //binary: 0101...
55438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m2 = 0x33333333; //binary: 00110011..
56438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int m4 = 0x0f0f0f0f; //binary:  4 zeros,  4 ones ...
57438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned int h01= 0x01010101; //the sum of 256 to the power of 0,1,2,3...
58438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
59438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits
60438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits
61438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   return (x * h01) >> 24;  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24)
62438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
63438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
64438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountl(unsigned long x) {
65438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant  return __builtin_popcount(static_cast<int>(x));
66438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
67438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant
68438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_popcountll(unsigned long long x) {
69438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m1  = 0x5555555555555555; //binary: 0101...
70438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m2  = 0x3333333333333333; //binary: 00110011..
71438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long m4  = 0x0f0f0f0f0f0f0f0f; //binary:  4 zeros,  4 ones ...
72438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   static const unsigned long long h01 = 0x0101010101010101; //the sum of 256 to the power of 0,1,2,3...
73438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x -= (x >> 1) & m1;             //put count of each 2 bits into those 2 bits
74438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x & m2) + ((x >> 2) & m2); //put count of each 4 bits into those 4 bits
75438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   x = (x + (x >> 4)) & m4;        //put count of each 8 bits into those 8 bits
76438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant   return static_cast<int>((x * h01)>>56);  //returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ...
77438377c051ccfb662b88e38e86f085909ed2c2d7Howard Hinnant}
7878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant
7978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctz( unsigned int x )
8078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
8178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   DWORD r = 0;
8278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   _BitScanReverse(&r, x);
8378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   return static_cast<int>(r);
8478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
859e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
8678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows
8778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzl( unsigned long x )
8878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_ctz( static_cast<int>(x) ); }
899e98b34a8c03460dacab05068d900dd424e45e53Howard Hinnant
9078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_ctzll( unsigned long long x )
9178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
9278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant    DWORD r = 0;
93f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    _BitScanReverse64(&r, x);
94f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    return static_cast<int>(r);
9578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
9678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clz( unsigned int x )
9778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
9878b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   DWORD r = 0;
9978b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   _BitScanForward(&r, x);
10078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant   return static_cast<int>(r);
10178b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
10278b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant// sizeof(long) == sizeof(int) on Windows
10378b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzl( unsigned long x )
10478b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{ return __builtin_clz( static_cast<int>(x) ); }
10578b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant_LIBCPP_ALWAYS_INLINE int __builtin_clzll( unsigned long long x )
10678b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant{
10778b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant    DWORD r = 0;
108f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    _BitScanForward64(&r, x);
109f6d875f7f589ab9efcf01307a5fd6e375c14fc26Howard Hinnant    return static_cast<int>(r);
11078b6828f1420a266e02687685bc2ab993a54eaddHoward Hinnant}
1119f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#endif // !__clang__
1129f8884e6c18994360a5e580e5de3aad7a289205dHoward Hinnant#endif // _MSC_VER
113efbe4067f225856814465913bf51e87ec8f17bdbHoward Hinnant
114d41b60b2b42114bc7664b016f6be619c46095e59Bob Wilson#endif // _LIBCPP_SUPPORT_WIN32_SUPPORT_H
115