@@ -4316,11 +4316,14 @@ emit_note_after (enum insn_note subtype, rtx after)
return note;
}
-/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
-rtx
-emit_insn_after_setloc (rtx pattern, rtx after, int loc)
+/* Insert PATTERN after AFTER, setting its INSN_LOCATION to LOC.
+ MAKE_RAW indicates how to turn PATTERN into a real insn. */
+
+static rtx
+emit_pattern_after_setloc (rtx pattern, rtx after, int loc,
+ rtx (*make_raw) (rtx))
{
- rtx last = emit_insn_after_noloc (pattern, after, NULL);
+ rtx last = emit_pattern_after_noloc (pattern, after, NULL, make_raw);
if (pattern == NULL_RTX || !loc)
return last;
@@ -4337,135 +4340,101 @@ emit_insn_after_setloc (rtx pattern, rtx after, int loc)
return last;
}
-/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
-rtx
-emit_insn_after (rtx pattern, rtx after)
+/* Insert PATTERN after AFTER. MAKE_RAW indicates how to turn PATTERN
+ into a real insn. SKIP_DEBUG_INSNS indicates whether to insert after
+ any DEBUG_INSNs. */
+
+static rtx
+emit_pattern_after (rtx pattern, rtx after, bool skip_debug_insns,
+ rtx (*make_raw) (rtx))
{
rtx prev = after;
- while (DEBUG_INSN_P (prev))
- prev = PREV_INSN (prev);
+ if (skip_debug_insns)
+ while (DEBUG_INSN_P (prev))
+ prev = PREV_INSN (prev);
if (INSN_P (prev))
- return emit_insn_after_setloc (pattern, after, INSN_LOCATOR (prev));
+ return emit_pattern_after_setloc (pattern, after, INSN_LOCATOR (prev),
+ make_raw);
else
- return emit_insn_after_noloc (pattern, after, NULL);
+ return emit_pattern_after_noloc (pattern, after, NULL, make_raw);
}
-/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to LOC. */
rtx
-emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
+emit_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_jump_insn_after_noloc (pattern, after);
+ return emit_pattern_after_setloc (pattern, after, loc, make_insn_raw);
+}
- if (pattern == NULL_RTX || !loc)
- return last;
+/* Like emit_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
+rtx
+emit_insn_after (rtx pattern, rtx after)
+{
+ return emit_pattern_after (pattern, after, true, make_insn_raw);
+}
- after = NEXT_INSN (after);
- while (1)
- {
- if (active_insn_p (after) && !INSN_LOCATOR (after))
- INSN_LOCATOR (after) = loc;
- if (after == last)
- break;
- after = NEXT_INSN (after);
- }
- return last;
+/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to LOC. */
+rtx
+emit_jump_insn_after_setloc (rtx pattern, rtx after, int loc)
+{
+ return emit_pattern_after_setloc (pattern, after, loc, make_jump_insn_raw);
}
/* Like emit_jump_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
rtx
emit_jump_insn_after (rtx pattern, rtx after)
{
- rtx prev = after;
-
- while (DEBUG_INSN_P (prev))
- prev = PREV_INSN (prev);
-
- if (INSN_P (prev))
- return emit_jump_insn_after_setloc (pattern, after, INSN_LOCATOR (prev));
- else
- return emit_jump_insn_after_noloc (pattern, after);
+ return emit_pattern_after (pattern, after, true, make_jump_insn_raw);
}
-/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to LOC. */
rtx
emit_call_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_call_insn_after_noloc (pattern, after);
-
- if (pattern == NULL_RTX || !loc)
- return last;
-
- after = NEXT_INSN (after);
- while (1)
- {
- if (active_insn_p (after) && !INSN_LOCATOR (after))
- INSN_LOCATOR (after) = loc;
- if (after == last)
- break;
- after = NEXT_INSN (after);
- }
- return last;
+ return emit_pattern_after_setloc (pattern, after, loc, make_call_insn_raw);
}
/* Like emit_call_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
rtx
emit_call_insn_after (rtx pattern, rtx after)
{
- rtx prev = after;
-
- while (DEBUG_INSN_P (prev))
- prev = PREV_INSN (prev);
-
- if (INSN_P (prev))
- return emit_call_insn_after_setloc (pattern, after, INSN_LOCATOR (prev));
- else
- return emit_call_insn_after_noloc (pattern, after);
+ return emit_pattern_after (pattern, after, true, make_call_insn_raw);
}
-/* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to SCOPE. */
+/* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to LOC. */
rtx
emit_debug_insn_after_setloc (rtx pattern, rtx after, int loc)
{
- rtx last = emit_debug_insn_after_noloc (pattern, after);
-
- if (pattern == NULL_RTX || !loc)
- return last;
-
- after = NEXT_INSN (after);
- while (1)
- {
- if (active_insn_p (after) && !INSN_LOCATOR (after))
- INSN_LOCATOR (after) = loc;
- if (after == last)
- break;
- after = NEXT_INSN (after);
- }
- return last;
+ return emit_pattern_after_setloc (pattern, after, loc, make_debug_insn_raw);
}
/* Like emit_debug_insn_after_noloc, but set INSN_LOCATOR according to AFTER. */
rtx
emit_debug_insn_after (rtx pattern, rtx after)
{
- if (INSN_P (after))
- return emit_debug_insn_after_setloc (pattern, after, INSN_LOCATOR (after));
- else
- return emit_debug_insn_after_noloc (pattern, after);
+ return emit_pattern_after (pattern, after, false, make_debug_insn_raw);
}
-/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to SCOPE. */
-rtx
-emit_insn_before_setloc (rtx pattern, rtx before, int loc)
+/* Insert PATTERN before BEFORE, setting its INSN_LOCATION to LOC.
+ MAKE_RAW indicates how to turn PATTERN into a real insn. INSNP
+ indicates if PATTERN is meant for an INSN as opposed to a JUMP_INSN,
+ CALL_INSN, etc. */
+
+static rtx
+emit_pattern_before_setloc (rtx pattern, rtx before, int loc, bool insnp,
+ rtx (*make_raw) (rtx))
{
rtx first = PREV_INSN (before);
- rtx last = emit_insn_before_noloc (pattern, before, NULL);
+ rtx last = emit_pattern_before_noloc (pattern, before,
+ insnp ? before : NULL_RTX,
+ NULL, make_raw);
- if (pattern == NULL_RTX || !loc)
+ if (pattern == NULL_RTX || (!loc && insnp))
return last;
- if (!first)
+ if (!first && insnp)
first = get_insns ();
else
first = NEXT_INSN (first);
@@ -4480,127 +4449,93 @@ emit_insn_before_setloc (rtx pattern, rtx before, int loc)
return last;
}
-/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */
-rtx
-emit_insn_before (rtx pattern, rtx before)
+/* Insert PATTERN before BEFORE. MAKE_RAW indicates how to turn PATTERN
+ into a real insn. SKIP_DEBUG_INSNS indicates whether to insert
+ before any DEBUG_INSNs. INSNP indicates if PATTERN is meant for an
+ INSN as opposed to a JUMP_INSN, CALL_INSN, etc. */
+
+static rtx
+emit_pattern_before (rtx pattern, rtx before, bool skip_debug_insns,
+ bool insnp, rtx (*make_raw) (rtx))
{
rtx next = before;
- while (DEBUG_INSN_P (next))
- next = PREV_INSN (next);
+ if (skip_debug_insns)
+ while (DEBUG_INSN_P (next))
+ next = PREV_INSN (next);
if (INSN_P (next))
- return emit_insn_before_setloc (pattern, before, INSN_LOCATOR (next));
+ return emit_pattern_before_setloc (pattern, before, INSN_LOCATOR (next),
+ insnp, make_raw);
else
- return emit_insn_before_noloc (pattern, before, NULL);
+ return emit_pattern_before_noloc (pattern, before,
+ insnp ? before : NULL_RTX,
+ NULL, make_raw);
}
-/* like emit_insn_before_noloc, but set insn_locator according to scope. */
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */
rtx
-emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
+emit_insn_before_setloc (rtx pattern, rtx before, int loc)
{
- rtx first = PREV_INSN (before);
- rtx last = emit_jump_insn_before_noloc (pattern, before);
+ return emit_pattern_before_setloc (pattern, before, loc, true,
+ make_insn_raw);
+}
- if (pattern == NULL_RTX)
- return last;
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */
+rtx
+emit_insn_before (rtx pattern, rtx before)
+{
+ return emit_pattern_before (pattern, before, true, true, make_insn_raw);
+}
- first = NEXT_INSN (first);
- while (1)
- {
- if (active_insn_p (first) && !INSN_LOCATOR (first))
- INSN_LOCATOR (first) = loc;
- if (first == last)
- break;
- first = NEXT_INSN (first);
- }
- return last;
+/* like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */
+rtx
+emit_jump_insn_before_setloc (rtx pattern, rtx before, int loc)
+{
+ return emit_pattern_before_setloc (pattern, before, loc, false,
+ make_jump_insn_raw);
}
/* Like emit_jump_insn_before_noloc, but set INSN_LOCATOR according to BEFORE. */
rtx
emit_jump_insn_before (rtx pattern, rtx before)
{
- rtx next = before;
-
- while (DEBUG_INSN_P (next))
- next = PREV_INSN (next);
-
- if (INSN_P (next))
- return emit_jump_insn_before_setloc (pattern, before, INSN_LOCATOR (next));
- else
- return emit_jump_insn_before_noloc (pattern, before);
+ return emit_pattern_before (pattern, before, true, false,
+ make_jump_insn_raw);
}
-/* like emit_insn_before_noloc, but set insn_locator according to scope. */
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */
rtx
emit_call_insn_before_setloc (rtx pattern, rtx before, int loc)
{
- rtx first = PREV_INSN (before);
- rtx last = emit_call_insn_before_noloc (pattern, before);
-
- if (pattern == NULL_RTX)
- return last;
-
- first = NEXT_INSN (first);
- while (1)
- {
- if (active_insn_p (first) && !INSN_LOCATOR (first))
- INSN_LOCATOR (first) = loc;
- if (first == last)
- break;
- first = NEXT_INSN (first);
- }
- return last;
+ return emit_pattern_before_setloc (pattern, before, loc, false,
+ make_call_insn_raw);
}
-/* like emit_call_insn_before_noloc,
- but set insn_locator according to before. */
+/* Like emit_call_insn_before_noloc,
+ but set insn_locator according to BEFORE. */
rtx
emit_call_insn_before (rtx pattern, rtx before)
{
- rtx next = before;
-
- while (DEBUG_INSN_P (next))
- next = PREV_INSN (next);
-
- if (INSN_P (next))
- return emit_call_insn_before_setloc (pattern, before, INSN_LOCATOR (next));
- else
- return emit_call_insn_before_noloc (pattern, before);
+ return emit_pattern_before (pattern, before, true, false,
+ make_call_insn_raw);
}
-/* like emit_insn_before_noloc, but set insn_locator according to scope. */
+/* Like emit_insn_before_noloc, but set INSN_LOCATOR according to LOC. */
rtx
emit_debug_insn_before_setloc (rtx pattern, rtx before, int loc)
{
- rtx first = PREV_INSN (before);
- rtx last = emit_debug_insn_before_noloc (pattern, before);
-
- if (pattern == NULL_RTX)
- return last;
-
- first = NEXT_INSN (first);
- while (1)
- {
- if (active_insn_p (first) && !INSN_LOCATOR (first))
- INSN_LOCATOR (first) = loc;
- if (first == last)
- break;
- first = NEXT_INSN (first);
- }
- return last;
+ return emit_pattern_before_setloc (pattern, before, loc, false,
+ make_debug_insn_raw);
}
-/* like emit_debug_insn_before_noloc,
- but set insn_locator according to before. */
+/* Like emit_debug_insn_before_noloc,
+ but set insn_locator according to BEFORE. */
rtx
emit_debug_insn_before (rtx pattern, rtx before)
{
- if (INSN_P (before))
- return emit_debug_insn_before_setloc (pattern, before, INSN_LOCATOR (before));
- else
- return emit_debug_insn_before_noloc (pattern, before);
+ return emit_pattern_before (pattern, before, false, false,
+ make_debug_insn_raw);
}
/* Take X and emit it at the end of the doubly-linked