Paul Edwards wrote:
> int
> i370_branch_dest (branch)
> rtx branch;
> {
> rtx dest = SET_SRC (PATTERN (branch));
> int dest_uid;
> int dest_addr;
>
> /* first, compute the estimated address of the branch target */
> if (GET_CODE (dest) == IF_THEN_ELSE)
> dest = XEXP (dest, 1);
> dest = XEXP (dest, 0);
This is set up only to handle direct branches of the form
(set (pc) (label_ref ...))
and indirect branches of the form
(set (pc) (if_then_else (...) (label_ref ...) (pc)))
but *not* indirect branches of the form
(set (pc) (if_then_else (...) (pc) (label_ref ...)))
This latter form is accepted by the "negated conditional
jump instructions in the i370.md file, like so:
(define_insn ""
[(set (pc)
(if_then_else (eq (cc0)
(const_int 0))
(pc)
(label_ref (match_operand 0 "" ""))))
; (clobber (reg:SI 14))
]
""
"*
{
check_label_emit ();
mvs_check_page (0, 4, 0);
if (i370_short_branch(insn) || mvs_check_label (CODE_LABEL_NUMBER
(operands[0])))
{
Therefore, the i370_branch_dest routine needs to handle
those as well. Probably something along the following lines:
if (GET_CODE (dest) == IF_THEN_ELSE)
{
if (GET_CODE (XEXP (dest, 1) == LABEL_REF)
dest = XEXP (dest, 1);
else
dest = XEXP (dest, 2);
}
gcc_assert (GET_CODE (dest) == LABEL_REF);
dest = XEXP (dest, 0);
Bye,
Ulrich
--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
[email protected]