diff options
author | Rich Felker <dalias@aerifal.cx> | 2011-04-12 13:13:27 -0400 |
---|---|---|
committer | Rich Felker <dalias@aerifal.cx> | 2011-04-12 13:13:27 -0400 |
commit | c89862660bd3845ace7977480db3a43dc80475f4 (patch) | |
tree | 4b3c890588e359f7e7674898acecbe1aacd95336 | |
parent | c546be175c169399420fff4706cd1d4fcefd7d31 (diff) | |
download | musl-c89862660bd3845ace7977480db3a43dc80475f4.tar.gz musl-c89862660bd3845ace7977480db3a43dc80475f4.tar.bz2 musl-c89862660bd3845ace7977480db3a43dc80475f4.tar.xz musl-c89862660bd3845ace7977480db3a43dc80475f4.zip |
optimize ntohl etc. in terms of bswap functions
we can do this without violating the namespace now that they are
macros/inline functions rather than extern functions. the motivation
is that gcc was generating giant, slow, horrible code for the old
functions, and now generates a single byte-swapping instruction.
-rw-r--r-- | src/network/htonl.c | 8 | ||||
-rw-r--r-- | src/network/htons.c | 8 | ||||
-rw-r--r-- | src/network/ntohl.c | 8 | ||||
-rw-r--r-- | src/network/ntohs.c | 8 |
4 files changed, 12 insertions, 20 deletions
diff --git a/src/network/htonl.c b/src/network/htonl.c index b21dace0..6622d16c 100644 --- a/src/network/htonl.c +++ b/src/network/htonl.c @@ -1,10 +1,8 @@ #include <netinet/in.h> +#include <byteswap.h> uint32_t htonl(uint32_t n) { - union { - uint8_t b[4]; - uint32_t i; - } u = { { n>>24, n>>16, n>>8, n } }; - return u.i; + union { int i; char c; } u = { 1 }; + return u.c ? bswap_32(n) : n; } diff --git a/src/network/htons.c b/src/network/htons.c index 522504a5..03a3a1d5 100644 --- a/src/network/htons.c +++ b/src/network/htons.c @@ -1,10 +1,8 @@ #include <netinet/in.h> +#include <byteswap.h> uint16_t htons(uint16_t n) { - union { - uint8_t b[2]; - uint16_t s; - } u = { { n>>8, n } }; - return u.s; + union { int i; char c; } u = { 1 }; + return u.c ? bswap_16(n) : n; } diff --git a/src/network/ntohl.c b/src/network/ntohl.c index 64379196..d6fce459 100644 --- a/src/network/ntohl.c +++ b/src/network/ntohl.c @@ -1,10 +1,8 @@ #include <netinet/in.h> +#include <byteswap.h> uint32_t ntohl(uint32_t n) { - union { - uint32_t i; - uint8_t b[4]; - } u = { n }; - return (u.b[0]<<24) | (u.b[1]<<16) | (u.b[2]<<8) | u.b[3]; + union { int i; char c; } u = { 1 }; + return u.c ? bswap_32(n) : n; } diff --git a/src/network/ntohs.c b/src/network/ntohs.c index 3544a479..745cef42 100644 --- a/src/network/ntohs.c +++ b/src/network/ntohs.c @@ -1,10 +1,8 @@ #include <netinet/in.h> +#include <byteswap.h> uint16_t ntohs(uint16_t n) { - union { - uint16_t s; - uint8_t b[2]; - } u = { n }; - return (u.b[0]<<8) | u.b[1]; + union { int i; char c; } u = { 1 }; + return u.c ? bswap_16(n) : n; } |