Commit a978e26b by Ian Lance Taylor Committed by Ian Lance Taylor

elf.c (elf_zlib_fetch): Change pval argument to uint64_t *.

	* elf.c (elf_zlib_fetch): Change pval argument to uint64_t *.
	Read a four byte integer.
	(elf_zlib_inflate): Change val to uint64_t.  Align pin to a 32-bit
	boundary before ever calling elf_zlib_fetch.
	* ztest.c (test_large): Simplify print statements a bit.

From-SVN: r253456
parent 8e473f4f
2017-10-05 Ian Lance Taylor <iant@golang.org>
* elf.c (elf_zlib_fetch): Change pval argument to uint64_t *.
Read a four byte integer.
(elf_zlib_inflate): Change val to uint64_t. Align pin to a 32-bit
boundary before ever calling elf_zlib_fetch.
* ztest.c (test_large): Simplify print statements a bit.
2017-10-02 Ian Lance Taylor <iant@golang.org> 2017-10-02 Ian Lance Taylor <iant@golang.org>
* ztest.c: #include <errno.h>. * ztest.c: #include <errno.h>.
......
...@@ -1031,11 +1031,12 @@ elf_zlib_failed(void) ...@@ -1031,11 +1031,12 @@ elf_zlib_failed(void)
static int static int
elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend, elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend,
uint32_t *pval, unsigned int *pbits) uint64_t *pval, unsigned int *pbits)
{ {
unsigned int bits; unsigned int bits;
const unsigned char *pin; const unsigned char *pin;
uint32_t val; uint64_t val;
uint32_t next;
bits = *pbits; bits = *pbits;
if (bits >= 15) if (bits >= 15)
...@@ -1043,20 +1044,25 @@ elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend, ...@@ -1043,20 +1044,25 @@ elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend,
pin = *ppin; pin = *ppin;
val = *pval; val = *pval;
if (unlikely (pinend - pin < 2)) if (unlikely (pinend - pin < 4))
{ {
elf_zlib_failed (); elf_zlib_failed ();
return 0; return 0;
} }
val |= pin[0] << bits;
val |= pin[1] << (bits + 8);
bits += 16;
pin += 2;
/* We will need the next two bytes soon. We ask for high temporal /* We've ensured that PIN is aligned. */
locality because we will need the whole cache line soon. */ next = *(const uint32_t *)pin;
__builtin_prefetch (pin, 0, 3);
__builtin_prefetch (pin + 1, 0, 3); #if __BYTE_ORDER == __ORDER_BIG_ENDIAN
next = __builtin_bswap32 (next);
#endif
val |= (uint64_t)next << bits;
bits += 32;
pin += 4;
/* We will need the next four bytes soon. */
__builtin_prefetch (pin, 0, 0);
*ppin = pin; *ppin = pin;
*pval = val; *pval = val;
...@@ -1566,7 +1572,7 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table, ...@@ -1566,7 +1572,7 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table,
poutend = pout + sout; poutend = pout + sout;
while ((pinend - pin) > 4) while ((pinend - pin) > 4)
{ {
uint32_t val; uint64_t val;
unsigned int bits; unsigned int bits;
int last; int last;
...@@ -1601,10 +1607,19 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table, ...@@ -1601,10 +1607,19 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table,
} }
pin += 2; pin += 2;
/* Read blocks until one is marked last. */ /* Align PIN to a 32-bit boundary. */
val = 0; val = 0;
bits = 0; bits = 0;
while ((((uintptr_t) pin) & 3) != 0)
{
val |= (uint64_t)*pin << bits;
bits += 8;
++pin;
}
/* Read blocks until one is marked last. */
last = 0; last = 0;
while (!last) while (!last)
...@@ -1671,6 +1686,14 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table, ...@@ -1671,6 +1686,14 @@ elf_zlib_inflate (const unsigned char *pin, size_t sin, uint16_t *zdebug_table,
pout += len; pout += len;
pin += len; pin += len;
/* Align PIN. */
while ((((uintptr_t) pin) & 3) != 0)
{
val |= (uint64_t)*pin << bits;
bits += 8;
++pin;
}
/* Go around to read the next block. */ /* Go around to read the next block. */
continue; continue;
} }
......
...@@ -432,9 +432,9 @@ test_large (struct backtrace_state *state) ...@@ -432,9 +432,9 @@ test_large (struct backtrace_state *state)
ctime = average_time (ctimes, trials); ctime = average_time (ctimes, trials);
ztime = average_time (ztimes, trials); ztime = average_time (ztimes, trials);
printf ("backtrace time: %zu ns\n", ctime); printf ("backtrace: %zu ns\n", ctime);
printf ("zlib time: : %zu ns\n", ztime); printf ("zlib : %zu ns\n", ztime);
printf ("percentage : %g\n", (double) ztime / (double) ctime); printf ("ratio : %g\n", (double) ztime / (double) ctime);
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment