diff options
Diffstat (limited to 'archival')
-rw-r--r-- | archival/gzip.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/archival/gzip.c b/archival/gzip.c index 46367f9e6..18d795996 100644 --- a/archival/gzip.c +++ b/archival/gzip.c | |||
@@ -417,19 +417,46 @@ static void flush_outbuf(void) | |||
417 | #define put_8bit(c) \ | 417 | #define put_8bit(c) \ |
418 | do { \ | 418 | do { \ |
419 | G1.outbuf[G1.outcnt++] = (c); \ | 419 | G1.outbuf[G1.outcnt++] = (c); \ |
420 | if (G1.outcnt == OUTBUFSIZ) flush_outbuf(); \ | 420 | if (G1.outcnt == OUTBUFSIZ) \ |
421 | flush_outbuf(); \ | ||
421 | } while (0) | 422 | } while (0) |
422 | 423 | ||
423 | /* Output a 16 bit value, lsb first */ | 424 | /* Output a 16 bit value, lsb first */ |
424 | static void put_16bit(ush w) | 425 | static void put_16bit(ush w) |
425 | { | 426 | { |
426 | if (G1.outcnt < OUTBUFSIZ - 2) { | 427 | /* GCC 4.2.1 won't optimize out redundant loads of G1.outcnt |
427 | G1.outbuf[G1.outcnt++] = w; | 428 | * (probably because of fear of aliasing with G1.outbuf[] |
428 | G1.outbuf[G1.outcnt++] = w >> 8; | 429 | * stores), do it explicitly: |
429 | } else { | 430 | */ |
430 | put_8bit(w); | 431 | unsigned outcnt = G1.outcnt; |
431 | put_8bit(w >> 8); | 432 | uch *dst = &G1.outbuf[outcnt]; |
433 | |||
434 | #if BB_UNALIGNED_MEMACCESS_OK && BB_LITTLE_ENDIAN | ||
435 | if (outcnt < OUTBUFSIZ-2) { | ||
436 | /* Common case */ | ||
437 | ush *dst16 = (void*) dst; | ||
438 | *dst16 = w; /* unalinged LSB 16-bit store */ | ||
439 | G1.outcnt = outcnt + 2; | ||
440 | return; | ||
441 | } | ||
442 | *dst = (uch)w; | ||
443 | w >>= 8; | ||
444 | #else | ||
445 | *dst++ = (uch)w; | ||
446 | w >>= 8; | ||
447 | if (outcnt < OUTBUFSIZ-2) { | ||
448 | /* Common case */ | ||
449 | *dst = w; | ||
450 | G1.outcnt = outcnt + 2; | ||
451 | return; | ||
432 | } | 452 | } |
453 | #endif | ||
454 | |||
455 | /* Slowpath: we will need to do flush_outbuf() */ | ||
456 | G1.outcnt++; | ||
457 | if (G1.outcnt == OUTBUFSIZ) | ||
458 | flush_outbuf(); | ||
459 | put_8bit(w); | ||
433 | } | 460 | } |
434 | 461 | ||
435 | static void put_32bit(ulg n) | 462 | static void put_32bit(ulg n) |