diff options
author | Denys Vlasenko <dvlasenk@redhat.com> | 2010-10-18 11:40:26 +0200 |
---|---|---|
committer | Denys Vlasenko <dvlasenk@redhat.com> | 2010-10-18 11:40:26 +0200 |
commit | 9ff50b869780aba131dc9b542ccd0f1a3959e920 (patch) | |
tree | a1f65f2a5f8c3aa1d6f51bc15c734f2b3ae46ead | |
parent | b102e12253078e8c0ebdeeb5e1893ea6a025a700 (diff) | |
download | busybox-w32-9ff50b869780aba131dc9b542ccd0f1a3959e920.tar.gz busybox-w32-9ff50b869780aba131dc9b542ccd0f1a3959e920.tar.bz2 busybox-w32-9ff50b869780aba131dc9b542ccd0f1a3959e920.zip |
*: deinline SWAP_xE64 on 32-bit CPUs. Wins !90 bytes both on 32 and 64 bits
Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com>
-rw-r--r-- | include/libbb.h | 7 | ||||
-rw-r--r-- | include/platform.h | 9 | ||||
-rw-r--r-- | libbb/Kbuild.src | 1 | ||||
-rw-r--r-- | libbb/bb_bswap_64.c | 16 | ||||
-rw-r--r-- | libbb/hash_sha.c | 20 | ||||
-rw-r--r-- | networking/udhcp/dumpleases.c | 13 | ||||
-rw-r--r-- | networking/udhcp/files.c | 14 |
7 files changed, 37 insertions, 43 deletions
diff --git a/include/libbb.h b/include/libbb.h index b16157d46..c161ed7e2 100644 --- a/include/libbb.h +++ b/include/libbb.h | |||
@@ -37,8 +37,6 @@ | |||
37 | #include <termios.h> | 37 | #include <termios.h> |
38 | #include <time.h> | 38 | #include <time.h> |
39 | #include <unistd.h> | 39 | #include <unistd.h> |
40 | /* Try to pull in PATH_MAX */ | ||
41 | #include <limits.h> | ||
42 | #include <sys/param.h> | 40 | #include <sys/param.h> |
43 | #ifdef HAVE_MNTENT_H | 41 | #ifdef HAVE_MNTENT_H |
44 | # include <mntent.h> | 42 | # include <mntent.h> |
@@ -254,6 +252,11 @@ extern int *const bb_errno; | |||
254 | #define errno (*bb_errno) | 252 | #define errno (*bb_errno) |
255 | #endif | 253 | #endif |
256 | 254 | ||
255 | #if !(ULONG_MAX > 0xffffffff) | ||
256 | /* Only 32-bit CPUs need this, 64-bit ones use inlined version */ | ||
257 | uint64_t bb_bswap_64(uint64_t x) FAST_FUNC; | ||
258 | #endif | ||
259 | |||
257 | unsigned long long monotonic_ns(void) FAST_FUNC; | 260 | unsigned long long monotonic_ns(void) FAST_FUNC; |
258 | unsigned long long monotonic_us(void) FAST_FUNC; | 261 | unsigned long long monotonic_us(void) FAST_FUNC; |
259 | unsigned long long monotonic_ms(void) FAST_FUNC; | 262 | unsigned long long monotonic_ms(void) FAST_FUNC; |
diff --git a/include/platform.h b/include/platform.h index c255a17ce..b5c668517 100644 --- a/include/platform.h +++ b/include/platform.h | |||
@@ -150,6 +150,7 @@ | |||
150 | 150 | ||
151 | /* ---- Endian Detection ------------------------------------ */ | 151 | /* ---- Endian Detection ------------------------------------ */ |
152 | 152 | ||
153 | #include <limits.h> | ||
153 | #if defined(__digital__) && defined(__unix__) | 154 | #if defined(__digital__) && defined(__unix__) |
154 | # include <sex.h> | 155 | # include <sex.h> |
155 | #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ | 156 | #elif defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__NetBSD__) \ |
@@ -189,6 +190,10 @@ | |||
189 | # error "Can't determine endianness" | 190 | # error "Can't determine endianness" |
190 | #endif | 191 | #endif |
191 | 192 | ||
193 | #if ULONG_MAX > 0xffffffff | ||
194 | # define bb_bswap_64(x) bswap_64(x) | ||
195 | #endif | ||
196 | |||
192 | /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */ | 197 | /* SWAP_LEnn means "convert CPU<->little_endian by swapping bytes" */ |
193 | #if BB_BIG_ENDIAN | 198 | #if BB_BIG_ENDIAN |
194 | # define SWAP_BE16(x) (x) | 199 | # define SWAP_BE16(x) (x) |
@@ -196,13 +201,13 @@ | |||
196 | # define SWAP_BE64(x) (x) | 201 | # define SWAP_BE64(x) (x) |
197 | # define SWAP_LE16(x) bswap_16(x) | 202 | # define SWAP_LE16(x) bswap_16(x) |
198 | # define SWAP_LE32(x) bswap_32(x) | 203 | # define SWAP_LE32(x) bswap_32(x) |
199 | # define SWAP_LE64(x) bswap_64(x) | 204 | # define SWAP_LE64(x) bb_bswap_64(x) |
200 | # define IF_BIG_ENDIAN(...) __VA_ARGS__ | 205 | # define IF_BIG_ENDIAN(...) __VA_ARGS__ |
201 | # define IF_LITTLE_ENDIAN(...) | 206 | # define IF_LITTLE_ENDIAN(...) |
202 | #else | 207 | #else |
203 | # define SWAP_BE16(x) bswap_16(x) | 208 | # define SWAP_BE16(x) bswap_16(x) |
204 | # define SWAP_BE32(x) bswap_32(x) | 209 | # define SWAP_BE32(x) bswap_32(x) |
205 | # define SWAP_BE64(x) bswap_64(x) | 210 | # define SWAP_BE64(x) bb_bswap_64(x) |
206 | # define SWAP_LE16(x) (x) | 211 | # define SWAP_LE16(x) (x) |
207 | # define SWAP_LE32(x) (x) | 212 | # define SWAP_LE32(x) (x) |
208 | # define SWAP_LE64(x) (x) | 213 | # define SWAP_LE64(x) (x) |
diff --git a/libbb/Kbuild.src b/libbb/Kbuild.src index 0fd730247..0955d73e1 100644 --- a/libbb/Kbuild.src +++ b/libbb/Kbuild.src | |||
@@ -14,6 +14,7 @@ lib-y += appletlib.o | |||
14 | lib-y += ask_confirmation.o | 14 | lib-y += ask_confirmation.o |
15 | lib-y += bb_askpass.o | 15 | lib-y += bb_askpass.o |
16 | lib-y += bb_basename.o | 16 | lib-y += bb_basename.o |
17 | lib-y += bb_bswap_64.o | ||
17 | lib-y += bb_do_delay.o | 18 | lib-y += bb_do_delay.o |
18 | lib-y += bb_pwd.o | 19 | lib-y += bb_pwd.o |
19 | lib-y += bb_qsort.o | 20 | lib-y += bb_qsort.o |
diff --git a/libbb/bb_bswap_64.c b/libbb/bb_bswap_64.c new file mode 100644 index 000000000..ce9d53b7f --- /dev/null +++ b/libbb/bb_bswap_64.c | |||
@@ -0,0 +1,16 @@ | |||
1 | /* | ||
2 | * Utility routines. | ||
3 | * | ||
4 | * Copyright (C) 2010 Denys Vlasenko | ||
5 | * | ||
6 | * Licensed under GPLv2, see file LICENSE in this source tree. | ||
7 | */ | ||
8 | |||
9 | #include "libbb.h" | ||
10 | |||
11 | #if !(ULONG_MAX > 0xffffffff) | ||
12 | uint64_t FAST_FUNC bb_bswap_64(uint64_t x) | ||
13 | { | ||
14 | return bswap_64(x); | ||
15 | } | ||
16 | #endif | ||
diff --git a/libbb/hash_sha.c b/libbb/hash_sha.c index e7199d317..72d50928b 100644 --- a/libbb/hash_sha.c +++ b/libbb/hash_sha.c | |||
@@ -51,16 +51,6 @@ static ALWAYS_INLINE uint64_t rotr64(uint64_t x, unsigned n) | |||
51 | { | 51 | { |
52 | return (x >> n) | (x << (64 - n)); | 52 | return (x >> n) | (x << (64 - n)); |
53 | } | 53 | } |
54 | #if BB_LITTLE_ENDIAN | ||
55 | /* ALWAYS_INLINE below sometimes hurts code size, using plain inline: */ | ||
56 | static inline uint64_t hton64(uint64_t v) | ||
57 | { | ||
58 | return SWAP_BE64(v); | ||
59 | } | ||
60 | #else | ||
61 | #define hton64(v) (v) | ||
62 | #endif | ||
63 | #define ntoh64(v) hton64(v) | ||
64 | 54 | ||
65 | 55 | ||
66 | /* Some arch headers have conflicting defines */ | 56 | /* Some arch headers have conflicting defines */ |
@@ -274,7 +264,7 @@ static void FAST_FUNC sha512_process_block128(sha512_ctx_t *ctx) | |||
274 | 264 | ||
275 | /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ | 265 | /* Compute the message schedule according to FIPS 180-2:6.3.2 step 2. */ |
276 | for (t = 0; t < 16; ++t) | 266 | for (t = 0; t < 16; ++t) |
277 | W[t] = ntoh64(words[t]); | 267 | W[t] = SWAP_BE64(words[t]); |
278 | for (/*t = 16*/; t < 80; ++t) | 268 | for (/*t = 16*/; t < 80; ++t) |
279 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; | 269 | W[t] = R1(W[t - 2]) + W[t - 7] + R0(W[t - 15]) + W[t - 16]; |
280 | 270 | ||
@@ -475,7 +465,7 @@ void FAST_FUNC sha1_end(sha1_ctx_t *ctx, void *resbuf) | |||
475 | if (remaining >= 8) { | 465 | if (remaining >= 8) { |
476 | /* Store the 64-bit counter of bits in the buffer in BE format */ | 466 | /* Store the 64-bit counter of bits in the buffer in BE format */ |
477 | uint64_t t = ctx->total64 << 3; | 467 | uint64_t t = ctx->total64 << 3; |
478 | t = hton64(t); | 468 | t = SWAP_BE64(t); |
479 | /* wbuffer is suitably aligned for this */ | 469 | /* wbuffer is suitably aligned for this */ |
480 | *(uint64_t *) (&ctx->wbuffer[64 - 8]) = t; | 470 | *(uint64_t *) (&ctx->wbuffer[64 - 8]) = t; |
481 | } | 471 | } |
@@ -509,10 +499,10 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf) | |||
509 | /* Store the 128-bit counter of bits in the buffer in BE format */ | 499 | /* Store the 128-bit counter of bits in the buffer in BE format */ |
510 | uint64_t t; | 500 | uint64_t t; |
511 | t = ctx->total64[0] << 3; | 501 | t = ctx->total64[0] << 3; |
512 | t = hton64(t); | 502 | t = SWAP_BE64(t); |
513 | *(uint64_t *) (&ctx->wbuffer[128 - 8]) = t; | 503 | *(uint64_t *) (&ctx->wbuffer[128 - 8]) = t; |
514 | t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61); | 504 | t = (ctx->total64[1] << 3) | (ctx->total64[0] >> 61); |
515 | t = hton64(t); | 505 | t = SWAP_BE64(t); |
516 | *(uint64_t *) (&ctx->wbuffer[128 - 16]) = t; | 506 | *(uint64_t *) (&ctx->wbuffer[128 - 16]) = t; |
517 | } | 507 | } |
518 | sha512_process_block128(ctx); | 508 | sha512_process_block128(ctx); |
@@ -524,7 +514,7 @@ void FAST_FUNC sha512_end(sha512_ctx_t *ctx, void *resbuf) | |||
524 | if (BB_LITTLE_ENDIAN) { | 514 | if (BB_LITTLE_ENDIAN) { |
525 | unsigned i; | 515 | unsigned i; |
526 | for (i = 0; i < ARRAY_SIZE(ctx->hash); ++i) | 516 | for (i = 0; i < ARRAY_SIZE(ctx->hash); ++i) |
527 | ctx->hash[i] = hton64(ctx->hash[i]); | 517 | ctx->hash[i] = SWAP_BE64(ctx->hash[i]); |
528 | } | 518 | } |
529 | memcpy(resbuf, ctx->hash, sizeof(ctx->hash)); | 519 | memcpy(resbuf, ctx->hash, sizeof(ctx->hash)); |
530 | } | 520 | } |
diff --git a/networking/udhcp/dumpleases.c b/networking/udhcp/dumpleases.c index 341815a69..46610fc63 100644 --- a/networking/udhcp/dumpleases.c +++ b/networking/udhcp/dumpleases.c | |||
@@ -6,17 +6,6 @@ | |||
6 | #include "dhcpd.h" | 6 | #include "dhcpd.h" |
7 | #include "unicode.h" | 7 | #include "unicode.h" |
8 | 8 | ||
9 | #if BB_LITTLE_ENDIAN | ||
10 | static inline uint64_t hton64(uint64_t v) | ||
11 | { | ||
12 | return SWAP_BE64(v); | ||
13 | } | ||
14 | #else | ||
15 | #define hton64(v) (v) | ||
16 | #endif | ||
17 | #define ntoh64(v) hton64(v) | ||
18 | |||
19 | |||
20 | int dumpleases_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | 9 | int dumpleases_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; |
21 | int dumpleases_main(int argc UNUSED_PARAM, char **argv) | 10 | int dumpleases_main(int argc UNUSED_PARAM, char **argv) |
22 | { | 11 | { |
@@ -54,7 +43,7 @@ int dumpleases_main(int argc UNUSED_PARAM, char **argv) | |||
54 | /* "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 */ | 43 | /* "123456789 123456789 123456789 123456789 123456789 123456789 123456789 123456789 */ |
55 | 44 | ||
56 | xread(fd, &written_at, sizeof(written_at)); | 45 | xread(fd, &written_at, sizeof(written_at)); |
57 | written_at = ntoh64(written_at); | 46 | written_at = SWAP_BE64(written_at); |
58 | curr = time(NULL); | 47 | curr = time(NULL); |
59 | if (curr < written_at) | 48 | if (curr < written_at) |
60 | written_at = curr; /* lease file from future! :) */ | 49 | written_at = curr; /* lease file from future! :) */ |
diff --git a/networking/udhcp/files.c b/networking/udhcp/files.c index 68b2085a9..49bcafb9c 100644 --- a/networking/udhcp/files.c +++ b/networking/udhcp/files.c | |||
@@ -11,16 +11,6 @@ | |||
11 | #include "common.h" | 11 | #include "common.h" |
12 | #include "dhcpd.h" | 12 | #include "dhcpd.h" |
13 | 13 | ||
14 | #if BB_LITTLE_ENDIAN | ||
15 | static inline uint64_t hton64(uint64_t v) | ||
16 | { | ||
17 | return SWAP_BE64(v); | ||
18 | } | ||
19 | #else | ||
20 | #define hton64(v) (v) | ||
21 | #endif | ||
22 | #define ntoh64(v) hton64(v) | ||
23 | |||
24 | /* on these functions, make sure your datatype matches */ | 14 | /* on these functions, make sure your datatype matches */ |
25 | static int FAST_FUNC read_str(const char *line, void *arg) | 15 | static int FAST_FUNC read_str(const char *line, void *arg) |
26 | { | 16 | { |
@@ -140,7 +130,7 @@ void FAST_FUNC write_leases(void) | |||
140 | 130 | ||
141 | curr = written_at = time(NULL); | 131 | curr = written_at = time(NULL); |
142 | 132 | ||
143 | written_at = hton64(written_at); | 133 | written_at = SWAP_BE64(written_at); |
144 | full_write(fd, &written_at, sizeof(written_at)); | 134 | full_write(fd, &written_at, sizeof(written_at)); |
145 | 135 | ||
146 | for (i = 0; i < server_config.max_leases; i++) { | 136 | for (i = 0; i < server_config.max_leases; i++) { |
@@ -190,7 +180,7 @@ void FAST_FUNC read_leases(const char *file) | |||
190 | 180 | ||
191 | if (full_read(fd, &written_at, sizeof(written_at)) != sizeof(written_at)) | 181 | if (full_read(fd, &written_at, sizeof(written_at)) != sizeof(written_at)) |
192 | goto ret; | 182 | goto ret; |
193 | written_at = ntoh64(written_at); | 183 | written_at = SWAP_BE64(written_at); |
194 | 184 | ||
195 | time_passed = time(NULL) - written_at; | 185 | time_passed = time(NULL) - written_at; |
196 | /* Strange written_at, or lease file from old version of udhcpd | 186 | /* Strange written_at, or lease file from old version of udhcpd |