http://gcc.gnu.org/bugzilla/show_bug.cgi?id=47782
--- Comment #2 from Paulo J. Matos <Paulo.Matos at csr dot com> 2011-02-17
14:56:45 UTC ---
Just a note to this... this bug assumes that cbranch<mode>4 is _not_
implemented. If cbranch<mode>4 is not an optional standard name to implement
then this bug is invalid, but we should document this requirement somewhere.
I just noticed that optabs.h has the comment before can_compare_p:
/* Nonzero if a compare of mode MODE can be done straightforwardly
(without splitting it into pieces). */
extern int can_compare_p (enum rtx_code, enum machine_mode,
enum can_compare_purpose);
By this I assume that cbranch should be implemented if there is an instruction
that performs a compare and branch in one go without ''splitting it into
pieces''. However, by looking at the vax case (which I think it does not have
such an intruction) cbranch is implemented as:
(define_expand "cbranch<mode>4"
[(set (cc0)
(compare (match_operand:VAXint 1 "nonimmediate_operand" "")
(match_operand:VAXint 2 "general_operand" "")))
(set (pc)
(if_then_else
(match_operator 0 "ordered_comparison_operator" [(cc0)
(const_int 0)])
(label_ref (match_operand 3 "" ""))
(pc)))]
"")
which ends up expanding it into multiple insns...
I can do the same on my side. However, that makes cbranch non-optional which is
not-documented and breaks backward compatibility (in the sense that in previous
gcc versions the lack of a cbranch implementation didn't seem to trigger any
strange bug).