Line 166... |
Line 166... |
}
|
}
|
}
|
}
|
}
|
}
|
}
|
}
|
|
|
|
/* Inserts n nops before insn 'ref' */
|
|
void insert_insns (cuc_func *f, int ref, int n)
|
|
{
|
|
int b1, i, j;
|
|
int b = REF_BB(ref);
|
|
int ins = REF_I(ref);
|
|
|
|
assert (b < f->num_bb);
|
|
assert (ins <= f->bb[b].ninsn);
|
|
assert (f->bb[b].ninsn + n < MAX_INSNS);
|
|
print_cuc_bb (f, "PREINSERT");
|
|
f->bb[b].insn = (cuc_insn *) realloc (f->bb[b].insn,
|
|
(f->bb[b].ninsn + n) * sizeof (cuc_insn));
|
|
|
|
/* Set up relocations */
|
|
for (i = 0; i < f->bb[b].ninsn; i++)
|
|
if (i < ins) reloc[i] = i;
|
|
else reloc[i] = i + n;
|
|
|
|
/* Move instructions, based on relocations */
|
|
for (i = f->bb[b].ninsn - 1; i >= 0; i--) f->bb[b].insn[reloc[i]] = f->bb[b].insn[i];
|
|
for (i = 0; i < n; i++) change_insn_type (&f->bb[b].insn[ins + i], II_NOP);
|
|
|
|
f->bb[b].ninsn += n;
|
|
for (b1 = 0; b1 < f->num_bb; b1++) {
|
|
dep_list *d = f->bb[b1].mdep;
|
|
while (d) {
|
|
if (REF_BB (d->ref) == b && REF_I (d->ref) >= ins)
|
|
d->ref = REF (b, REF_I (d->ref) + n);
|
|
d = d->next;
|
|
}
|
|
for (i = 0; i < f->bb[b1].ninsn; i++) {
|
|
d = f->bb[b1].insn[i].dep;
|
|
while (d) {
|
|
if (REF_BB (d->ref) == b && REF_I (d->ref) >= ins)
|
|
d->ref = REF (b, REF_I (d->ref) + n);
|
|
d = d->next;
|
|
}
|
|
for (j = 0; j < MAX_OPERANDS; j++)
|
|
if (f->bb[b1].insn[i].opt[j] & OPT_REF && REF_BB (f->bb[b1].insn[i].op[j]) == b
|
|
&& REF_I (f->bb[b1].insn[i].op[j]) >= ins)
|
|
f->bb[b1].insn[i].op[j] = REF (b, REF_I (f->bb[b1].insn[i].op[j]) + n);
|
|
}
|
|
}
|
|
for (i = 0; i < f->nmsched; i++)
|
|
if (REF_BB(f->msched[i]) == b) f->msched[i] = REF (b, reloc[REF_I (f->msched[i])]);
|
|
print_cuc_bb (f, "POSTINSERT");
|
|
cuc_check (f);
|
|
}
|
|
|
/* returns nonzero, if instruction was simplified */
|
/* returns nonzero, if instruction was simplified */
|
int apply_edge_condition (cuc_insn *ii)
|
int apply_edge_condition (cuc_insn *ii)
|
{
|
{
|
unsigned int c = ii->op[2];
|
unsigned int c = ii->op[2];
|
|
|