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