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:
parent
0913e4b49e
commit
f32360c722
@ -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
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user