OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [stable_0_2_0_rc3/] [or1ksim/] [cuc/] [cuc.c] - Diff between revs 924 and 931

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 924 Rev 931
Line 40... Line 40...
  1, 1, 0, 1, 0, 1, 0, 1,
  1, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1,
  0, 1, 0, 1, 0, 1, 0, 1,
  1, 1};
  1, 1};
 
 
cuc_timings *preunroll_bb (char *bb_filename, cuc_func *f, cuc_timings *timings, int b, int i, int j)
/* Does all known instruction optimizations */
 
void cuc_optimize (cuc_func *func)
{
{
  cuc_func *func;
  int modified = 0;
  cucdebug (2, "BB%i unroll %i times preroll %i times\n", b, j, i);
 
  func = preunroll_loop (f, b, i, j, bb_filename);
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_PREUNROLL");
 
 
 
  log ("Optimizing.\n");
  log ("Optimizing.\n");
  optimize_cmovs (func);
  do {
 
    modified = 0;
 
    if (optimize_cmovs (func)) {
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
  optimize_tree (func);
      modified = 1;
 
    }
 
    if (optimize_tree (func)) {
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_TREE1");
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_TREE1");
  remove_nops (func);
      modified = 1;
 
    }
 
    if (remove_nops (func)) {
  if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
  if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
  remove_dead (func);
      modified = 1;
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD1");
    }
  optimize_bb (func);
    if (remove_dead (func)) {
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_OPT_BB");
      if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
  remove_dead_bb (func);
      modified = 1;
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD_BB");
    }
  optimize_tree (func);
    if (cse (func)) {
  if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_OPT_TREE");
 
  log ("Common subexpression elimination.\n");
  log ("Common subexpression elimination.\n");
  cse (func);
 
  if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
  if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
  remove_dead (func);
      modified = 1;
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
    }
  remove_trivial_regs (func);
    if (optimize_bb (func)) {
  set_io (func);
      if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_OPT_BB");
 
      modified = 1;
 
    }
 
    if (remove_nops (func)) {
 
      if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
 
      modified = 1;
 
    }
 
    if (remove_dead_bb (func)) {
 
      if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD_BB");
 
      modified = 1;
 
    }
 
    if (remove_trivial_regs (func)) {
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
 
      modified = 1;
 
    }
 
    if (remove_nops (func)) {
 
      if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
 
      modified = 1;
 
    }
 
  } while (modified);
 
  set_io (func);
 
}
 
 
 
/* Pre/unrolls basic block and optimizes it */
 
cuc_timings *preunroll_bb (char *bb_filename, cuc_func *f, cuc_timings *timings, int b, int i, int j)
 
{
 
  cuc_func *func;
 
  cucdebug (2, "BB%i unroll %i times preroll %i times\n", b, j, i);
 
  func = preunroll_loop (f, b, i, j, bb_filename);
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_PREUNROLL");
 
  cuc_optimize (func);
 
 
  add_latches (func);
  add_latches (func);
  if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
  if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
  set_io (func);
 
  add_memory_dep (func, func->memory_order);
  add_memory_dep (func, func->memory_order);
  if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
  if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
  add_data_dep (func);
  add_data_dep (func);
  if (cuc_debug >= 8) print_cuc_bb (func, "AFTER_DATA_DEP");
  if (cuc_debug >= 8) print_cuc_bb (func, "AFTER_DATA_DEP");
  schedule_memory (func, func->memory_order);
  schedule_memory (func, func->memory_order);
Line 94... Line 124...
  timings->preroll = i;
  timings->preroll = i;
  timings->nshared = 0;
  timings->nshared = 0;
  return timings;
  return timings;
}
}
 
 
 
/* Simple comparison function */
int tim_comp (cuc_timings *a, cuc_timings *b)
int tim_comp (cuc_timings *a, cuc_timings *b)
{
{
  if (a->new_time < b->new_time) return -1;
  if (a->new_time < b->new_time) return -1;
  else if (a->new_time > b->new_time) return 1;
  else if (a->new_time > b->new_time) return 1;
  else return 0;
  else return 0;
}
}
 
 
 
/* Analyses function; done when cuc command is entered in (sim) prompt */
cuc_func *analyse_function (char *module_name, long orig_time,
cuc_func *analyse_function (char *module_name, long orig_time,
                unsigned long start_addr, unsigned long end_addr,
                unsigned long start_addr, unsigned long end_addr,
                int memory_order)
                int memory_order)
{
{
  cuc_timings timings;
  cuc_timings timings;
Line 142... Line 174...
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_BUILD_BB");
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_BUILD_BB");
  reg_dep (func);
  reg_dep (func);
 
 
  log ("Detecting dependencies\n");
  log ("Detecting dependencies\n");
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_REG_DEP");
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_REG_DEP");
  optimize_cmovs (func);
  cuc_optimize (func);
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_CMOVS");
 
  optimize_tree (func);
 
  log ("Optimizing.\n");
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_OPT_TREE1");
 
  remove_nops (func);
 
  if (cuc_debug >= 6) print_cuc_bb (func, "NO_NOPS");
 
  remove_dead (func);
 
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_DEAD1");
 
  optimize_bb (func);
 
  if (cuc_debug >= 6) print_cuc_bb (func, "AFTER_OPT_BB");
 
  remove_dead_bb (func);
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_DEAD_BB");
 
  optimize_tree (func);
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_OPT_TREE");
 
  log ("Common subexpression elimination.\n");
 
  cse (func);
 
  if (cuc_debug >= 3) print_cuc_bb (func, "AFTER_CSE");
 
  remove_dead (func);
 
  if (cuc_debug >= 5) print_cuc_bb (func, "AFTER_DEAD");
 
  remove_trivial_regs (func);
 
  set_io (func);
 
  if (cuc_debug >= 2) print_cuc_bb (func, "AFTER_TRIVIAL");
 
 
 
#if 0
#if 0
  csm (func);
  csm (func);
#endif
#endif
  assert (saved = dup_func (func));
  assert (saved = dup_func (func));
 
 
  timings.preroll = timings.unroll = 1;
  timings.preroll = timings.unroll = 1;
  timings.nshared = 0;
  timings.nshared = 0;
  add_latches (func);
 
 
 
 
  add_latches (func);
  if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
  if (cuc_debug >= 1) print_cuc_bb (func, "AFTER_LATCHES");
  analyse_timings (func, &timings);
  analyse_timings (func, &timings);
  add_memory_dep (func, func->memory_order);
  add_memory_dep (func, func->memory_order);
  if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
  if (cuc_debug >= 7) print_cuc_bb (func, "AFTER_MEMORY_DEP");
  add_data_dep (func);
  add_data_dep (func);

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.