Ram initialization and small c.
Eric W. Biederman
ebiederman at lnxi.com
Tue Feb 25 20:03:01 CET 2003
Jeremy Jackson <jerj at coplanar.net> writes:
> On Tue, 2003-02-25 at 13:09, Steve Gehlbach wrote:
>
> > I think you have to cramp your C coding style anyway, to stay within
> > registers. The extra scratch area does not help much, with chips such
>
> A compiler *made* to compile this way could help a great deal by
> scheduling instructions like an RPN calculator though, so *you* don't
> have to write in spaghetti code.
So far I like the extern inline aspect in that it makes a good proof
of concept that this code can be written in C, and that it is not so
outrageous to expect a compiler to do it.
Steve for a feel of my worries try compiling that code with gcc-3.3. If
what I saw earlier today is right it won't work because someone has decided
that aggressive inlining is bad thing...
> > BUT, would C's block-scope local variables allow registers to be re-used
> by different local variables, so instead of
>
> void func (void) {
> register int eax;
>
> /* use i for one purpose */
>
> /* use same i for something else */
> }
>
> you could do
>
> void func (void) {
> {
> register int ramsize;
> /* use ramsize */
> }
> {
> register int cpuid;
> /* use cpuid */
> }
> }
>
> and have both end up using the same register, kind of like a union,
> but still looking more like C than assembler.
Yes. That is basic live variable analysis. In general a value not a
variable gets assigned to a register.
The rule is that if a variable is assigned a new value before the
old value is used again. The variable can be dropped in the
intervening space, and afterwards a new register can be assigned.
It can go as far as a new register assignment every time you change
the value of a variable.
> > as the SiS630, only has three gp regs, little help. You can't go around
> > declaring variables willy nilly, you run out of space (registers) no
> > matter what compiler.
>
> But for the cases where (in the chipset or whereever) there are scratch
> registers, global extern static variables that are fixed when linking,
> (or define them in an assembler stub with .org or such) would allow them
> to be used easily from C.
That definitely requires some thinking. When it requires extra registers
to spill a register it can be hard for a compiler. I am going to
start with the spill free case...
> > So far it is about 400 lines of C, should I attach it? It compiles
> > without using the stack (except for a %ebp push/pop which can be deleted).
>
> Please do. It would be a good example of how complex the code can be
> with the register/inline constraints.
It has already shown up on the list but watch out for the inline part
that says it is a pixmap when it should be text plain.
Eric
More information about the coreboot
mailing list