diff options
author | Denys Vlasenko | 2018-12-11 19:29:35 +0100 |
---|---|---|
committer | Denys Vlasenko | 2018-12-11 19:33:09 +0100 |
commit | 09d8df84ee908b940a31822c3480f36f817e4f09 (patch) | |
tree | 0d0f74ee0ad31cea2f31090161ac22b457650f00 /miscutils | |
parent | 7f4daa4f5842b26c5f3e233819e583573eeebaf6 (diff) | |
download | busybox-09d8df84ee908b940a31822c3480f36f817e4f09.zip busybox-09d8df84ee908b940a31822c3480f36f817e4f09.tar.gz |
bc: do not use "(cond ? f1 : f2)(params)" idiom, it messes up static function optimizations
With direct calls, GCC no longer thinks that we take addresses of the functions,
and can use "more optimal" internal ABI for _all_ calls to these functions,
not only at this callsite. On i486, regparm is used, and:
function old new delta
zbc_num_inv 56 57 +1
zbc_num_k 852 851 -1
zbc_program_modexp 558 556 -2
zbc_num_d 541 539 -2
bc_num_ulong2num 59 57 -2
zbc_program_num 840 836 -4
bc_num_zero 11 7 -4
bc_num_one 28 24 -4
bc_program_exec 3928 3918 -10
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/8 up/down: 1/-29) Total: -28 bytes
text data bss dec hex filename
982237 485 7296 990018 f1b42 busybox_old
982209 485 7296 989990 f1b26 busybox_unstripped
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'miscutils')
-rw-r--r-- | miscutils/bc.c | 60 |
1 files changed, 21 insertions, 39 deletions
diff --git a/miscutils/bc.c b/miscutils/bc.c index 5ede859..e7f48fc 100644 --- a/miscutils/bc.c +++ b/miscutils/bc.c @@ -5943,6 +5943,7 @@ static BcStatus bc_program_logical(char inst) s = zbc_program_binOpPrep(&opd1, &n1, &opd2, &n2, false); if (s) return s; + bc_num_init_DEF_SIZE(&res.d.n); if (inst == BC_INST_BOOL_AND) @@ -5950,50 +5951,31 @@ static BcStatus bc_program_logical(char inst) else if (inst == BC_INST_BOOL_OR) cond = bc_num_cmp(n1, &G.prog.zero) || bc_num_cmp(n2, &G.prog.zero); else { - cmp = bc_num_cmp(n1, n2); - switch (inst) { - - case BC_INST_REL_EQ: - { - cond = cmp == 0; - break; - } - - case BC_INST_REL_LE: - { - cond = cmp <= 0; - break; - } - - case BC_INST_REL_GE: - { - cond = cmp >= 0; - break; - } - - case BC_INST_REL_NE: - { - cond = cmp != 0; - break; - } - - case BC_INST_REL_LT: - { - cond = cmp < 0; - break; - } - - case BC_INST_REL_GT: - { - cond = cmp > 0; - break; - } + case BC_INST_REL_EQ: + cond = cmp == 0; + break; + case BC_INST_REL_LE: + cond = cmp <= 0; + break; + case BC_INST_REL_GE: + cond = cmp >= 0; + break; + case BC_INST_REL_NE: + cond = cmp != 0; + break; + case BC_INST_REL_LT: + cond = cmp < 0; + break; + case BC_INST_REL_GT: + cond = cmp > 0; + break; } } - (cond ? bc_num_one : bc_num_zero)(&res.d.n); + if (cond) bc_num_one(&res.d.n); + //else bc_num_zero(&res.d.n); - already is bc_program_binOpRetire(&res); |