summaryrefslogtreecommitdiff
path: root/gcc/data-streamer-out.c
diff options
context:
space:
mode:
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-06-12 11:09:50 +0000
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>2013-06-12 11:09:50 +0000
commit2f5bed2ab25158051293c85678c5413213b48cfc (patch)
tree5d0ac2b598eae02f929f24f72597e3783e98c0ff /gcc/data-streamer-out.c
parent9e9c3e92e9fbf4254b4ae185aeb345e2e08629e5 (diff)
downloadgcc-2f5bed2ab25158051293c85678c5413213b48cfc.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@199992 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/data-streamer-out.c')
-rw-r--r--gcc/data-streamer-out.c91
1 files changed, 78 insertions, 13 deletions
diff --git a/gcc/data-streamer-out.c b/gcc/data-streamer-out.c
index 4165b8747fc..247ff636e49 100644
--- a/gcc/data-streamer-out.c
+++ b/gcc/data-streamer-out.c
@@ -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;
-
- streamer_write_char_stream (obs, byte);
+ {
+ /* More bits to follow. */
+ work >>= 1;
+ byte |= 0x80;
+ }
+
+ *(current_pointer++) = byte;
+ left_in_block--;
+ size++;
+ }
+ 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);
}
- 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. */