aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/sh/sh.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/sh/sh.c')
-rw-r--r--gcc/config/sh/sh.c34
1 files changed, 8 insertions, 26 deletions
diff --git a/gcc/config/sh/sh.c b/gcc/config/sh/sh.c
index 41c5ac5ecac..feca33e1b22 100644
--- a/gcc/config/sh/sh.c
+++ b/gcc/config/sh/sh.c
@@ -2641,7 +2641,7 @@ fixup_addr_diff_vecs (first)
for (insn = first; insn; insn = NEXT_INSN (insn))
{
- rtx vec_lab, pat, prev, prevpat, x;
+ rtx vec_lab, pat, prev, prevpat, x, braf_label;
if (GET_CODE (insn) != JUMP_INSN
|| GET_CODE (PATTERN (insn)) != ADDR_DIFF_VEC)
@@ -2664,10 +2664,15 @@ fixup_addr_diff_vecs (first)
if (GET_CODE (x) == LABEL_REF && XEXP (x, 0) == vec_lab)
break;
}
+
+ /* Emit the reference label of the braf where it belongs, right after
+ the casesi_jump_2 (i.e. braf). */
+ braf_label = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);
+ emit_label_after (braf_label, prev);
+
/* Fix up the ADDR_DIF_VEC to be relative
to the reference address of the braf. */
- XEXP (XEXP (pat, 0), 0)
- = XEXP (XEXP (SET_SRC (XVECEXP (prevpat, 0, 0)), 1), 0);
+ XEXP (XEXP (pat, 0), 0) = braf_label;
}
}
@@ -4304,29 +4309,6 @@ fp_one_operand (op)
}
int
-braf_label_ref_operand(op, mode)
- rtx op;
- enum machine_mode mode;
-{
- rtx prev;
-
- if (GET_CODE (op) != LABEL_REF)
- return 0;
- prev = prev_real_insn (XEXP (op, 0));
- if (GET_CODE (prev) != JUMP_INSN)
- return 0;
- prev = PATTERN (prev);
- if (GET_CODE (prev) != PARALLEL || XVECLEN (prev, 0) != 2)
- return 0;
- prev = XVECEXP (prev, 0, 0);
- if (GET_CODE (prev) != SET)
- return 0;
- prev = SET_SRC (prev);
- if (GET_CODE (prev) != PLUS || XEXP (prev, 1) != op)
- return 0;
-}
-
-int
tertiary_reload_operand (op, mode)
rtx op;
enum machine_mode mode;