gzip: speed up send_bits()
Replace one RMW op with store. This speeds up gzip of a png file by ~2%. function old new delta send_bits 62 66 +4 Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
d7500f856d
commit
b7dfbbcdaa
@ -523,7 +523,6 @@ static unsigned file_read(void *buf, unsigned size)
|
||||
static void send_bits(unsigned value, unsigned length)
|
||||
{
|
||||
unsigned new_buf;
|
||||
unsigned remain;
|
||||
|
||||
#ifdef DEBUG
|
||||
Tracev((stderr, " l %2d v %4x ", length, value));
|
||||
@ -534,25 +533,26 @@ static void send_bits(unsigned value, unsigned length)
|
||||
|
||||
new_buf = G1.bi_buf | (value << G1.bi_valid);
|
||||
/* NB: the above may sometimes do "<< 32" shift (undefined)
|
||||
* if check below is changed to "length > remain" instead of >= */
|
||||
remain = BUF_SIZE - G1.bi_valid;
|
||||
* if check below is changed to "length > BUF_SIZE" instead of >= */
|
||||
length += G1.bi_valid;
|
||||
|
||||
/* If bi_buf is full */
|
||||
if (length >= remain) {
|
||||
if (length >= BUF_SIZE) {
|
||||
/* ...use (valid) bits from bi_buf and
|
||||
* (BUF_SIZE - bi_valid) bits from value,
|
||||
* leaving (width - (BUF_SIZE-bi_valid)) unused bits in value.
|
||||
*/
|
||||
value >>= (BUF_SIZE - G1.bi_valid);
|
||||
if (BUF_SIZE == 32) {
|
||||
put_32bit(new_buf); /* maybe unroll to 2*put_16bit()? */
|
||||
} else { /* 16 */
|
||||
put_16bit(new_buf);
|
||||
}
|
||||
new_buf = value >> remain;
|
||||
new_buf = value;
|
||||
length -= BUF_SIZE;
|
||||
}
|
||||
G1.bi_buf = new_buf;
|
||||
G1.bi_valid += length;
|
||||
G1.bi_valid = length;
|
||||
}
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user