stormy-abi: Document abi changes.
* config/stormy16/stormy-abi: Document abi changes. * config/stormy16/stormy16.h (REG_ALLOC_ORDER): Redefine. (ICALL_REGS): New register class. (NUM_ARGUMENT_REGISTERS): Now 6. (DEFAULT_PCC_STRUCT_RETURN): Don't try to return structs in registers. (REG_CLASS_FROM_LETTER): Map 'z' to ICALL_REGS. * config/stormy16.md (call_internal, call_value_internal, indirect_jump): Use new 'z' constraint. From-SVN: r46041
This commit is contained in:
parent
9f1c29317c
commit
da6e254e44
@ -1,3 +1,15 @@
|
||||
2001-10-05 Catherine Moore <clm@redhat.com>
|
||||
|
||||
* config/stormy16/stormy-abi: Document abi changes.
|
||||
* config/stormy16/stormy16.h (REG_ALLOC_ORDER): Redefine.
|
||||
(ICALL_REGS): New register class.
|
||||
(NUM_ARGUMENT_REGISTERS): Now 6.
|
||||
(DEFAULT_PCC_STRUCT_RETURN): Don't try to return structs
|
||||
in registers.
|
||||
(REG_CLASS_FROM_LETTER): Map 'z' to ICALL_REGS.
|
||||
* config/stormy16.md (call_internal, call_value_internal,
|
||||
indirect_jump): Use new 'z' constraint.
|
||||
|
||||
2001-10-05 Neil Booth <neil@daikokuya.demon.co.uk>
|
||||
|
||||
* doc/cppinternals.texi: Update.
|
||||
|
@ -24,17 +24,19 @@ The registers are allocated as follows:
|
||||
|
||||
Register Purpose
|
||||
-------------------------------------------------------------------
|
||||
r0, r1 Call-volatile. May be changed during the execution
|
||||
r0, r1 Call-volatile. May be changed during the execution
|
||||
of a call instruction.
|
||||
r2 through r7 Argument passing; call-clobbered.
|
||||
r8, r9 Call-volatile. May be changed during the execution
|
||||
of a call instruction.
|
||||
r2 through r9 Argument passing; call-clobbered.
|
||||
r10 through r13 Call-saved.
|
||||
r14 Program status word.
|
||||
r15 Stack pointer.
|
||||
|
||||
|
||||
The return value of a procedure is returned in r2-r9 if it fits,
|
||||
otherwise a pointer is passed as a `hidden' first argument
|
||||
and the return value is placed there.
|
||||
Scalar values are returned in register r2-r7 if the value fits.
|
||||
Otherwise, a pointer is passed as a 'hidden' first argument and
|
||||
the return value is placed there.
|
||||
|
||||
Arguments are passed in registers starting in r2, then on the stack.
|
||||
Arguments of size not a multiple of a word are padded to whole words.
|
||||
@ -83,20 +85,18 @@ count += N;
|
||||
|
||||
|
||||
One implementation of this is if a variadic function first
|
||||
pushes registers 2 through 9 in sequence at entry, and
|
||||
pushes registers 2 through 7 in sequence at entry, and
|
||||
sets 'base' to the address of the first word pushed,
|
||||
producing a stack that appears like:
|
||||
|
||||
SP ->
|
||||
[other data]
|
||||
r9
|
||||
r8
|
||||
r7
|
||||
r6
|
||||
r5
|
||||
r4
|
||||
r3
|
||||
count-> r2
|
||||
count-> r2
|
||||
Return address (two words)
|
||||
9th procedure parameter word
|
||||
10th procedure parameter word
|
||||
|
@ -1043,7 +1043,7 @@ do { \
|
||||
only sequences of consecutive registers. On such machines, define
|
||||
`REG_ALLOC_ORDER' to be an initializer that lists the highest numbered
|
||||
allocatable register first. */
|
||||
#define REG_ALLOC_ORDER { 9, 7, 6, 5, 4, 3, 8, 2, 1, 0, 10, 11, 12, 13, 14, 15, 16 }
|
||||
#define REG_ALLOC_ORDER { 7, 6, 5, 4, 3, 2, 1, 0, 9, 8, 10, 11, 12, 13, 14, 15, 16 }
|
||||
|
||||
/* A C statement (sans semicolon) to choose the order in which to allocate hard
|
||||
registers for pseudo-registers local to a basic block.
|
||||
@ -1204,6 +1204,7 @@ enum reg_class
|
||||
R2_REGS,
|
||||
EIGHT_REGS,
|
||||
R8_REGS,
|
||||
ICALL_REGS,
|
||||
GENERAL_REGS,
|
||||
CARRY_REGS,
|
||||
ALL_REGS,
|
||||
@ -1226,6 +1227,7 @@ enum reg_class
|
||||
"R2_REGS", \
|
||||
"EIGHT_REGS", \
|
||||
"R8_REGS", \
|
||||
"ICALL_REGS", \
|
||||
"GENERAL_REGS", \
|
||||
"CARRY_REGS", \
|
||||
"ALL_REGS" \
|
||||
@ -1250,6 +1252,7 @@ enum reg_class
|
||||
0x00004, \
|
||||
0x000FF, \
|
||||
0x00100, \
|
||||
0x00300, \
|
||||
0x6FFFF, \
|
||||
0x10000, \
|
||||
(1 << FIRST_PSEUDO_REGISTER) - 1 \
|
||||
@ -1303,6 +1306,7 @@ enum reg_class
|
||||
: (CHAR) == 'e' ? EIGHT_REGS \
|
||||
: (CHAR) == 't' ? TWO_REGS \
|
||||
: (CHAR) == 'y' ? CARRY_REGS \
|
||||
: (CHAR) == 'z' ? ICALL_REGS \
|
||||
: NO_REGS)
|
||||
|
||||
/* A C expression which is nonzero if register number NUM is suitable for use
|
||||
@ -2007,7 +2011,7 @@ enum reg_class
|
||||
|
||||
/* Function Arguments in Registers */
|
||||
|
||||
#define NUM_ARGUMENT_REGISTERS 8
|
||||
#define NUM_ARGUMENT_REGISTERS 6
|
||||
#define FIRST_ARGUMENT_REGISTER 2
|
||||
|
||||
#define STORMY16_WORD_SIZE(TYPE, MODE) \
|
||||
@ -2293,7 +2297,7 @@ typedef int CUMULATIVE_ARGS;
|
||||
return values are decided by the `RETURN_IN_MEMORY' macro.
|
||||
|
||||
If not defined, this defaults to the value 1. */
|
||||
#define DEFAULT_PCC_STRUCT_RETURN 0
|
||||
/* #define DEFAULT_PCC_STRUCT_RETURN 0 */
|
||||
|
||||
/* If the structure value address is passed in a register, then
|
||||
`STRUCT_VALUE_REGNUM' should be the number of that register. */
|
||||
|
@ -822,7 +822,7 @@
|
||||
(define_insn "*call_internal"
|
||||
[(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "i,r"))
|
||||
(match_operand 1 "" ""))
|
||||
(use (match_operand:HI 2 "nonmemory_operand" "X,t"))]
|
||||
(use (match_operand:HI 2 "nonmemory_operand" "X,z"))]
|
||||
""
|
||||
"@
|
||||
callf %C0
|
||||
@ -834,7 +834,7 @@
|
||||
[(set (match_operand 3 "register_operand" "=r,r")
|
||||
(call (mem:HI (match_operand:HI 0 "nonmemory_operand" "i,r"))
|
||||
(match_operand 1 "" "")))
|
||||
(use (match_operand:HI 2 "nonmemory_operand" "X,t"))]
|
||||
(use (match_operand:HI 2 "nonmemory_operand" "X,z"))]
|
||||
""
|
||||
"@
|
||||
callf %C0
|
||||
@ -882,7 +882,7 @@
|
||||
|
||||
(define_insn ""
|
||||
[(set (pc) (match_operand:HI 0 "register_operand" "r"))
|
||||
(use (match_operand:HI 1 "register_operand" "t"))]
|
||||
(use (match_operand:HI 1 "register_operand" "z"))]
|
||||
""
|
||||
"jmp %1,%0"
|
||||
[(set_attr "length" "4")
|
||||
|
Loading…
Reference in New Issue
Block a user