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)
|
static void send_bits(unsigned value, unsigned length)
|
||||||
{
|
{
|
||||||
unsigned new_buf;
|
unsigned new_buf;
|
||||||
unsigned remain;
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Tracev((stderr, " l %2d v %4x ", length, value));
|
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);
|
new_buf = G1.bi_buf | (value << G1.bi_valid);
|
||||||
/* NB: the above may sometimes do "<< 32" shift (undefined)
|
/* NB: the above may sometimes do "<< 32" shift (undefined)
|
||||||
* if check below is changed to "length > remain" instead of >= */
|
* if check below is changed to "length > BUF_SIZE" instead of >= */
|
||||||
remain = BUF_SIZE - G1.bi_valid;
|
length += G1.bi_valid;
|
||||||
|
|
||||||
/* If bi_buf is full */
|
/* If bi_buf is full */
|
||||||
if (length >= remain) {
|
if (length >= BUF_SIZE) {
|
||||||
/* ...use (valid) bits from bi_buf and
|
/* ...use (valid) bits from bi_buf and
|
||||||
* (BUF_SIZE - bi_valid) bits from value,
|
* (BUF_SIZE - bi_valid) bits from value,
|
||||||
* leaving (width - (BUF_SIZE-bi_valid)) unused bits in value.
|
* leaving (width - (BUF_SIZE-bi_valid)) unused bits in value.
|
||||||
*/
|
*/
|
||||||
|
value >>= (BUF_SIZE - G1.bi_valid);
|
||||||
if (BUF_SIZE == 32) {
|
if (BUF_SIZE == 32) {
|
||||||
put_32bit(new_buf); /* maybe unroll to 2*put_16bit()? */
|
put_32bit(new_buf); /* maybe unroll to 2*put_16bit()? */
|
||||||
} else { /* 16 */
|
} else { /* 16 */
|
||||||
put_16bit(new_buf);
|
put_16bit(new_buf);
|
||||||
}
|
}
|
||||||
new_buf = value >> remain;
|
new_buf = value;
|
||||||
length -= BUF_SIZE;
|
length -= BUF_SIZE;
|
||||||
}
|
}
|
||||||
G1.bi_buf = new_buf;
|
G1.bi_buf = new_buf;
|
||||||
G1.bi_valid += length;
|
G1.bi_valid = length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user