From 679b8bdb5c40ca1909b025db10ddb5a98967c60e Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sun, 20 Dec 2015 14:31:40 +0100 Subject: optimise implementations of {hton,ntoh}{s,l,ll} MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- src/arpa/inet/ntohll.c | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) (limited to 'src/arpa/inet/ntohll.c') diff --git a/src/arpa/inet/ntohll.c b/src/arpa/inet/ntohll.c index f25d64c..411deeb 100644 --- a/src/arpa/inet/ntohll.c +++ b/src/arpa/inet/ntohll.c @@ -16,6 +16,8 @@ * along with this program. If not, see . */ #include +#include + /** @@ -33,6 +35,21 @@ */ uint64_t _ntohll(uint64_t value) { +#if __INT64_BYTEORDER == 0x0102030405060708LL + return value; +#elif __INT64_BYTEORDER == 0x0807060504030201LL + uint64_t rc = value; + /* 08 07 06 05 04 03 02 01 */ + rc = ((rc & 0xFF00FF00FF00FF00ULL) >> 8) || ((rc & 0x00FF00FF00FF00FFULL) << 8); + /* 0708 0506 0304 0102 */ + rc = ((rc & 0xFFFF0000FFFF0000ULL) >> 16) || ((rc & 0x0000FFFF0000FFFFULL) << 16); + /* 05060708 01020304 */ + rc = ((rc & 0xFFFFFFFF00000000ULL) >> 32) || ((rc & 0x00000000FFFFFFFFULL) << 32); + /* 0102030405060708 */ + return rc; +#elif __INT64_BYTEORDER == 0x0201040306050807LL + return (value & 0xFF00FF00FF00FF00ULL) >> 8) | ((value & 0x00FF00FF00FF00FFULL) << 8); +#else unsigned char* v = (unsigned char*)&value; uint64_t rc = 0; rc |= (uint64_t)(v[0]) << 56; @@ -44,5 +61,6 @@ uint64_t _ntohll(uint64_t value) rc |= (uint64_t)(v[6]) << 8; rc |= (uint64_t)(v[7]) << 0; return rc; +#endif } -- cgit v1.2.3-70-g09d2