This is the mail archive of the mailing list for the GCC project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Only allow e500 double in SPE_SIMD_REGNO_P registers

On Fri, Oct 24, 2014 at 7:09 PM, Joseph S. Myers
<> wrote:
> rs6000_hard_regno_nregs_internal allows SPE vectors in single
> registers satisfying SPE_SIMD_REGNO_P (i.e. register numbers 0 to
> 31).  However, the corresponding test for e500 double treats all
> registers as being able to store a 64-bit value, rather than just
> those GPRs.
> Logically this inconsistency is wrong; in addition, it causes problems
> unwinding from signal handlers.  linux-unwind.h uses
> ARG_POINTER_REGNUM as a place to store the return address from a
> signal handler, but this logic in rs6000_hard_regno_nregs_internal
> results in that being considered an 8-byte register, resulting in
> assertion failures.
> (<> first
> needs to be applied for unwinding to work in general on e500.)  This
> patch makes rs6000_hard_regno_nregs_internal handle the e500 double
> case consistently with SPE vectors.
> Tested with no regressions with cross to powerpc-linux-gnuspe (given
> the aforementioned patch applied).  Failures of signal handling
> unwinding tests such as gcc.dg/cleanup-{8,9,10,11}.c are fixed by this
> patch.  OK to commit?
> 2014-10-24  Joseph Myers  <>
>         * config/rs6000/rs6000.c (rs6000_hard_regno_nregs_internal): Do
>         not allow e500 double in registers not satisyfing
>         SPE_SIMD_REGNO_P.


Thanks, David

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]