busybox/docs/smallint.txt
<<
>>
Prefs
   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
   9I think that this optimization is wrong.
  10index_in_str_array returns int. At best, compiler will use it as-is.
  11At worst, compiler will try to make sure that it is properly cast
  12into a byte, which probably results in "n = n & 0xff" on many architectures.
  13
  14You save nothing on space here because i is not stored on-stack,
  15gcc will keep it in register. And even if it *is* stored,
  16it is *stack* storage, which is cheap (unlike data/bss).
  17
  18small[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
  33small[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.
  40