forked from OSchip/llvm-project
[libc++][NFC] Remove MSVC specific code.
Switching `__builtin_clzll` to `__libcpp_clz` should work on all platforms and no longer require MSVC specific code. Reviewed By: #libc, ldionne Differential Revision: https://reviews.llvm.org/D107709
This commit is contained in:
parent
3240000546
commit
96ed451f8d
|
@ -74,6 +74,7 @@ namespace std {
|
|||
*/
|
||||
|
||||
#include <__availability>
|
||||
#include <__bits>
|
||||
#include <__config>
|
||||
#include <__errc>
|
||||
#include <__utility/to_underlying.h>
|
||||
|
@ -204,13 +205,11 @@ struct _LIBCPP_HIDDEN __traits_base
|
|||
{
|
||||
using type = uint64_t;
|
||||
|
||||
#if !defined(_LIBCPP_COMPILER_MSVC)
|
||||
static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
|
||||
{
|
||||
auto __t = (64 - __builtin_clzll(__v | 1)) * 1233 >> 12;
|
||||
auto __t = (64 - _VSTD::__libcpp_clz(static_cast<type>(__v | 1))) * 1233 >> 12;
|
||||
return __t - (__v < __pow10_64[__t]) + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_AVAILABILITY_TO_CHARS
|
||||
static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
|
||||
|
@ -227,13 +226,11 @@ struct _LIBCPP_HIDDEN
|
|||
{
|
||||
using type = uint32_t;
|
||||
|
||||
#if !defined(_LIBCPP_COMPILER_MSVC)
|
||||
static _LIBCPP_INLINE_VISIBILITY int __width(_Tp __v)
|
||||
{
|
||||
auto __t = (32 - __builtin_clz(__v | 1)) * 1233 >> 12;
|
||||
auto __t = (32 - _VSTD::__libcpp_clz(static_cast<type>(__v | 1))) * 1233 >> 12;
|
||||
return __t - (__v < __pow10_32[__t]) + 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
_LIBCPP_AVAILABILITY_TO_CHARS
|
||||
static _LIBCPP_INLINE_VISIBILITY char* __convert(_Tp __v, char* __p)
|
||||
|
@ -354,28 +351,10 @@ __to_chars_itoa(char* __first, char* __last, _Tp __value, false_type)
|
|||
using __tx = __itoa::__traits<_Tp>;
|
||||
auto __diff = __last - __first;
|
||||
|
||||
#if !defined(_LIBCPP_COMPILER_MSVC)
|
||||
if (__tx::digits <= __diff || __tx::__width(__value) <= __diff)
|
||||
return {__tx::__convert(__value, __first), errc(0)};
|
||||
else
|
||||
return {__last, errc::value_too_large};
|
||||
#else
|
||||
if (__tx::digits <= __diff)
|
||||
return {__tx::__convert(__value, __first), {}};
|
||||
else
|
||||
{
|
||||
char __buf[__tx::digits];
|
||||
auto __p = __tx::__convert(__value, __buf);
|
||||
auto __len = __p - __buf;
|
||||
if (__len <= __diff)
|
||||
{
|
||||
_VSTD::memcpy(__first, __buf, __len);
|
||||
return {__first + __len, {}};
|
||||
}
|
||||
else
|
||||
return {__last, errc::value_too_large};
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename _Tp>
|
||||
|
|
Loading…
Reference in New Issue