data-streamer.h (streamer_write_char_stream): CSE obs->current_pointer.

2013-06-12  Richard Biener  <rguenther@suse.de>

	* data-streamer.h (streamer_write_char_stream): CSE
	obs->current_pointer.
	* data-streamer-out.c (streamer_write_uhwi_stream): Inline
	streamer_write_char_stream manually and optimize the resulting loop.
	(streamer_write_hwi_stream): Likewise.

From-SVN: r199992
This commit is contained in:
Richard Biener 2013-06-12 11:09:50 +00:00 committed by Richard Biener
parent bbf9ad070d
commit a4fa02d1b7
3 changed files with 88 additions and 14 deletions

View File

@ -1,3 +1,11 @@
2013-06-12 Richard Biener <rguenther@suse.de>
* data-streamer.h (streamer_write_char_stream): CSE
obs->current_pointer.
* data-streamer-out.c (streamer_write_uhwi_stream): Inline
streamer_write_char_stream manually and optimize the resulting loop.
(streamer_write_hwi_stream): Likewise.
2013-06-12 Jan Hubicka <jh@suse.cz>
* lto-symtab.c (lto_symtab_merge_symbols): Populate symtab hashtable.

View File

@ -187,6 +187,11 @@ void
streamer_write_uhwi_stream (struct lto_output_stream *obs,
unsigned HOST_WIDE_INT work)
{
if (obs->left_in_block == 0)
lto_append_block (obs);
char *current_pointer = obs->current_pointer;
unsigned int left_in_block = obs->left_in_block;
unsigned int size = 0;
do
{
unsigned int byte = (work & 0x7f);
@ -195,9 +200,34 @@ streamer_write_uhwi_stream (struct lto_output_stream *obs,
/* More bytes to follow. */
byte |= 0x80;
streamer_write_char_stream (obs, byte);
*(current_pointer++) = byte;
left_in_block--;
size++;
}
while (work != 0);
while (work != 0 && left_in_block > 0);
if (work != 0)
{
obs->left_in_block = 0;
lto_append_block (obs);
current_pointer = obs->current_pointer;
left_in_block = obs->left_in_block;
do
{
unsigned int byte = (work & 0x7f);
work >>= 7;
if (work != 0)
/* More bytes to follow. */
byte |= 0x80;
*(current_pointer++) = byte;
left_in_block--;
size++;
}
while (work != 0);
}
obs->current_pointer = current_pointer;
obs->left_in_block = left_in_block;
obs->total_size += size;
}
@ -206,21 +236,56 @@ streamer_write_uhwi_stream (struct lto_output_stream *obs,
void
streamer_write_hwi_stream (struct lto_output_stream *obs, HOST_WIDE_INT work)
{
int more, byte;
if (obs->left_in_block == 0)
lto_append_block (obs);
char *current_pointer = obs->current_pointer;
unsigned int left_in_block = obs->left_in_block;
unsigned int size = 0;
bool more;
do
{
byte = (work & 0x7f);
/* arithmetic shift */
work >>= 7;
more = !((work == 0 && (byte & 0x40) == 0)
|| (work == -1 && (byte & 0x40) != 0));
unsigned int byte = (work & 0x7f);
/* If the lower 7-bits are sign-extended 0 or -1 we are finished. */
work >>= 6;
more = !(work == 0 || work == -1);
if (more)
byte |= 0x80;
{
/* More bits to follow. */
work >>= 1;
byte |= 0x80;
}
streamer_write_char_stream (obs, byte);
*(current_pointer++) = byte;
left_in_block--;
size++;
}
while (more);
while (more && left_in_block > 0);
if (more)
{
obs->left_in_block = 0;
lto_append_block (obs);
current_pointer = obs->current_pointer;
left_in_block = obs->left_in_block;
do
{
unsigned int byte = (work & 0x7f);
work >>= 6;
more = !(work == 0 || work == -1);
if (more)
{
work >>= 1;
byte |= 0x80;
}
*(current_pointer++) = byte;
left_in_block--;
size++;
}
while (more);
}
obs->current_pointer = current_pointer;
obs->left_in_block = left_in_block;
obs->total_size += size;
}
/* Write a GCOV counter value WORK to OBS. */

View File

@ -183,8 +183,9 @@ streamer_write_char_stream (struct lto_output_stream *obs, char c)
lto_append_block (obs);
/* Write the actual character. */
*obs->current_pointer = c;
obs->current_pointer++;
char *current_pointer = obs->current_pointer;
*(current_pointer++) = c;
obs->current_pointer = current_pointer;
obs->total_size++;
obs->left_in_block--;
}