In the rs6000 port, FLOAT_REGS can contain DImode values when compiling for 64-bit targets. Some instructions (like "fcfid" in the testcase, convert from integer to DP float) only work on floating point registers. So, we do want to allow DImode in these regs. Now, in unusual cases IRA will assign FLOAT_REGS to some allocno where some insns cannot handle FLOAT_REGS there, so they will need a reload. Maybe IRA can be made smarter, but it isn't doing anything wrong here, so we should be able to handle it. The place it goes wrong is in the output of the *ctrdi_internal[1256] pattern: the "bdz" and "bdnz" instructions. GCC refuses to do output reloads on JUMP_INSNs, probably because it is hard to do, needs different strategies than "normal" reloads do, and it cannot even be done at all for general patterns. So JUMP_INSNs need to be able to handle every possible output for the register class used. These patterns already handle writing to "c" (the base insn case), and to "r", "m", and "c" or "l"; all those via splitters. We just need to handle "d" as well. That is what this patch does. [A predicate in one of the splitters needs to be touched up so that the correct splitter is used for the FLOAT_REGS case.] But, that leaves another problem. One of the insns that are split to is a move from a GPR to an FPR. That work fine on targets with direct move (which does exactly that), i.e. power8 and up. But older targets need memory to do the move, and this splitter runs after reload so it cannot allocate memory; and allocating memory beforehand for every bdnz insn is pretty horrible as well. This patch implements the easy part. With it, power8 works, where it didn't before. PR target/70098 * config/rs6000/rs6000.md (*ctr<mode>_internal1, *ctr<mode>_internal2, *ctr<mode>_internal5, *ctr<mode>_internal6): Also allow "d" as output. (define_split for the GPR case): Use int_reg_operand instead of gpc_reg_operand for the output. gcc/testsuite/ PR target/70098 * lib/target-supports.exp (check_effective_target_powerpc64_no_dm): New function. * g++.dg/pr70098.C: New testcase. From-SVN: r234181
Name |
Last commit
|
Last update |
---|---|---|
INSTALL | Loading commit data... | |
boehm-gc | Loading commit data... | |
config | Loading commit data... | |
contrib | Loading commit data... | |
fixincludes | Loading commit data... | |
gcc | Loading commit data... | |
gnattools | Loading commit data... | |
gotools | Loading commit data... | |
include | Loading commit data... | |
intl | Loading commit data... | |
libada | Loading commit data... | |
libatomic | Loading commit data... | |
libbacktrace | Loading commit data... | |
libcc1 | Loading commit data... | |
libcilkrts | Loading commit data... | |
libcpp | Loading commit data... | |
libdecnumber | Loading commit data... | |
libffi | Loading commit data... | |
libgcc | Loading commit data... | |
libgfortran | Loading commit data... | |
libgo | Loading commit data... | |
libgomp | Loading commit data... | |
libiberty | Loading commit data... | |
libitm | Loading commit data... | |
libjava | Loading commit data... | |
libmpx | Loading commit data... | |
libobjc | Loading commit data... | |
liboffloadmic | Loading commit data... | |
libquadmath | Loading commit data... | |
libsanitizer | Loading commit data... | |
libssp | Loading commit data... | |
libstdc++-v3 | Loading commit data... | |
libvtv | Loading commit data... | |
lto-plugin | Loading commit data... | |
maintainer-scripts | Loading commit data... | |
zlib | Loading commit data... | |
.dir-locals.el | Loading commit data... | |
.gitignore | Loading commit data... | |
ABOUT-NLS | Loading commit data... | |
COPYING | Loading commit data... | |
COPYING.LIB | Loading commit data... | |
COPYING.RUNTIME | Loading commit data... | |
COPYING3 | Loading commit data... | |
COPYING3.LIB | Loading commit data... | |
ChangeLog | Loading commit data... | |
ChangeLog.jit | Loading commit data... | |
ChangeLog.tree-ssa | Loading commit data... | |
MAINTAINERS | Loading commit data... | |
Makefile.def | Loading commit data... | |
Makefile.in | Loading commit data... | |
Makefile.tpl | Loading commit data... | |
README | Loading commit data... | |
compile | Loading commit data... | |
config-ml.in | Loading commit data... | |
config.guess | Loading commit data... | |
config.rpath | Loading commit data... | |
config.sub | Loading commit data... | |
configure | Loading commit data... | |
configure.ac | Loading commit data... | |
depcomp | Loading commit data... | |
install-sh | Loading commit data... | |
libtool-ldflags | Loading commit data... | |
libtool.m4 | Loading commit data... | |
ltgcc.m4 | Loading commit data... | |
ltmain.sh | Loading commit data... | |
ltoptions.m4 | Loading commit data... | |
ltsugar.m4 | Loading commit data... | |
ltversion.m4 | Loading commit data... | |
lt~obsolete.m4 | Loading commit data... | |
missing | Loading commit data... | |
mkdep | Loading commit data... | |
mkinstalldirs | Loading commit data... | |
move-if-change | Loading commit data... | |
symlink-tree | Loading commit data... | |
ylwrap | Loading commit data... |