1
smalluint i = index_in_str_array(params, name) + 1;
4
if (!(i == 4 || i == 5))
9
I think that this optimization is wrong.
10
index_in_str_array returns int. At best, compiler will use it as-is.
11
At worst, compiler will try to make sure that it is properly cast
12
into a byte, which probably results in "n = n & 0xff" on many architectures.
14
You save nothing on space here because i is not stored on-stack,
15
gcc will keep it in register. And even if it *is* stored,
16
it is *stack* storage, which is cheap (unlike data/bss).
18
small[u]ints are useful _mostly_ for:
21
(a1) global flag variables - make data/bss smaller
22
(a2) local flag variables - "a = 5", "a |= 0x40" are smaller
23
for bytes than for full integers.
25
on i386, there is no widening constant store instruction
26
for some types of address modes, thus
27
movl $0x0,(%eax) is "c7 00 00 00 00 00"
28
movb $0x0,(%eax) is "c6 00 00"
29
(b) small integer structure members, when you have many such
31
or when these are global objects of this structure type
33
small[u]ints are *NOT* useful for:
35
(a) function parameters and return values -
36
they are pushed on-stack or stored in registers, bytes here are *harder*
37
to deal with than ints
38
(b) "computational" variables - "a++", "a = b*3 + 7" may take more code to do
39
on bytes than on ints on some architectires.