This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Long Double Register Spillage in PA Port
- To: Mark Klein <mklein at dis dot com>
- Subject: Re: Long Double Register Spillage in PA Port
- From: Jeffrey A Law <law at cygnus dot com>
- Date: Sun, 23 Jul 2000 20:58:50 -0600
- cc: gcc at gcc dot gnu dot org
- Reply-To: law at cygnus dot com
In message <4.2.0.58.20000723094340.00bcc7d0@garfield.dis.com>you write:
> Hi, Jeff.
>
> In my latest build (using the most recent snapshot), I get:
>
> ../../../libstdc++/std/ldcomplex.h: In method `complex<long
> double>::complex (long double, long double)':
> ../../../libstdc++/std/ldcomplex.h:39: Unable to find a register to
> spill in class `GENERAL_REGS'.
> ../../../libstdc++/std/ldcomplex.h:39: This is the insn:
> (insn 10 17 12 (set (subreg:SI (reg/v:TF 40 %fr8) 0)
> (mem/f:SI (reg/v:SI 19 %r19) 0)) 69 {pre_ldw-4} (nil)
> (nil))
> ../../../libstdc++/std/ldcomplex.h:39: Internal compiler error in `
> spill_failure', at reload1.c:1826
>
> Is this something you've seen in other PA ports, or could this
> be something just in my port?
Nope, I haven't seen that at all.
> I know that my function_args() was markedly different from yours
> before the PA64 additions and now I don't recognize it at all :-)
:-) It's marginally easier to read if you ignore the PA64 block.
> In my function_args, I needed to consider that (at least for
> the MPE port) arguments larger than 2 words were always passed
> in the stack, regardless of whether or not arg0-arg3 were
> available for the first long double. But, I don't see that is
> the case in the current function_args. Note that this is class
> GENERAL_REGS, so it appears that this might be the issue since
> this long double value should be loaded into the GENERAL_REGS.
See FUNCTION_ARG_PASS_BY_REFERENCE.
> "Any Larger Than 64 Bits: A short pointer (using sr5-sr7) to the
> high-order byte of the value is passed as a nonfloating-point
> 32-bit value parameter."
Same for hpux.
jeff