]>
Commit | Line | Data |
---|---|---|
1522c368 | 1 | /* Macros to swap the order of bytes in integer values. |
f7a9f785 | 2 | Copyright (C) 1997-2016 Free Software Foundation, Inc. |
1522c368 UD |
3 | This file is part of the GNU C Library. |
4 | ||
5 | The GNU C Library is free software; you can redistribute it and/or | |
41bdb6e2 AJ |
6 | modify it under the terms of the GNU Lesser General Public |
7 | License as published by the Free Software Foundation; either | |
8 | version 2.1 of the License, or (at your option) any later version. | |
1522c368 UD |
9 | |
10 | The GNU C Library is distributed in the hope that it will be useful, | |
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
41bdb6e2 | 13 | Lesser General Public License for more details. |
1522c368 | 14 | |
41bdb6e2 | 15 | You should have received a copy of the GNU Lesser General Public |
59ba27a6 PE |
16 | License along with the GNU C Library; if not, see |
17 | <http://www.gnu.org/licenses/>. */ | |
1522c368 | 18 | |
2f9a1be8 | 19 | #if !defined _BYTESWAP_H && !defined _NETINET_IN_H && !defined _ENDIAN_H |
f4017d20 UD |
20 | # error "Never use <bits/byteswap.h> directly; include <byteswap.h> instead." |
21 | #endif | |
1522c368 | 22 | |
5c26fecb AJ |
23 | #ifndef _BITS_BYTESWAP_H |
24 | #define _BITS_BYTESWAP_H 1 | |
25 | ||
9904dc47 | 26 | #include <features.h> |
ecd4caf9 | 27 | #include <bits/types.h> |
9904dc47 | 28 | |
1522c368 | 29 | /* Swap bytes in 16 bit value. */ |
a550d3c9 | 30 | #define __bswap_constant_16(x) \ |
2174c6dd | 31 | ((unsigned short int)((((x) >> 8) & 0xffu) | (((x) & 0xffu) << 8))) |
a550d3c9 | 32 | |
f8887d0a L |
33 | /* Get __bswap_16. */ |
34 | #include <bits/byteswap-16.h> | |
1522c368 UD |
35 | |
36 | /* Swap bytes in 32 bit value. */ | |
a550d3c9 UD |
37 | #define __bswap_constant_32(x) \ |
38 | ((((x) & 0xff000000u) >> 24) | (((x) & 0x00ff0000u) >> 8) | \ | |
39 | (((x) & 0x0000ff00u) << 8) | (((x) & 0x000000ffu) << 24)) | |
40 | ||
7ce241a0 | 41 | #ifdef __GNUC__ |
c9d6789e | 42 | # if __GNUC_PREREQ (4, 3) |
9904dc47 L |
43 | static __inline unsigned int |
44 | __bswap_32 (unsigned int __bsx) | |
45 | { | |
46 | return __builtin_bswap32 (__bsx); | |
47 | } | |
48 | # else | |
49 | # define __bswap_32(x) \ | |
477495be | 50 | (__extension__ \ |
2e09a79a | 51 | ({ unsigned int __bsx = (x); __bswap_constant_32 (__bsx); })) |
9904dc47 | 52 | # endif |
7ce241a0 UD |
53 | #else |
54 | static __inline unsigned int | |
5edb9387 | 55 | __bswap_32 (unsigned int __bsx) |
7ce241a0 | 56 | { |
a550d3c9 | 57 | return __bswap_constant_32 (__bsx); |
7ce241a0 UD |
58 | } |
59 | #endif | |
1522c368 | 60 | |
1522c368 | 61 | /* Swap bytes in 64 bit value. */ |
9904dc47 | 62 | #if __GNUC_PREREQ (2, 0) |
bf2c10de | 63 | # define __bswap_constant_64(x) \ |
67371b56 UD |
64 | (__extension__ ((((x) & 0xff00000000000000ull) >> 56) \ |
65 | | (((x) & 0x00ff000000000000ull) >> 40) \ | |
66 | | (((x) & 0x0000ff0000000000ull) >> 24) \ | |
67 | | (((x) & 0x000000ff00000000ull) >> 8) \ | |
68 | | (((x) & 0x00000000ff000000ull) << 8) \ | |
69 | | (((x) & 0x0000000000ff0000ull) << 24) \ | |
70 | | (((x) & 0x000000000000ff00ull) << 40) \ | |
71 | | (((x) & 0x00000000000000ffull) << 56))) | |
3d7f417b | 72 | |
c9d6789e | 73 | # if __GNUC_PREREQ (4, 3) |
ecd4caf9 JM |
74 | static __inline __uint64_t |
75 | __bswap_64 (__uint64_t __bsx) | |
9904dc47 L |
76 | { |
77 | return __builtin_bswap64 (__bsx); | |
78 | } | |
79 | # else | |
80 | # define __bswap_64(x) \ | |
7782d0bf | 81 | (__extension__ \ |
ecd4caf9 | 82 | ({ union { __extension__ __uint64_t __ll; \ |
bf2c10de | 83 | unsigned int __l[2]; } __w, __r; \ |
67371b56 | 84 | if (__builtin_constant_p (x)) \ |
3d7f417b UD |
85 | __r.__ll = __bswap_constant_64 (x); \ |
86 | else \ | |
87 | { \ | |
88 | __w.__ll = (x); \ | |
89 | __r.__l[0] = __bswap_32 (__w.__l[1]); \ | |
90 | __r.__l[1] = __bswap_32 (__w.__l[0]); \ | |
91 | } \ | |
7782d0bf | 92 | __r.__ll; })) |
9904dc47 | 93 | # endif |
6a57d931 | 94 | #else |
b1aa60f3 AJ |
95 | # define __bswap_constant_64(x) \ |
96 | ((((x) & 0xff00000000000000ull) >> 56) \ | |
97 | | (((x) & 0x00ff000000000000ull) >> 40) \ | |
98 | | (((x) & 0x0000ff0000000000ull) >> 24) \ | |
99 | | (((x) & 0x000000ff00000000ull) >> 8) \ | |
100 | | (((x) & 0x00000000ff000000ull) << 8) \ | |
101 | | (((x) & 0x0000000000ff0000ull) << 24) \ | |
102 | | (((x) & 0x000000000000ff00ull) << 40) \ | |
103 | | (((x) & 0x00000000000000ffull) << 56)) | |
104 | ||
ecd4caf9 JM |
105 | static __inline __uint64_t |
106 | __bswap_64 (__uint64_t __bsx) | |
b1aa60f3 AJ |
107 | { |
108 | return __bswap_constant_64 (__bsx); | |
109 | } | |
1522c368 | 110 | #endif |
5c26fecb AJ |
111 | |
112 | #endif /* _BITS_BYTESWAP_H */ |