[Bug c/25731] New: Complex values passed in wrong registers

danglin at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Tue Jan 10 00:51:00 GMT 2006


extern int foo (float _Complex);
int
main ()
{
  float _Complex z;

  __real__ z = 0.0;
  __imag__ z = -1.0;
  return foo (z);
}

gcc -S -O2 complex.c

        .LEVEL 1.1
        .section        .rodata.cst4,"aM",@progbits,4
        .align 4
.LC0:
        .word   -1082130432
        .text
        .align 4
.globl main
        .type   main, @function
main:
        .PROC
        .CALLINFO FRAME=64,CALLS,SAVE_RP
        .ENTRY
        stw %r2,-20(%r30)
        ldo 64(%r30),%r30
        ldw -84(%r30),%r2
        fcpy,sgl %fr0,%fr5L
        ldil LR'.LC0,%r19
        ldo RR'.LC0(%r19),%r19
        fldws 0(%r19),%fr5R
        bl foo,%r0
        ldo -64(%r30),%r30
        nop
        .PROCEND
        .size   main, .-main
        .ident  "GCC: (GNU) 3.3.4"

The complex value is being passed in fr5L and fr5R.  Although there is no
definitive guidelines in the HP runtime documentation regarding how complex
values should be passed on the PA-RISC architecture, my contacts at HP
indicate complex values should be treated as aggregates and therefore should
be passed in the general registers for float _Complex in the 32-bit runtime.
double and long double _Complex should be passed by reference since aggregates
larger than 64-bits are passed by reference.

In the 64-bit runtime, they should be passed in the same manner as aggregates
(i.e., in the general registers).  There is a mention of homogenous floating
point aggregates in the 64-bit runtime documentation but, unlike ia64, this was
not implemented in HP PA64 compilers.


-- 
           Summary: Complex values passed in wrong registers
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: danglin at gcc dot gnu dot org
 GCC build triplet: hppa*-*-*
  GCC host triplet: hppa*-*-*
GCC target triplet: hppa*-*-*


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=25731




More information about the Gcc-bugs mailing list