Porting the GCC to 8051-Microcontroller ? Register Banks

Joern Rennecke amylaar@cygnus.co.uk
Wed Dec 22 13:05:00 GMT 1999


> Mein Problem besteht nun darin, wie man das Vorhandensein dieser
> Register-B_nke in den Maschinen-Makros definieren kann. Ich habe leider
> keine _quivalente Zielmaschine gefunden, die bereits vom GCC unterst_tzt
> wird. Das Vorhandensein von Register-B_nken _hnelt mehr einer
> RISC-Architektur, jedoch im Grunde genommen hat der 8051 eine CISC-CPU,
> d.h. es gibt auch viele akkumulator-orientierte Befehle sowie einen
> Stack, der z.B. zur Argumenten-_bergabe bei Funktionen benutzt werden
> kann. Es w_re jedoch von grossem Vorteil, auch die vielen "R"-Register
> der Register-B_nke nutzen zu k_nnen. Die Frage ist jedoch, wie man
> Register-B_nke in den
> Machinen-Macros definieren kann, also z.B. in den Macros
> FIXED_REGISTERS, CALL_USED_REGISTERS, usw..

I don't see any way these register banks can be useful for gcc-generated code.
If these banks were a bit larger and numberous, you could go for using them
as register windows, thus saving register saves / restores for function calls.
But if you only have four banks of eight bytes each, the added hassle to
return values outside of registers and to save / restore register windows
to / from memory on overflow / underflow will probably outweigh any benefits.

> Kennen Sie eine Maschine,die bereits vom GCC unterst_tzt wird und die
> Register-B_nke oder einen _hnlichen Registersatz aufweist wie der 8051 ?
> Oder haben Sie eine Idee oder einen Tip, wie man an diese Sache
> herangehen k_nnte ? Das w_re sehr hilfreich.

I think your best bet is to ignore the existence of the register banks
in the compiler.

> Desweiteren gibt es noch folgendes Problem:
> 
> Der 8051 ist ein 8-Bit-Microcontroler, d.h. die meisten seiner Register
> sind 8 Bit breit und auch der Speicher ist nur byteweise adressierbar.
> Der externe Datenspeicher und auch der separate Programmspeicher werden
> jedoch _ber
> 16-Bit-Adressen adressiert. Daf_r steht ein 16-Bit-Register zur
> Verf_gung, der sogenannte Datenpointer DPTR. Der Programm-Counter PC ist
> auch 16 Bit breit, er kann jedoch nicht explizit angesprochen werden.
> Dadurch gibt
> es nun zumeist 8-Bit-Register aber auch ein einzelnes 16-Bit-Register
> (DPTR), welches jedoch auch byteweise adressiert werden kann, n_mlich
> Low- und Highbyte extra. Wie kann man diese Gegebenheiten in den
> Maschinen-Makros umsetzen ? (Geht der GCC nicht davon aus, dass alle in
> FIXED_REGISTERS, ... usw. benannten Register dieselbe Breite aufweisen?)

So BITS_PER_UNIT and BITS_PER_WORD would be 8.
You could either model DPTR as a single register, and tell gcc with
HARD_REGNO_NREGS that a HImode value fits into this single register;
but then, you couldn't allow to access the 8-bit part that would be stored
on the higher memory address (which that is depends on endianness),
since that would give the wrong register number when a SUBREG is converted
to a hard register.
The other alternative is to model DPTR as two adjacent registers.  Since you
say you can address both parts separately, this seems to be the more natural
choice.


More information about the Gcc mailing list