public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Porting the GCC to 8051-Microcontroller ? Register Banks
@ 1999-12-22  9:00 Anja Müller
  1999-12-22 13:05 ` Joern Rennecke
  1999-12-31 23:54 ` Anja Müller
  0 siblings, 2 replies; 6+ messages in thread
From: Anja Müller @ 1999-12-22  9:00 UTC (permalink / raw)
  To: gcc

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2728 bytes --]

Hallo,

Im Rahmen einer Studienarbeit möchte ich versuchen, den GCC für den
8-Bit-Microcontroller 8051 von Intel zu portieren. Diesbezüglich bin
gearde dabei, die Machine Macros (*.h-Datei) zu definieren. Dabei habe
ich folgendes Problem:

Der 8051-Mircocontroller besitzt 4 Register-Bänke, die jeweils aus 8
"R"-Registern R0,...,R7 bestehen. Zu einem Zeitpunkt kann jedoch nur
eine dieser Register-Bänke aktiv sein. Das Umschalten zwischen den
Bänken erfolgt
über das Program Status Word Register (PSW), in dem zwei Bit eigens
dafür reserviert sind, die aktive Register Bank zu setzen. Wenn also
z.B. Bank 0 aktiv sein soll, müssen die entsprechenden Bits im
PSW-Register auf "00" gestezt werden, wenn Bank 1 aktiv sein soll, auf
"01", und so weiter ...
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..

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.

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?)

Vielen Dank für ihre Hilfe !

Anja Müller


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Porting the GCC to 8051-Microcontroller ? Register Banks
  1999-12-22  9:00 Porting the GCC to 8051-Microcontroller ? Register Banks Anja Müller
@ 1999-12-22 13:05 ` Joern Rennecke
  1999-12-22 14:23   ` Richard Hadsell
  1999-12-31 23:54   ` Joern Rennecke
  1999-12-31 23:54 ` Anja Müller
  1 sibling, 2 replies; 6+ messages in thread
From: Joern Rennecke @ 1999-12-22 13:05 UTC (permalink / raw)
  To: Anja [M_ller]; +Cc: gcc

> 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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Porting the GCC to 8051-Microcontroller ? Register Banks
  1999-12-22 13:05 ` Joern Rennecke
@ 1999-12-22 14:23   ` Richard Hadsell
  1999-12-31 23:54     ` Richard Hadsell
  1999-12-31 23:54   ` Joern Rennecke
  1 sibling, 1 reply; 6+ messages in thread
From: Richard Hadsell @ 1999-12-22 14:23 UTC (permalink / raw)
  To: Joern Rennecke; +Cc: Anja [M_ller], gcc

Joern Rennecke wrote:
> 
> I think your best bet is to ignore the existence of the register banks
> in the compiler.

FYI, in case you or Anja didn't know:  Some old computers (PDP-11,
Motorola 68000, I forget which) selected register banks with a couple of
bits in the program status register.  These were intended to switch
context between user, supervisor, and kernel states.  The kernel state
would be loaded when there was some kind of interrupt, so that the
interrupt handler could use registers right away without saving the
user's registers.

Anyway, I would not expect a compiler to try to access the registers in
one of the other banks.  Special code in the operating system might have
to save or restore them in order to dispatch a new context, but (if I
recall correctly) there were special machine instructions for accessing
registers of different banks.  Otherwise, most code, including operating
system code, would expect to be dealing only with its assigned
registers.

So, I agree with your suggestion of treating the general registers as
just a single set, unless Anja plans to use the compiler to create code
for switching contexts.

-- 
Dick Hadsell			914-381-8400 x5446 Fax: 914-381-9790
Reply-to:			hadsell@blueskystudios.com
Blue Sky Studios                http://www.blueskystudios.com
1 South Road, Harrison, NY 10528

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Porting the GCC to 8051-Microcontroller ? Register Banks
  1999-12-22  9:00 Porting the GCC to 8051-Microcontroller ? Register Banks Anja Müller
  1999-12-22 13:05 ` Joern Rennecke
@ 1999-12-31 23:54 ` Anja Müller
  1 sibling, 0 replies; 6+ messages in thread
