[parisc-linux] floating point calling convention on pa

Randolph Chung Randolph Chung <randolph@tausq.org>
Sat, 19 Apr 2003 18:12:56 -0700

Hi all,

I'm trying to understand the FP argument passing convention on 32-bit
palinux... I don't think I have it quite right. Can anyone comment on
the following?

1) float-type arguments
   float add(float a, float b, float c, float d)
        a -> fr4L
        b -> fr5L
        c -> fr6L
        d -> fr7L
        retval = fr4L

   If >4 arguments, the rest are passed on the stack
   starting at sp-52 in the caller's frame

2) double-type arguments
   double add(double a, double b, double c, double d)
        a -> fr5
        b -> fr7
        c -> sp-56 in caller frame
        d -> sp-64 in caller frame
        retval = fr4

   Is it correct that the high-order 32-bit of fr5 is in fr5L
   and the lower bits in fr5R?

3) What happens when you have a mix argument function? e.g.
   double foo(int a, float b, double c)

        a -> r26
        b -> fr5L
        c -> fr7
        retval = fr4

   I don't quite understand the logic here :) What happens when
   there are more and they need to go on the stack? What's the 

I've looked through the SOM 32-bit runtime but (at least to me)
it doesn't talk about this very clearly. I've been experimenting with
gcc -S but I'd rather get a definitive answer :)

Also, for passing structures by value to functions, is this correct?
a) if sizeof(struct) <= 4, pass in register
b) if sizeof(struct) <= 8), pass in even-numbered register pairs 
c) if sizeof(struct) > 8, pass a pointer and callee will copy the

Randolph Chung
Debian GNU/Linux Developer, hppa/ia64 ports