[RS6000] PR11848 rs6000_emit_move long double split
authorAlan Modra <amodra@gcc.gnu.org>
Thu, 29 Nov 2018 05:03:01 +0000 (15:33 +1030)
committerAlan Modra <amodra@gcc.gnu.org>
Thu, 29 Nov 2018 05:03:01 +0000 (15:33 +1030)
commit9caa6732f9aafd8335adda6e9a57239d1fed40cb
treeed29d449b143f1be411ef19248beb085ebf1cf11
parentaa74f2217d0686788889d357c46d666fcb8be87f
[RS6000] PR11848 rs6000_emit_move long double split

This split is disabled for power7 and up, so we don't often see its
bad effects.  However, on a powerpc-linux compiler (which defaults
to PPC750 judging from rs6000/sysv4.h) we see

long double ld1 (void) { return 1.0L; }

compiled with -msoft-float -O2 -S resulting in

ld1:
li 3,0
li 4,0
mr 6,4
mr 5,3
li 4,0
lis 3,0x3ff0
blr

Things go awry in init-regs, with the TFmode reg being initialized to
zero on seeing the subreg from the split.  (And that initialization
itself is split by rs6000_emit_move!)  Later passes apparently don't
clean up the rubbish.

Since the split was added for Darwin (as the comment says), let's get
rid of it on other targets.

* config/rs6000/rs6000.c (rs6000_emit_move): Disable long
double split for targets other than Darwin.

From-SVN: r266610
gcc/ChangeLog
gcc/config/rs6000/rs6000.c