On Sat, Mar 12, 2016 at 8:55 AM, Segher Boessenkool <seg...@kernel.crashing.org> wrote: > 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. > > Tested on powerpc64-linux, -m32 and -m64, -mlra and -mno-lra. Also > regstrapping on a power8 powerpc64le-linux. Is this okay for trunk > if that works as expected? > > > Segher > > > 2016-03-12 Segher Boessenkool <seg...@kernel.crashing.org> > > 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 > * g++.dg/pr70098.C: New testcase.
This is okay. The testcase will need some XFAILs. Thanks, David