summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRich Felker <dalias@aerifal.cx>2011-04-12 13:13:27 -0400
committerRich Felker <dalias@aerifal.cx>2011-04-12 13:13:27 -0400
commitc89862660bd3845ace7977480db3a43dc80475f4 (patch)
tree4b3c890588e359f7e7674898acecbe1aacd95336
parentc546be175c169399420fff4706cd1d4fcefd7d31 (diff)
downloadmusl-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.c8
-rw-r--r--src/network/htons.c8
-rw-r--r--src/network/ntohl.c8
-rw-r--r--src/network/ntohs.c8
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;
}