Ver código fonte

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.
Rich Felker 14 anos atrás
pai
commit
c89862660b
4 arquivos alterados com 12 adições e 20 exclusões
  1. 3 5
      src/network/htonl.c
  2. 3 5
      src/network/htons.c
  3. 3 5
      src/network/ntohl.c
  4. 3 5
      src/network/ntohs.c

+ 3 - 5
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;
 }

+ 3 - 5
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;
 }

+ 3 - 5
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;
 }

+ 3 - 5
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;
 }