On Tue, Jun 02, 2015 at 08:49:37AM +0930, Alan Modra wrote: > > > In and<mode>3 expander I think you want the following since > > > and64_2_operand covers the extra double-rotate cases, not all DImode. > > > > > > - if ((<MODE>mode == DImode && !and64_2_operand (operands[2], > > > <MODE>mode)) > > > - || (<MODE>mode != DImode && !and_operand (operands[2], > > > <MODE>mode))) > > > + if (!and_operand (operands[2], <MODE>mode) > > > + && (<MODE>mode != DImode || !and64_2_operand (operands[2], > > > <MODE>mode))) > > > > and64_2_operand includes all of and_operand. I agree it is a mess. > > but and64_2_operand doesn't include all of and_operand!
Maybe I'm slow today, but I don't see it? Do you have an example? > > > get rid of WORD_REGISTER_OPERATIONS, > > > > rs6000 should not define it. What e.g. does it mean for mullw? Or, > > worse, mulhw? Pretty much anything with "w" in its name is problematic. > > In many places WORD_REGISTER_OPERATIONS is used, it is saying "don't > trust the high bits". At the moment we definitely do need it defined! I don't see that either; do you have a pointer for me? I've run some bootstraps and tests with WORD_REGISTER_OPERATIONS undefined: 32-bit code becomes very slightly bigger, and 64-bit code becomes slightly smaller. No change in testresults. Segher