return TYPE_NONE;
}
+/* Return attribute relative_long of insn. */
+
+static bool
+s390_safe_relative_long_p (rtx_insn *insn)
+{
+ if (recog_memoized (insn) >= 0)
+ return get_attr_relative_long (insn) == RELATIVE_LONG_YES;
+ else
+ return false;
+}
+
/* Return true if DISP is a valid short displacement. */
static bool
return 4;
}
-/* Annotate every literal pool reference in X by an UNSPEC_LTREF expression.
- Fix up MEMs as required. */
-
static void
-annotate_constant_pool_refs (rtx *x)
+annotate_constant_pool_refs_1 (rtx *x)
{
int i, j;
const char *fmt;
{
if (fmt[i] == 'e')
{
- annotate_constant_pool_refs (&XEXP (*x, i));
+ annotate_constant_pool_refs_1 (&XEXP (*x, i));
}
else if (fmt[i] == 'E')
{
for (j = 0; j < XVECLEN (*x, i); j++)
- annotate_constant_pool_refs (&XVECEXP (*x, i, j));
+ annotate_constant_pool_refs_1 (&XVECEXP (*x, i, j));
}
}
}
-/* Find an annotated literal pool symbol referenced in RTX X,
- and store it at REF. Will abort if X contains references to
- more than one such pool symbol; multiple references to the same
- symbol are allowed, however.
+/* Annotate every literal pool reference in INSN by an UNSPEC_LTREF expression.
+ Fix up MEMs as required.
+ Skip insns which support relative addressing, because they do not use a base
+ register. */
- The rtx pointed to by REF must be initialized to NULL_RTX
- by the caller before calling this routine. */
+static void
+annotate_constant_pool_refs (rtx_insn *insn)
+{
+ if (s390_safe_relative_long_p (insn))
+ return;
+ annotate_constant_pool_refs_1 (&PATTERN (insn));
+}
static void
-find_constant_pool_ref (rtx x, rtx *ref)
+find_constant_pool_ref_1 (rtx x, rtx *ref)
{
int i, j;
const char *fmt;
{
if (fmt[i] == 'e')
{
- find_constant_pool_ref (XEXP (x, i), ref);
+ find_constant_pool_ref_1 (XEXP (x, i), ref);
}
else if (fmt[i] == 'E')
{
for (j = 0; j < XVECLEN (x, i); j++)
- find_constant_pool_ref (XVECEXP (x, i, j), ref);
+ find_constant_pool_ref_1 (XVECEXP (x, i, j), ref);
}
}
}
-/* Replace every reference to the annotated literal pool
- symbol REF in X by its base plus OFFSET. */
+/* Find an annotated literal pool symbol referenced in INSN,
+ and store it at REF. Will abort if INSN contains references to
+ more than one such pool symbol; multiple references to the same
+ symbol are allowed, however.
+
+ The rtx pointed to by REF must be initialized to NULL_RTX
+ by the caller before calling this routine.
+
+ Skip insns which support relative addressing, because they do not use a base
+ register. */
+
+static void
+find_constant_pool_ref (rtx_insn *insn, rtx *ref)
+{
+ if (s390_safe_relative_long_p (insn))
+ return;
+ find_constant_pool_ref_1 (PATTERN (insn), ref);
+}
static void
-replace_constant_pool_ref (rtx *x, rtx ref, rtx offset)
+replace_constant_pool_ref_1 (rtx *x, rtx ref, rtx offset)
{
int i, j;
const char *fmt;
{
if (fmt[i] == 'e')
{
- replace_constant_pool_ref (&XEXP (*x, i), ref, offset);
+ replace_constant_pool_ref_1 (&XEXP (*x, i), ref, offset);
}
else if (fmt[i] == 'E')
{
for (j = 0; j < XVECLEN (*x, i); j++)
- replace_constant_pool_ref (&XVECEXP (*x, i, j), ref, offset);
+ replace_constant_pool_ref_1 (&XVECEXP (*x, i, j), ref, offset);
}
}
}
+/* Replace every reference to the annotated literal pool
+ symbol REF in INSN by its base plus OFFSET.
+ Skip insns which support relative addressing, because they do not use a base
+ register. */
+
+static void
+replace_constant_pool_ref (rtx_insn *insn, rtx ref, rtx offset)
+{
+ if (s390_safe_relative_long_p (insn))
+ return;
+ replace_constant_pool_ref_1 (&PATTERN (insn), ref, offset);
+}
+
/* We keep a list of constants which we have to add to internal
constant tables in the middle of large functions. */
if (NONJUMP_INSN_P (insn) || CALL_P (insn))
{
rtx pool_ref = NULL_RTX;
- find_constant_pool_ref (PATTERN (insn), &pool_ref);
+ find_constant_pool_ref (insn, &pool_ref);
if (pool_ref)
{
rtx constant = get_pool_constant (pool_ref);
if (NONJUMP_INSN_P (insn) || CALL_P (insn))
{
rtx addr, pool_ref = NULL_RTX;
- find_constant_pool_ref (PATTERN (insn), &pool_ref);
+ find_constant_pool_ref (insn, &pool_ref);
if (pool_ref)
{
if (s390_execute_label (insn))
addr = s390_find_constant (pool, get_pool_constant (pool_ref),
get_pool_mode (pool_ref));
- replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
+ replace_constant_pool_ref (insn, pool_ref, addr);
INSN_CODE (insn) = -1;
}
}
if (NONJUMP_INSN_P (insn) || CALL_P (insn))
{
rtx pool_ref = NULL_RTX;
- find_constant_pool_ref (PATTERN (insn), &pool_ref);
+ find_constant_pool_ref (insn, &pool_ref);
if (pool_ref)
{
rtx constant = get_pool_constant (pool_ref);
if (NONJUMP_INSN_P (insn) || CALL_P (insn))
{
rtx addr, pool_ref = NULL_RTX;
- find_constant_pool_ref (PATTERN (insn), &pool_ref);
+ find_constant_pool_ref (insn, &pool_ref);
if (pool_ref)
{
if (s390_execute_label (insn))
get_pool_constant (pool_ref),
get_pool_mode (pool_ref));
- replace_constant_pool_ref (&PATTERN (insn), pool_ref, addr);
+ replace_constant_pool_ref (insn, pool_ref, addr);
INSN_CODE (insn) = -1;
}
}
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
if (INSN_P (insn))
{
- annotate_constant_pool_refs (&PATTERN (insn));
+ annotate_constant_pool_refs (insn);
df_insn_rescan (insn);
}
return 0;
static rtx
s390_prologue_plus_offset (rtx target, rtx reg, rtx offset, bool frame_related_p)
{
- rtx insn;
+ rtx_insn *insn;
rtx orig_offset = offset;
gcc_assert (REG_P (target));
if (!CONST_INT_P (offset))
{
- annotate_constant_pool_refs (&PATTERN (insn));
+ annotate_constant_pool_refs (insn);
if (frame_related_p)
add_reg_note (insn, REG_FRAME_RELATED_EXPR,
rtx_insn *insns = s390_load_got ();
for (rtx_insn *insn = insns; insn; insn = NEXT_INSN (insn))
- annotate_constant_pool_refs (&PATTERN (insn));
+ annotate_constant_pool_refs (insn);
emit_insn (insns);
}
}
else
{
- rtx insn, frame_off, cfa;
+ rtx_insn *insn;
+ rtx frame_off, cfa;
offset = area_bottom < 0 ? -area_bottom : 0;
frame_off = GEN_INT (cfun_frame_layout.frame_size - offset);
gen_rtx_PLUS (Pmode, frame_pointer, frame_off));
if (DISP_IN_RANGE (INTVAL (frame_off)))
{
- insn = gen_rtx_SET (frame_pointer,
- gen_rtx_PLUS (Pmode, frame_pointer, frame_off));
- insn = emit_insn (insn);
+ rtx set;
+
+ set = gen_rtx_SET (frame_pointer,
+ gen_rtx_PLUS (Pmode, frame_pointer, frame_off));
+ insn = emit_insn (set);
}
else
{
frame_off = force_const_mem (Pmode, frame_off);
insn = emit_insn (gen_add2_insn (frame_pointer, frame_off));
- annotate_constant_pool_refs (&PATTERN (insn));
+ annotate_constant_pool_refs (insn);
}
add_reg_note (insn, REG_CFA_ADJUST_CFA, cfa);
RTX_FRAME_RELATED_P (insn) = 1;