Target Definitions for R8C/M16C/M32C
|
Target Definitions for R8C/M16C/M32C
|
Copyright (C) 2005, 2007
|
Copyright (C) 2005, 2007
|
Free Software Foundation, Inc.
|
Free Software Foundation, Inc.
|
Contributed by Red Hat.
|
Contributed by Red Hat.
|
|
|
This file is part of GCC.
|
This file is part of GCC.
|
|
|
GCC is free software; you can redistribute it and/or modify it
|
GCC is free software; you can redistribute it and/or modify it
|
under the terms of the GNU General Public License as published
|
under the terms of the GNU General Public License as published
|
by the Free Software Foundation; either version 3, or (at your
|
by the Free Software Foundation; either version 3, or (at your
|
option) any later version.
|
option) any later version.
|
|
|
GCC is distributed in the hope that it will be useful, but WITHOUT
|
GCC is distributed in the hope that it will be useful, but WITHOUT
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
License for more details.
|
License for more details.
|
|
|
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
along with GCC; see the file COPYING3. If not see
|
along with GCC; see the file COPYING3. If not see
|
.
|
.
|
|
|
|
|
These are just some random notes I used during development of this
|
These are just some random notes I used during development of this
|
port. Please don't consider these to be "official" specifications,
|
port. Please don't consider these to be "official" specifications,
|
just additional information to help make the code easier to
|
just additional information to help make the code easier to
|
understand.
|
understand.
|
|
|
|
|
Frame
|
Frame
|
=====
|
=====
|
|
|
+--------------------
|
+--------------------
|
| incoming args
|
| incoming args
|
+--------------------
|
+--------------------
|
| return Address
|
| return Address
|
osp -> +--------------------
|
osp -> +--------------------
|
| saved fp
|
| saved fp
|
fp -> +--------------------
|
fp -> +--------------------
|
| local data
|
| local data
|
+--------------------
|
+--------------------
|
| saved regs
|
| saved regs
|
+--------------------
|
+--------------------
|
| outgoing args (opt)
|
| outgoing args (opt)
|
sp -> +--------------------
|
sp -> +--------------------
|
|
|
Argument Passing
|
Argument Passing
|
================
|
================
|
|
|
r8c, m16c
|
r8c, m16c
|
---------
|
---------
|
|
|
First arg may be passed in r1l or r1 if it (1) fits (QImode or
|
First arg may be passed in r1l or r1 if it (1) fits (QImode or
|
HImode), (2) is named, and (3) is an integer or pointer type (no
|
HImode), (2) is named, and (3) is an integer or pointer type (no
|
structs, floats, etc). Otherwise, it's passed on the stack.
|
structs, floats, etc). Otherwise, it's passed on the stack.
|
|
|
Second arg may be passed in r2, same restrictions (but not QImode),
|
Second arg may be passed in r2, same restrictions (but not QImode),
|
even if the first arg is passed on the stack.
|
even if the first arg is passed on the stack.
|
|
|
Third and further args are passed on the stack. No padding is used,
|
Third and further args are passed on the stack. No padding is used,
|
stack "alignment" is 8 bits.
|
stack "alignment" is 8 bits.
|
|
|
m32cm, m32c
|
m32cm, m32c
|
-----------
|
-----------
|
First arg may be passed in r0l or r0, same restrictions as above.
|
First arg may be passed in r0l or r0, same restrictions as above.
|
|
|
Second and further args are passed on the stack. Padding is used
|
Second and further args are passed on the stack. Padding is used
|
after QImode parameters (i.e. lower-addressed byte is the value,
|
after QImode parameters (i.e. lower-addressed byte is the value,
|
higher-addressed byte is the padding), stack "alignment" is 16 bits.
|
higher-addressed byte is the padding), stack "alignment" is 16 bits.
|
|
|
|
|
Return Value
|
Return Value
|
============
|
============
|
|
|
r8c, m16c
|
r8c, m16c
|
---------
|
---------
|
|
|
QImode in r0l
|
QImode in r0l
|
HImode in r0
|
HImode in r0
|
near pointer in r0
|
near pointer in r0
|
(desired)
|
(desired)
|
SImode in r2r0
|
SImode in r2r0
|
far pointer in r2r0
|
far pointer in r2r0
|
(actual)
|
(actual)
|
Anything bigger than 16 bits is returned in memory, at mem0 (mem0
|
Anything bigger than 16 bits is returned in memory, at mem0 (mem0
|
through mem15 are provided by libgcc.a)
|
through mem15 are provided by libgcc.a)
|
|
|
Aggregate values (regardless of size) are returned by pushing a
|
Aggregate values (regardless of size) are returned by pushing a
|
pointer to a temporary area on the stack after the args are pushed.
|
pointer to a temporary area on the stack after the args are pushed.
|
The function fills in this area with the value. Note that this
|
The function fills in this area with the value. Note that this
|
pointer on the stack does not affect how register arguments, if any,
|
pointer on the stack does not affect how register arguments, if any,
|
are configured.
|
are configured.
|
|
|
m32cm, m32c
|
m32cm, m32c
|
-----------
|
-----------
|
Same.
|
Same.
|
|
|
|
|
Registers Preserved Across Calls
|
Registers Preserved Across Calls
|
================================
|
================================
|
|
|
r8c, m16c
|
r8c, m16c
|
---------
|
---------
|
sb, fb, sp (i.e. nearly all registers are call clobbered)
|
sb, fb, sp (i.e. nearly all registers are call clobbered)
|
|
|
m32cm, m32c
|
m32cm, m32c
|
-----------
|
-----------
|
r1, r2, r3, a0, a1, sb, fb, sp
|
r1, r2, r3, a0, a1, sb, fb, sp
|
(except when used for return values)
|
(except when used for return values)
|
|
|
|
|
Interrupt Handlers
|
Interrupt Handlers
|
==================
|
==================
|
|
|
The stack frame is slightly different for interrupt handlers, because
|
The stack frame is slightly different for interrupt handlers, because
|
(1) we don't have a usable parent frame, and (2) we have to use
|
(1) we don't have a usable parent frame, and (2) we have to use
|
special instructions to return and thus must save/restore everything
|
special instructions to return and thus must save/restore everything
|
differently.
|
differently.
|
|
|
+--------------------
|
+--------------------
|
| program state
|
| program state
|
osp -> +--------------------
|
osp -> +--------------------
|
| return address
|
| return address
|
+--------------------
|
+--------------------
|
| saved r0..fp (pushm)
|
| saved r0..fp (pushm)
|
fp -> +--------------------
|
fp -> +--------------------
|
| local data
|
| local data
|
+--------------------
|
+--------------------
|
| saved regs mem0..mem15
|
| saved regs mem0..mem15
|
+--------------------
|
+--------------------
|
| outgoing args (opt)
|
| outgoing args (opt)
|
sp -> +--------------------
|
sp -> +--------------------
|
|
|
|
|