--- Comment #8 from ebotcazou at gcc dot gnu dot org 2006-09-13 07:57
---
The removed comment says:
- /* If will do cse, generate all results into pseudo registers
- since 1) that allows cse to find more things
- and 2) otherwise cse could produce an insn the machine
- cannot support. An exception is a CONSTRUCTOR into a multi-word
- MEM: that's much more likely to be most efficient into the MEM.
- Another is a CALL_EXPR which must return in memory. */
So it looks like point 2 is true.
Except that CSE has not been run yet. :-)
The problem is that the ashrdi3 expander is not matched by existing insns in
the (MEM, MEM, CONST_INT) case. Either the predicates need to be tightened
or one of the operands needs to be forced to a register in the preparation
statements.
While you're at it, please delete the 3 bogus comments added by Jeff as part
of revision 24814:
(define_expand ashrdi3
[(set (match_operand:DI 0 nonimmediate_operand )
(ashiftrt:DI (match_operand:DI 1 general_operand )
(match_operand 2 const_int_operand )))]
!TARGET_COLDFIRE
{
/* ??? This is a named pattern like this is not allowed to FAIL based
on its operands. */
if (GET_CODE (operands[2]) != CONST_INT
|| ((INTVAL (operands[2]) 1 || INTVAL (operands[2]) 3)
INTVAL (operands[2]) != 8 INTVAL (operands[2]) != 16
(INTVAL (operands[2]) 31 || INTVAL (operands[2]) 63)))
FAIL;
} )
Of course expanders are allowed to fail in the preparation statements based
on their operands, that's precisely why FAIL exists! See the example in the
13.15 section of the internals manual.
--
ebotcazou at gcc dot gnu dot org changed:
What|Removed |Added
CC||ebotcazou at gcc dot gnu dot
||org
AssignedTo|ebotcazou at gcc dot gnu dot|unassigned at gcc dot gnu
|org |dot org
Status|ASSIGNED|NEW
Component|rtl-optimization|target
GCC host triplet|m68k-linux-gnu |
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28622