Line 31... |
Line 31... |
double cycle_duration;
|
double cycle_duration;
|
double max_bb_delay;
|
double max_bb_delay;
|
|
|
static cuc_timing_table *timing_table;
|
static cuc_timing_table *timing_table;
|
|
|
static double insn_time (cuc_insn *ii)
|
/* Returns instruction delay */
|
|
double insn_time (cuc_insn *ii)
|
{
|
{
|
if (ii->opt[2] & OPT_CONST)
|
if (ii->opt[2] & OPT_CONST)
|
return timing_table[ii->index].delayi;
|
return timing_table[ii->index].delayi;
|
else return timing_table[ii->index].delay;
|
else return timing_table[ii->index].delay;
|
}
|
}
|
|
|
|
/* Returns instruction size */
|
|
double insn_size (cuc_insn *ii)
|
|
{
|
|
if (ii->opt[2] & OPT_CONST)
|
|
return timing_table[ii->index].sizei;
|
|
else return timing_table[ii->index].size;
|
|
}
|
|
|
|
/* Returns normal instruction size */
|
|
double ii_size (int index, int imm)
|
|
{
|
|
if (imm) return timing_table[index].sizei;
|
|
else return timing_table[index].size;
|
|
}
|
|
|
/* Returns dataflow tree height in cycles */
|
/* Returns dataflow tree height in cycles */
|
static double max_delay (cuc_func *f, int b)
|
static double max_delay (cuc_func *f, int b)
|
{
|
{
|
double max_d = 0.;
|
double max_d = 0.;
|
double *d;
|
double *d;
|
Line 136... |
Line 152... |
d = ceil (x / cycle_duration);
|
d = ceil (x / cycle_duration);
|
if (d < 1) d = 1;
|
if (d < 1) d = 1;
|
if (cut && x > cycle_duration) cut_tree (f, b, x / d);
|
if (cut && x > cycle_duration) cut_tree (f, b, x / d);
|
|
|
if (x / d > max_bb_delay) max_bb_delay = x / d;
|
if (x / d > max_bb_delay) max_bb_delay = x / d;
|
|
|
return memory_delay (f, b) + d;
|
return memory_delay (f, b) + d;
|
}
|
}
|
|
|
/* Cuts the tree and marks registers */
|
/* Cuts the tree and marks registers */
|
void mark_cut (cuc_func *f)
|
void mark_cut (cuc_func *f)
|
Line 203... |
Line 220... |
/* Analizes current version of design and places results into timings structure */
|
/* Analizes current version of design and places results into timings structure */
|
void analyse_timings (cuc_func *f, cuc_timings *timings)
|
void analyse_timings (cuc_func *f, cuc_timings *timings)
|
{
|
{
|
long new_time = 0;
|
long new_time = 0;
|
double size = 0.;
|
double size = 0.;
|
int b;
|
int b, i;
|
|
|
|
/* Add time needed for mtspr/mfspr */
|
|
for (i = 0; i < MAX_REGS; i++) if (f->used_regs[i]) new_time++;
|
|
new_time++; /* always one mfspr at the end */
|
|
new_time *= f->num_runs;
|
|
|
max_bb_delay = 0.;
|
max_bb_delay = 0.;
|
for (b = 0; b < f->num_bb; b++) {
|
for (b = 0; b < f->num_bb; b++) {
|
new_time += new_bb_cycles (f, b, 0) * f->bb[b].cnt;
|
new_time += new_bb_cycles (f, b, 0) * f->bb[b].cnt;
|
size = size + bb_size (&f->bb[b]);
|
size = size + bb_size (&f->bb[b]);
|