annotate libcxx/include/__bit/byteswap.h @ 252:1f2b6ac9f198 llvm-original

LLVM16-1
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 18 Aug 2023 09:04:13 +0900
parents c4bab56944e8
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
1 // -*- C++ -*-
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
2 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
3 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
5 // See https://llvm.org/LICENSE.txt for license information.
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
7 //
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
8 //===----------------------------------------------------------------------===//
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
9
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
10 #ifndef _LIBCPP___BIT_BYTESWAP_H
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
11 #define _LIBCPP___BIT_BYTESWAP_H
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
12
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
13 #include <__concepts/arithmetic.h>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
14 #include <__config>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
15 #include <cstdint>
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
16
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
17 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
18 # pragma GCC system_header
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
19 #endif
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
20
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
21 _LIBCPP_BEGIN_NAMESPACE_STD
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
22
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
23 #if _LIBCPP_STD_VER >= 23
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
24
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
25 template <integral _Tp>
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
26 _LIBCPP_NODISCARD_EXT _LIBCPP_HIDE_FROM_ABI constexpr _Tp byteswap(_Tp __val) noexcept {
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
27
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
28 if constexpr (sizeof(_Tp) == 1) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
29 return __val;
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
30 } else if constexpr (sizeof(_Tp) == 2) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
31 return __builtin_bswap16(__val);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
32 } else if constexpr (sizeof(_Tp) == 4) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
33 return __builtin_bswap32(__val);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
34 } else if constexpr (sizeof(_Tp) == 8) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
35 return __builtin_bswap64(__val);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
36 #ifndef _LIBCPP_HAS_NO_INT128
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
37 } else if constexpr (sizeof(_Tp) == 16) {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
38 #if __has_builtin(__builtin_bswap128)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
39 return __builtin_bswap128(__val);
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
40 #else
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
41 return static_cast<_Tp>(byteswap(static_cast<uint64_t>(__val))) << 64 |
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
42 static_cast<_Tp>(byteswap(static_cast<uint64_t>(__val >> 64)));
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
43 #endif // __has_builtin(__builtin_bswap128)
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
44 #endif // _LIBCPP_HAS_NO_INT128
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
45 } else {
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
46 static_assert(sizeof(_Tp) == 0, "byteswap is unimplemented for integral types of this size");
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
47 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
48 }
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
49
252
1f2b6ac9f198 LLVM16-1
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 236
diff changeset
50 #endif // _LIBCPP_STD_VER >= 23
236
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
51
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
52 _LIBCPP_END_NAMESPACE_STD
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
53
c4bab56944e8 LLVM 16
kono
parents:
diff changeset
54 #endif // _LIBCPP___BIT_BYTESWAP_H