bc: simple speedups

function                                             old     new   delta
bc_parse_pushName                                     20      56     +36
bc_program_index                                      47      71     +24
bc_parse_pushIndex                                    52      58      +6
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 3/0 up/down: 66/0)               Total: 66 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-12-26 20:30:47 +01:00
parent f706a18f33
commit ab9a98602f

View File

@ -3439,17 +3439,38 @@ static void bc_parse_push(char i)
static void bc_parse_pushName(char *name)
{
#if 1
BcVec *code = &G.prs.func->code;
size_t pos = code->len;
size_t len = strlen(name) + 1;
bc_vec_expand(code, pos + len);
strcpy(code->v + pos, name);
code->len = pos + len;
#else
// Smaller code, but way slow:
do {
bc_parse_push(*name);
} while (*name++);
#endif
}
// Indexes < 0xfc are encoded verbatim, else first byte is
// 0xfc, 0xfd, 0xfe or 0xff, encoding "1..4 bytes",
// followed by that many bytes, lsb first.
// (The above describes 32-bit case).
#define SMALL_INDEX_LIMIT (0x100 - sizeof(size_t))
static void bc_parse_pushIndex(size_t idx)
{
size_t mask;
unsigned amt;
dbg_lex("%s:%d pushing index %zd", __func__, __LINE__, idx);
if (idx < SMALL_INDEX_LIMIT) {
goto push_idx;
}
mask = ((size_t)0xff) << (sizeof(idx) * 8 - 8);
amt = sizeof(idx);
do {
@ -3458,9 +3479,10 @@ static void bc_parse_pushIndex(size_t idx)
amt--;
} while (amt != 0);
bc_parse_push(amt);
bc_parse_push(SMALL_INDEX_LIMIT + amt);
while (idx != 0) {
push_idx:
bc_parse_push((unsigned char)idx);
idx >>= 8;
}
@ -5257,6 +5279,11 @@ static size_t bc_program_index(char *code, size_t *bgn)
size_t res;
amt = *bytes++;
if (amt < SMALL_INDEX_LIMIT) {
*bgn += 1;
return amt;
}
amt -= SMALL_INDEX_LIMIT;
*bgn += amt + 1;
amt *= 8;