-Stormy16 ABI
+xStormy16 ABI
************
!!!!! NOTE !!!!!
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.
(N will be even) is accessed as if by the following code:
char *result;
-if (count + N > 16)
+/* count = #bytes non-variable arguments */
+/* 12 = #bytes for register arguments */
+if (count + N > 12)
{
- if (count < 16)
- count = 16;
- result = base - (count + N - 16 + 4);
+ if (count < 12)
+ count = 12;
+ result = base - (count + N - 12 + 4);
}
else
{
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
+ 7th procedure parameter word
+ 8th procedure parameter word
...
last procedure parameter word
-and initialises 'count' to be the number of bytes of non-variable
+and initializes 'count' to be the number of bytes of non-variable
arguments to the function.
ELF File Format
ELF file header
---------------
-Stormy16 ELF files are distinguished by the value EM_STORMY16 in
+xStormy16 ELF files are distinguished by the value EM_XSTORMY16 in
the e_machine field of the ELF file header:
-#define EM_STORMY16 0xad45
+#define EM_XSTORMY16 0xad45
DWARF Register Number Mapping
-----------------------------
Name Value Field Calculation Overflow
----------------------------------------------------------------
-R_STORMY16_NONE 0 none none none
-R_STORMY16_32 1 32 S + A none
-R_STORMY16_16 2 16 S + A unsigned
-R_STORMY16_8 3 8 S + A unsigned
-R_STORMY16_PC32 4 32 S + A - P none
-R_STORMY16_PC16 5 16 S + A - P signed
-R_STORMY16_PC8 6 8 S + A - P signed
-R_STORMY16_REL_12 7 16:12:0 S + A - P signed
-R_STORMY16_24 8 32:23:1 (S + A) >> 1 unsigned
-R_STORMY16_GNU_VTINHERIT 9 n/a n/a n/a
-R_STORMY16_GNU_VTENTRY 10 n/a n/a n/a
-
-In the 'Calculation' column, 'S' is the value of the symbol to which
-the reloc refers, 'A' is the addend, and 'P' represents the place of
-the storage unit being relocated.
+R_XSTORMY16_NONE 0 none none none
+R_XSTORMY16_32 1 32 S + A none
+R_XSTORMY16_16 2 16 S + A either
+R_XSTORMY16_8 3 8 S + A unsigned
+R_XSTORMY16_PC32 4 32 S + A - P none
+R_XSTORMY16_PC16 5 16 S + A - P signed
+R_XSTORMY16_PC8 6 8 S + A - P signed
+R_XSTORMY16_REL_12 7 16:12:0 S + A - P signed
+R_XSTORMY16_24 8 32:23:1 (S + A) >> 1 unsigned
+R_XSTORMY16_FPTR16 9 16 S + A either
+R_XSTORMY16_LO16 10 16 S + A none
+R_XSTORMY16_HI16 11 32:16:16 S + A none
+R_XSTORMY16_12 12 16:12:0 S + A signed
+R_XSTORMY16_GNU_VTINHERIT 128 n/a n/a n/a
+R_XSTORMY16_GNU_VTENTRY 129 n/a n/a n/a
In the 'Field' column, the first number indicates whether the
relocation refers to a byte, word or doubleword. The second number,
-if any, indicates the size of the bitfield into which the relocation
+if any, indicates the size of the bit-field into which the relocation
is to occur (and also the size for overflow checking). The third
-number indicates the first bit of the bitfield in the word or
+number indicates the first bit of the bit-field in the word or
doubleword, counting the LSB as bit 0.
+
+In the 'Calculation' column, 'S' is the value of the symbol to which
+the reloc refers, 'A' is the addend, and 'P' represents the place of
+the storage unit being relocated.
+
+In the 'Overflow' column, 'none' means that any overflow of the
+computation perfomed in the 'Calculation' column is ignored.
+'signed' means that the overflow is only reported if it happens when
+the values are treated as signed quantities. 'unsigned' is the same,
+except that the values are treated as unsigned quantities. 'either'
+means that overflow is reported for either signed or unsigned
+overflow.