improve base85 generated assembly code

This code is arguably pretty hot, if you use binary patches of course.
This patch helps gcc generate both smaller and faster code especially in
the error free path.

Signed-off-by: Nicolas Pitre <nico@cam.org>
Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Nicolas Pitre 2006-05-08 11:31:11 -04:00 committed by Junio C Hamano
parent 42d0ee8302
commit addaacab07

View File

@ -44,14 +44,19 @@ int decode_85(char *dst, char *buffer, int len)
say2("decode 85 <%.*s>", len/4*5, buffer); say2("decode 85 <%.*s>", len/4*5, buffer);
while (len) { while (len) {
unsigned acc = 0; unsigned acc = 0;
int cnt; int de, cnt = 4;
for (cnt = 0; cnt < 5; cnt++, buffer++) { unsigned char ch;
int ch = *((unsigned char *)buffer); do {
int de = de85[ch]; ch = *buffer++;
if (!de) de = de85[ch];
if (--de < 0)
return error("invalid base85 alphabet %c", ch);
acc = acc * 85 + de;
} while (--cnt);
ch = *buffer++;
de = de85[ch];
if (--de < 0)
return error("invalid base85 alphabet %c", ch); return error("invalid base85 alphabet %c", ch);
de--;
if (cnt == 4) {
/* /*
* Detect overflow. The largest * Detect overflow. The largest
* 5-letter possible is "|NsC0" to * 5-letter possible is "|NsC0" to
@ -60,18 +65,17 @@ int decode_85(char *dst, char *buffer, int len)
* 0xffffffff = 0x03030303 * 85). * 0xffffffff = 0x03030303 * 85).
*/ */
if (0x03030303 < acc || if (0x03030303 < acc ||
(0x03030303 == acc && de)) 0xffffffff - de < (acc *= 85))
error("invalid base85 sequence %.5s", error("invalid base85 sequence %.5s", buffer-5);
buffer-3); acc += de;
}
acc = acc * 85 + de;
say1(" <%08x>", acc);
}
say1(" %08x", acc); say1(" %08x", acc);
for (cnt = 0; cnt < 4 && len; cnt++, len--) {
*dst++ = (acc >> 24) & 0xff; cnt = (len < 4) ? len : 4;
acc = acc << 8; len -= cnt;
} do {
acc = (acc << 8) | (acc >> 24);
*dst++ = acc;
} while (--cnt);
} }
say("\n"); say("\n");
@ -86,15 +90,17 @@ void encode_85(char *buf, unsigned char *data, int bytes)
while (bytes) { while (bytes) {
unsigned acc = 0; unsigned acc = 0;
int cnt; int cnt;
for (cnt = 0; cnt < 4 && bytes; cnt++, bytes--) { for (cnt = 24; cnt >= 0; cnt -= 8) {
int ch = *data++; int ch = *data++;
acc |= ch << ((3-cnt)*8); acc |= ch << cnt;
if (--bytes == 0)
break;
} }
say1(" %08x", acc); say1(" %08x", acc);
for (cnt = 0; cnt < 5; cnt++) { for (cnt = 4; cnt >= 0; cnt--) {
int val = acc % 85; int val = acc % 85;
acc /= 85; acc /= 85;
buf[4-cnt] = en85[val]; buf[cnt] = en85[val];
} }
buf += 5; buf += 5;
} }