From: Anja Müller @ 1999-12-31 23:54 UTC (permalink / raw)
  To: gcc

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain, Size: 2728 bytes --]

Hallo,

Im Rahmen einer Studienarbeit möchte ich versuchen, den GCC für den
8-Bit-Microcontroller 8051 von Intel zu portieren. Diesbezüglich bin
gearde dabei, die Machine Macros (*.h-Datei) zu definieren. Dabei habe
ich folgendes Problem:

Der 8051-Mircocontroller besitzt 4 Register-Bänke, die jeweils aus 8
"R"-Registern R0,...,R7 bestehen. Zu einem Zeitpunkt kann jedoch nur
eine dieser Register-Bänke aktiv sein. Das Umschalten zwischen den
Bänken erfolgt
über das Program Status Word Register (PSW), in dem zwei Bit eigens
dafür reserviert sind, die aktive Register Bank zu setzen. Wenn also
z.B. Bank 0 aktiv sein soll, müssen die entsprechenden Bits im
PSW-Register auf "00" gestezt werden, wenn Bank 1 aktiv sein soll, auf
"01", und so weiter ...
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..

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.

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?)

Vielen Dank für ihre Hilfe !

Anja Müller


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Porting the GCC to 8051-Microcontroller ? Register Banks
  1999-12-22 14:23   ` Richard Hadsell
@ 1999-12-31 23:54     ` Richard Hadsell
  0 siblings, 0 replies; 6+ messages in thread
From: Richard Hadsell @ 1999-12-31 23:54 UTC (permalink / raw)
  To: Joern Rennecke; +Cc: Anja [M_ller], gcc

Joern Rennecke wrote:
> 
> I think your best bet is to ignore the existence of the register banks
> in the compiler.

FYI, in case you or Anja didn't know:  Some old computers (PDP-11,
Motorola 68000, I forget which) selected register banks with a couple of
bits in the program status register.  These were intended to switch
context between user, supervisor, and kernel states.  The kernel state
would be loaded when there was some kind of interrupt, so that the
interrupt handler could use registers right away without saving the
user's registers.

Anyway, I would not expect a compiler to try to access the registers in
one of the other banks.  Special code in the operating system might have
to save or restore them in order to dispatch a new context, but (if I
recall correctly) there were special machine instructions for accessing
registers of different banks.  Otherwise, most code, including operating
system code, would expect to be dealing only with its assigned
registers.

So, I agree with your suggestion of treating the general registers as
just a single set, unless Anja plans to use the compiler to create code
for switching contexts.

-- 
Dick Hadsell			914-381-8400 x5446 Fax: 914-381-9790
Reply-to:			hadsell@blueskystudios.com
Blue Sky Studios                http://www.blueskystudios.com
1 South Road, Harrison, NY 10528

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: Porting the GCC to 8051-Microcontroller ? Register Banks
  1999-12-22 13:05 ` Joern Rennecke
  1999-12-22 14:23   ` Richard Hadsell
@ 1999-12-31 23:54   ` Joern Rennecke
  1 sibling, 0 replies; 6+ messages in thread
From: Joern Rennecke @ 1999-12-31 23:54 UTC (permalink / raw)
  To: Anja [M_ller]; +Cc: gcc

> 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.

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~1999-12-31 23:54 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
1999-12-22  9:00 Porting the GCC to 8051-Microcontroller ? Register Banks Anja Müller
1999-12-22 13:05 ` Joern Rennecke
1999-12-22 14:23   ` Richard Hadsell
1999-12-31 23:54     ` Richard Hadsell
1999-12-31 23:54   ` Joern Rennecke
1999-12-31 23:54 ` Anja Müller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).