ia64.c (issue_nops_and_insn): Add new parameter.

2003-04-09  Vladimir Makarov  <vmakarov@redhat.com>

	* config/ia64/ia64.c (issue_nops_and_insn): Add new parameter.
	Check that asm insn starts on a new cycle.  Add nops after asm
	insn to end bundle.
	(bundling): Move insn type evaluation from the loop.  Call
	issue_nops_and_insn with the new parameter.  Ignore changing
	position for nops after asm insn.

From-SVN: r65401
This commit is contained in:
Vladimir Makarov 2003-04-09 18:50:03 +00:00 committed by Vladimir Makarov
parent 0913e4b49e
commit f32360c722
2 changed files with 68 additions and 38 deletions

View File

@ -1,3 +1,12 @@
2003-04-09 Vladimir Makarov <vmakarov@redhat.com>
* config/ia64/ia64.c (issue_nops_and_insn): Add new parameter.
Check that asm insn starts on a new cycle. Add nops after asm
insn to end bundle.
(bundling): Move insn type evaluation from the loop. Call
issue_nops_and_insn with the new parameter. Ignore changing
position for nops after asm insn.
2003-04-09 Alexandre Oliva <aoliva@redhat.com> 2003-04-09 Alexandre Oliva <aoliva@redhat.com>
* optabs.c: Comment that gen_add2_insn and others may actually * optabs.c: Comment that gen_add2_insn and others may actually

View File

