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 /libbb | |
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>
Diffstat (limited to 'libbb')
-rw-r--r-- | libbb/Kbuild.src | 1 | ||||
-rw-r--r-- | libbb/bb_bswap_64.c | 16 | ||||
-rw-r--r-- | libbb/hash_sha.c | 20 |
3 files changed, 22 insertions, 15 deletions
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 | } |