This is the mail archive of the
mailing list for the GCC project.
Re: RFC: Idea for code size reduction
>> When wouldn't that possible? My script currently splits on an
>> instruction-level -- although I would see no problem that some branch
>> jumps into a "half" opcode of another branch, if the byte sequence
> 00000000 <bar>:
> 0: b8 a4 00 00 00 mov $0xa4,%eax
> 5: ba fc 04 00 00 mov $0x4fc,%edx
> a: f7 e2 mul %edx
> c: 05 d2 04 00 00 add $0x4d2,%eax
> 11: c3 ret
> 00020012 <foo>:
> 20012: 39 d2 cmp %edx,%edx
> 20014: 75 07 jne 2001d <foo+0xb>
> 20016: ba fc 04 00 00 mov $0x4fc,%edx
> 2001b: f7 e2 mul %edx
> 2001d: 05 d2 04 00 00 add $0x4d2,%eax
> 20022: c3 ret
That's not an example of jumping into the *middle* of an instruction.
I'd think about something like (please ignore the wrong addresses, just
5: ba fc 04 00 00 mov $0x4fc,%edx
---> a: f7 e2 mul %edx
c: 05 d2 04 00 00 add $0x4d2,%eax
11: c3 ret
20016: ba 00 ba f7 e2 mov $0xe2f7ba00,%edx
2001b: f7 e2 mul %edx
2001d: 05 d2 04 00 00 add $0x4d2,%eax
20022: c3 ret
Now we could place a jump at 0x4, which goes to 0x20018 - and should work,
> If you merge the mov/mul/add/ret sequences by replacing the foo tail
> sequence with jmp bar+5, then the jne will branch to wrong place, or
> if you try to adjust it, it is too far to reach the target.
Yes. But see below.
>> > but even jmp argument is relative, not absolute.
>> That's why I take only jumps with 32bit arguments - these are absolute.
> No, they are relative.
> 00000000 <bar>:
> 0: e9 05 00 02 00 jmp 2000a <foo>
> 5: e9 00 00 02 00 jmp 2000a <foo>
> 0002000a <foo>:
> 2000a: 90 nop
> See how they are encoded.
But how does the compiler encode jumps? Via symbols, and the correct
destination address gets put there by the linker. If there are
(sizeof(void*)) operand bytes, there's enough space for *any* jump.
(Is there some way for the linker to compress small jumps later?)
> BTW, have you tried to compile the whole kernel with --combine, or at
> e.g. each kernel directory with --combine? I guess that will give you
> bigger savings than 30K. Also, stop defining inline to inline
> __attribute__((always_inline)), I think Ingo also added such patch
> and it saved 120K.
No ... but these are independent changes.
I'm currently compiling with --combine.
Versioning your /etc, /home or even your whole installation?
Try fsvs (fsvs.tigris.org)!