@ -230,7 +230,7 @@ static void finish_bundle_state_table PARAMS ((void));
static int try_issue_nops PARAMS ((struct bundle_state *, int)); static int try_issue_nops PARAMS ((struct bundle_state *, int));
static int try_issue_insn PARAMS ((struct bundle_state *, rtx)); static int try_issue_insn PARAMS ((struct bundle_state *, rtx));
static void issue_nops_and_insn PARAMS ((struct bundle_state *, int, static void issue_nops_and_insn PARAMS ((struct bundle_state *, int,
rtx, int)); rtx, int, int));
static int get_max_pos PARAMS ((state_t)); static int get_max_pos PARAMS ((state_t));
static int get_template PARAMS ((state_t, int)); static int get_template PARAMS ((state_t, int));
@ -6316,17 +6316,18 @@ try_issue_insn (curr_state, insn)
/* The following function tries to issue BEFORE_NOPS_NUM nops and INSN /* The following function tries to issue BEFORE_NOPS_NUM nops and INSN
starting with ORIGINATOR without advancing processor cycle. If starting with ORIGINATOR without advancing processor cycle. If
TRY_BUNDLE_END_P is TRUE, the function also tries to issue nops to TRY_BUNDLE_END_P is TRUE, the function also/only (if
fill all bundle. If it was successful, the function creates new ONLY_BUNDLE_END_P is TRUE) tries to issue nops to fill all bundle.
bundle state and insert into the hash table and into If it was successful, the function creates new bundle state and
`index_to_bundle_states'. */ insert into the hash table and into `index_to_bundle_states'. */
static void static void
issue_nops_and_insn (originator, before_nops_num, insn, try_bundle_end_p) issue_nops_and_insn (originator, before_nops_num, insn, try_bundle_end_p,
only_bundle_end_p)
struct bundle_state *originator; struct bundle_state *originator;
int before_nops_num; int before_nops_num;
rtx insn; rtx insn;
int try_bundle_end_p; int try_bundle_end_p, only_bundle_end_p;
{ {
struct bundle_state *curr_state; struct bundle_state *curr_state;
@ -6365,9 +6366,10 @@ issue_nops_and_insn (originator, before_nops_num, insn, try_bundle_end_p)
return; return;
if (!try_issue_insn (curr_state, insn)) if (!try_issue_insn (curr_state, insn))
return; return;
if (GET_CODE (PATTERN (insn)) != ASM_INPUT curr_state->accumulated_insns_num++;
&& asm_noperands (PATTERN (insn)) < 0) if (GET_CODE (PATTERN (insn)) == ASM_INPUT
curr_state->accumulated_insns_num++; || asm_noperands (PATTERN (insn)) >= 0)
abort ();
if (ia64_safe_type (insn) == TYPE_L) if (ia64_safe_type (insn) == TYPE_L)
curr_state->accumulated_insns_num++; curr_state->accumulated_insns_num++;
} }
@ -6380,10 +6382,17 @@ issue_nops_and_insn (originator, before_nops_num, insn, try_bundle_end_p)
return; return;
if (!try_issue_insn (curr_state, insn)) if (!try_issue_insn (curr_state, insn))
return; return;
if (GET_CODE (PATTERN (insn)) != ASM_INPUT curr_state->accumulated_insns_num++;
&& asm_noperands (PATTERN (insn)) < 0) if (GET_CODE (PATTERN (insn)) == ASM_INPUT
curr_state->accumulated_insns_num++; || asm_noperands (PATTERN (insn)) >= 0)
if (ia64_safe_type (insn) == TYPE_L) {
/* Finish bundle containing asm insn. */
curr_state->after_nops_num
= 3 - curr_state->accumulated_insns_num % 3;
curr_state->accumulated_insns_num
+= 3 - curr_state->accumulated_insns_num % 3;
}
else if (ia64_safe_type (insn) == TYPE_L)
curr_state->accumulated_insns_num++; curr_state->accumulated_insns_num++;
} }
if (ia64_safe_type (insn) == TYPE_B) if (ia64_safe_type (insn) == TYPE_B)
@ -6391,7 +6400,7 @@ issue_nops_and_insn (originator, before_nops_num, insn, try_bundle_end_p)
+= 2 - (curr_state->accumulated_insns_num - 1) % 3; += 2 - (curr_state->accumulated_insns_num - 1) % 3;
if (try_bundle_end_p && curr_state->accumulated_insns_num % 3 != 0) if (try_bundle_end_p && curr_state->accumulated_insns_num % 3 != 0)
{ {
if (insert_bundle_state (curr_state)) if (!only_bundle_end_p && insert_bundle_state (curr_state))
{ {
state_t dfa_state; state_t dfa_state;
struct bundle_state *curr_state1; struct bundle_state *curr_state1;
@ -6538,7 +6547,7 @@ bundling (dump, verbose, prev_head_insn, tail)
struct bundle_state *curr_state, *next_state, *best_state; struct bundle_state *curr_state, *next_state, *best_state;
rtx insn, next_insn; rtx insn, next_insn;
int insn_num; int insn_num;
int i, bundle_end_p; int i, bundle_end_p, only_bundle_end_p, asm_p;
int pos, max_pos, template0, template1; int pos, max_pos, template0, template1;
rtx b; rtx b;
rtx nop; rtx nop;
@ -6602,6 +6611,7 @@ bundling (dump, verbose, prev_head_insn, tail)
|| GET_CODE (PATTERN (insn)) == USE || GET_CODE (PATTERN (insn)) == USE
|| GET_CODE (PATTERN (insn)) == CLOBBER) || GET_CODE (PATTERN (insn)) == CLOBBER)
abort (); abort ();
type = ia64_safe_type (insn);
next_insn = get_next_important_insn (NEXT_INSN (insn), tail); next_insn = get_next_important_insn (NEXT_INSN (insn), tail);
insn_num++; insn_num++;
index_to_bundle_states [insn_num] = NULL; index_to_bundle_states [insn_num] = NULL;
@ -6610,10 +6620,15 @@ bundling (dump, verbose, prev_head_insn, tail)
curr_state = next_state) curr_state = next_state)
{ {
pos = curr_state->accumulated_insns_num % 3; pos = curr_state->accumulated_insns_num % 3;
type = ia64_safe_type (insn);
next_state = curr_state->next; next_state = curr_state->next;
/* Finish the current bundle in order to start a subsequent
asm insn in a new bundle. */
only_bundle_end_p
= (next_insn != NULL_RTX
&& INSN_CODE (insn) == CODE_FOR_insn_group_barrier
&& ia64_safe_type (next_insn) == TYPE_UNKNOWN);
bundle_end_p bundle_end_p
= (next_insn == NULL_RTX = (only_bundle_end_p || next_insn == NULL_RTX
|| (GET_MODE (next_insn) == TImode || (GET_MODE (next_insn) == TImode
&& INSN_CODE (insn) != CODE_FOR_insn_group_barrier)); && INSN_CODE (insn) != CODE_FOR_insn_group_barrier));
if (type == TYPE_F || type == TYPE_B || type == TYPE_L if (type == TYPE_F || type == TYPE_B || type == TYPE_L
@ -6621,9 +6636,12 @@ bundling (dump, verbose, prev_head_insn, tail)
/* We need to insert 2 Nops for cases like M_MII. */ /* We need to insert 2 Nops for cases like M_MII. */
|| (type == TYPE_M && ia64_tune == PROCESSOR_ITANIUM || (type == TYPE_M && ia64_tune == PROCESSOR_ITANIUM
&& !bundle_end_p && pos == 1)) && !bundle_end_p && pos == 1))
issue_nops_and_insn (curr_state, 2, insn, bundle_end_p); issue_nops_and_insn (curr_state, 2, insn, bundle_end_p,
issue_nops_and_insn (curr_state, 1, insn, bundle_end_p); only_bundle_end_p);
issue_nops_and_insn (curr_state, 0, insn, bundle_end_p); issue_nops_and_insn (curr_state, 1, insn, bundle_end_p,
only_bundle_end_p);
issue_nops_and_insn (curr_state, 0, insn, bundle_end_p,
only_bundle_end_p);
} }
if (index_to_bundle_states [insn_num] == NULL) if (index_to_bundle_states [insn_num] == NULL)
abort (); abort ();
@ -6680,6 +6698,8 @@ bundling (dump, verbose, prev_head_insn, tail)
curr_state = curr_state->originator) curr_state = curr_state->originator)
{ {
insn = curr_state->insn; insn = curr_state->insn;
asm_p = (GET_CODE (PATTERN (insn)) == ASM_INPUT
|| asm_noperands (PATTERN (insn)) >= 0);
insn_num++; insn_num++;
if (verbose >= 2 && dump) if (verbose >= 2 && dump)
{ {
@ -6724,23 +6744,24 @@ bundling (dump, verbose, prev_head_insn, tail)
template1 = get_template (curr_state->dfa_state, 3); template1 = get_template (curr_state->dfa_state, 3);
pos += 3; pos += 3;
} }
for (i = 0; i < curr_state->after_nops_num; i++) if (!asm_p)
{ for (i = 0; i < curr_state->after_nops_num; i++)
nop = gen_nop (); {
emit_insn_after (nop, insn); nop = gen_nop ();
pos--; emit_insn_after (nop, insn);
if (pos < 0) pos--;
abort (); if (pos < 0)
if (pos % 3 == 0) abort ();
{ if (pos % 3 == 0)
if (template0 < 0) {
abort (); if (template0 < 0)
b = gen_bundle_selector (GEN_INT (template0)); abort ();
ia64_emit_insn_before (b, nop); b = gen_bundle_selector (GEN_INT (template0));
template0 = template1; ia64_emit_insn_before (b, nop);
template1 = -1; template0 = template1;
} template1 = -1;
} }
}
if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier
&& GET_CODE (PATTERN (insn)) != ASM_INPUT && GET_CODE (PATTERN (insn)) != ASM_INPUT
&& asm_noperands (PATTERN (insn)) < 0) && asm_noperands (PATTERN (insn)) < 0)