summaryrefslogtreecommitdiff
path: root/gcc/emit-rtl.c
diff options
context:
space:
mode:
authorfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-01 03:05:36 +0000
committerfroydnj <froydnj@138bc75d-0d04-0410-961f-82ee72b054a4>2011-04-01 03:05:36 +0000
commitede4ebcba34f451dacde5f69f76f88025089be03 (patch)
tree056922fddb5abdf25ba44398cd0e5e5916e652f6 /gcc/emit-rtl.c
parent1bc6c1062c73bf1c4517b26f14f5eea026298248 (diff)
downloadgcc-ede4ebcba34f451dacde5f69f76f88025089be03.tar.gz
* emit-rtl.c (emit_pattern_after_setloc): New function.
(emit_insn_after_setloc, emit_jump_insn_after_setloc): Call it. (emit_call_insn_after_setloc, emit_debug_insn_after_setloc): Likewise. (emit_pattern_after): New function. (emit_insn_after, emit_jump_insn_after): Call it. (emit_call_insn_after, emit_debug_insn_after): Likewise. (emit_pattern_before_setloc): New function. (emit_insn_before_setloc, emit_jump_insn_before_setloc): Call it. (emit_call_insn_before_setloc, emit_debug_insn_before_setloc): Likewise. (emit_pattern_before): New function. (emit_insn_before, emit_jump_insn_before): Call it. (emit_call_insn_before, emit_debug_insn_before): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@171817 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/emit-rtl.c')
-rw-r--r--gcc/emit-rtl.c269
1 files changed, 102 insertions, 167 deletions
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 01da5836e46..9b57aeab47a 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -4319,11 +4319,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;
@@ -4340,130 +4343,96 @@ 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)
return last;
@@ -4483,127 +4452,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