Skip to content

Commit f466d75

Browse files
committed
Add bswap_128()
This greatly helps for IPv6 endianess convertion
1 parent f1e83d5 commit f466d75

File tree

3 files changed

+58
-39
lines changed

3 files changed

+58
-39
lines changed

libc/intrin/bswap.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,8 @@ uint64_t(bswap_64)(uint64_t x) {
4545
(0x00ff000000000000ull & x) >> 050 |
4646
(0xff00000000000000ull & x) >> 070;
4747
}
48+
49+
uint128_t(bswap_128)(uint128_t x) {
50+
return ((uint128_t)bswap_64((uint64_t)x) << 64) |
51+
(uint128_t)bswap_64((uint64_t)(x >> 64));
52+
}

libc/intrin/bswap.h

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,13 @@ COSMOPOLITAN_C_START_
55
libcesque uint16_t bswap_16(uint16_t) pureconst;
66
libcesque uint32_t bswap_32(uint32_t) pureconst;
77
libcesque uint64_t bswap_64(uint64_t) pureconst;
8+
libcesque uint128_t bswap_128(uint128_t) pureconst;
89

910
#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
10-
#define bswap_16(x) __builtin_bswap16(x)
11-
#define bswap_32(x) __builtin_bswap32(x)
12-
#define bswap_64(x) __builtin_bswap64(x)
11+
#define bswap_16(x) __builtin_bswap16(x)
12+
#define bswap_32(x) __builtin_bswap32(x)
13+
#define bswap_64(x) __builtin_bswap64(x)
14+
#define bswap_128(x) __builtin_bswap128(x)
1315
#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) */
1416

1517
COSMOPOLITAN_C_END_

libc/intrin/newbie.h

Lines changed: 48 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,43 +8,55 @@
88
#define PDP_ENDIAN __ORDER_PDP_ENDIAN__
99

1010
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
11-
#define htobe16(x) bswap_16(x)
12-
#define be16toh(x) bswap_16(x)
13-
#define betoh16(x) bswap_16(x)
14-
#define htobe32(x) bswap_32(x)
15-
#define be32toh(x) bswap_32(x)
16-
#define betoh32(x) bswap_32(x)
17-
#define htobe64(x) bswap_64(x)
18-
#define be64toh(x) bswap_64(x)
19-
#define betoh64(x) bswap_64(x)
20-
#define htole16(x) (uint16_t)(x)
21-
#define le16toh(x) (uint16_t)(x)
22-
#define letoh16(x) (uint16_t)(x)
23-
#define htole32(x) (uint32_t)(x)
24-
#define le32toh(x) (uint32_t)(x)
25-
#define letoh32(x) (uint32_t)(x)
26-
#define htole64(x) (uint64_t)(x)
27-
#define le64toh(x) (uint64_t)(x)
28-
#define letoh64(x) (uint64_t)(x)
11+
#define htobe16(x) bswap_16(x)
12+
#define be16toh(x) bswap_16(x)
13+
#define betoh16(x) bswap_16(x)
14+
#define htobe32(x) bswap_32(x)
15+
#define be32toh(x) bswap_32(x)
16+
#define betoh32(x) bswap_32(x)
17+
#define htobe64(x) bswap_64(x)
18+
#define be64toh(x) bswap_64(x)
19+
#define betoh64(x) bswap_64(x)
20+
#define htobe128(x) bswap_128(x)
21+
#define be128toh(x) bswap_128(x)
22+
#define betoh128(x) bswap_128(x)
23+
#define htole16(x) (uint16_t)(x)
24+
#define le16toh(x) (uint16_t)(x)
25+
#define letoh16(x) (uint16_t)(x)
26+
#define htole32(x) (uint32_t)(x)
27+
#define le32toh(x) (uint32_t)(x)
28+
#define letoh32(x) (uint32_t)(x)
29+
#define htole64(x) (uint64_t)(x)
30+
#define le64toh(x) (uint64_t)(x)
31+
#define letoh64(x) (uint64_t)(x)
32+
#define htole128(x) (uint128_t)(x)
33+
#define le128toh(x) (uint128_t)(x)
34+
#define letoh128(x) (uint128_t)(x)
2935
#else
30-
#define htobe16(x) (uint16_t)(x)
31-
#define be16toh(x) (uint16_t)(x)
32-
#define betoh16(x) (uint16_t)(x)
33-
#define htobe32(x) (uint32_t)(x)
34-
#define be32toh(x) (uint32_t)(x)
35-
#define betoh32(x) (uint32_t)(x)
36-
#define htobe64(x) (uint64_t)(x)
37-
#define be64toh(x) (uint64_t)(x)
38-
#define betoh64(x) (uint64_t)(x)
39-
#define htole16(x) bswap_16(x)
40-
#define le16toh(x) bswap_16(x)
41-
#define letoh16(x) bswap_16(x)
42-
#define htole32(x) bswap_32(x)
43-
#define le32toh(x) bswap_32(x)
44-
#define letoh32(x) bswap_32(x)
45-
#define htole64(x) bswap_64(x)
46-
#define le64toh(x) bswap_64(x)
47-
#define letoh64(x) bswap_64(x)
36+
#define htobe16(x) (uint16_t)(x)
37+
#define be16toh(x) (uint16_t)(x)
38+
#define betoh16(x) (uint16_t)(x)
39+
#define htobe32(x) (uint32_t)(x)
40+
#define be32toh(x) (uint32_t)(x)
41+
#define betoh32(x) (uint32_t)(x)
42+
#define htobe64(x) (uint64_t)(x)
43+
#define be64toh(x) (uint64_t)(x)
44+
#define betoh64(x) (uint64_t)(x)
45+
#define htobe128(x) (uint128_t)(x)
46+
#define be128toh(x) (uint128_t)(x)
47+
#define betoh128(x) (uint128_t)(x)
48+
#define htole16(x) bswap_16(x)
49+
#define le16toh(x) bswap_16(x)
50+
#define letoh16(x) bswap_16(x)
51+
#define htole32(x) bswap_32(x)
52+
#define le32toh(x) bswap_32(x)
53+
#define letoh32(x) bswap_32(x)
54+
#define htole64(x) bswap_64(x)
55+
#define le64toh(x) bswap_64(x)
56+
#define letoh64(x) bswap_64(x)
57+
#define htole128(x) bswap_128(x)
58+
#define le128toh(x) bswap_128(x)
59+
#define letoh128(x) bswap_128(x)
4860
#endif
4961

5062
#endif /* COSMOPOLITAN_LIBC_BITS_NEWBIE_H_ */

0 commit comments

Comments
 (0)