Subject: Re: DEC/MIPS ABI and small structs?
To: Andrew Cagney <ac131313@cygnus.com>
From: Simon Burge <simonb@wasabisystems.com>
List: port-pmax
Date: 07/16/2001 07:56:16
Andrew Cagney wrote:
> Hello,
>
> I'm trying to find a little history on the original ABI used by DEC on
> the PMAX (little endian MIPS) machines.
>
> I'm firstly wondering what the abi is correctly called.
COFF.
> Second, according to the ABI, how should small structs be passed vis:
>
> struct c1 { char c; };
> void foo (struct c1 c1);
I don't have an ABI document, but both appear to be passed on the stack.
Here's the assembly output of the a simple C program (source included in
the asm- more assemblers should do this :-):
.verstamp 3 0
.extern c1 1
.extern foo 1
.text
.align 2
.file 2 "foo.c"
.globl main
.loc 2 5
# 1 struct c1 { char c; };
# 2 struct foo { struct c1 c1 };
# 3
# 4 main()
# 5 {
.ent main 2
main:
.option O1
subu $sp, 32
sw $31, 28($sp)
.mask 0x80000000, -4
.frame $sp, 32, $31
.loc 2 5
.loc 2 9
# 6 extern struct c1 c1;
# 7 extern struct foo foo;
# 8
# 9 bar1(c1);
lbu $14, c1
sb $14, 0($sp)
lw $4, 0($sp)
.livereg 0x0800000E,0x00000000
jal bar1
.loc 2 10
# 10 bar2(foo);
lbu $15, foo
sb $15, 0($sp)
lw $4, 0($sp)
.livereg 0x0800000E,0x00000000
jal bar2
.loc 2 11
# 11 }
move $2, $0
.livereg 0x2000FF0E,0x00000FFF
lw $31, 28($sp)
addu $sp, 32
j $31
.end main
Making the variables automatic just changes the "lbu" to references the
stack instead of external storage.
Simon.
--
Simon Burge <simonb@wasabisystems.com>
NetBSD CDs, Support and Service: http://www.wasabisystems.com/