~mmach/netext73/busybox

« back to all changes in this revision

Viewing changes to docs/smallint.txt

  • Committer: mmach
  • Date: 2021-04-14 13:54:24 UTC
  • Revision ID: netbit73@gmail.com-20210414135424-8x3fxf716zs4wflb
1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
        smalluint i = index_in_str_array(params, name) + 1;
 
2
        if (i == 0)
 
3
                return 0;
 
4
        if (!(i == 4 || i == 5))
 
5
                i |= 0x80;
 
6
 
 
7
        return i;
 
8
 
 
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.
 
13
 
 
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).
 
17
 
 
18
small[u]ints are useful _mostly_ for:
 
19
 
 
20
(a) flag variables
 
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.
 
24
            Example:
 
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
 
30
    structures allocated,
 
31
    or when these are global objects of this structure type
 
32
 
 
33
small[u]ints are *NOT* useful for:
 
34
 
 
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.