Diff for /gforth/engine/main.c between versions 1.109 and 1.110

version 1.109, 2003/05/14 07:54:54 version 1.110, 2003/05/14 09:25:10
Line 131  Cell last_jump=0; /* if the last prim wa Line 131  Cell last_jump=0; /* if the last prim wa
 static int no_super=0;   /* true if compile_prim should not fuse prims */  static int no_super=0;   /* true if compile_prim should not fuse prims */
 static int no_dynamic=NO_DYNAMIC_DEFAULT; /* if true, no code is generated  static int no_dynamic=NO_DYNAMIC_DEFAULT; /* if true, no code is generated
                                              dynamically */                                               dynamically */
 static int print_codesize=0; /* if true, print code size on exit */  static int print_metrics=0; /* if true, print metrics on exit */
 static int static_super_number = 10000000; /* number of ss used if available */  static int static_super_number = 10000000; /* number of ss used if available */
   static int ss_greedy = 0; /* if true: use greedy, not optimal ss selection */
   
 #ifdef HAS_DEBUG  #ifdef HAS_DEBUG
 int debug=0;  int debug=0;
Line 1073  cost_lsu; Line 1074  cost_lsu;
 cost_codesize;  cost_codesize;
 #endif  #endif
   
   struct {
     Costfunc *costfunc;
     char *metricname;
     long sum;
   } cost_sums[] = {
   #ifndef NO_DYNAMIC
     { cost_codesize, "codesize", 0 },
   #endif
     { cost_ls,       "ls",       0 },
     { cost_lsu,      "lsu",      0 },
     { cost_nexts,    "nexts",    0 }
   };
   
 #define MAX_BB 128 /* maximum number of instructions in BB */  #define MAX_BB 128 /* maximum number of instructions in BB */
   
 /* use dynamic programming to find the shortest paths within the basic  /* use dynamic programming to find the shortest paths within the basic
Line 1080  cost_codesize; Line 1094  cost_codesize;
    on the shortest path to the end of the BB */     on the shortest path to the end of the BB */
 void optimize_bb(short origs[], short optimals[], int ninsts)  void optimize_bb(short origs[], short optimals[], int ninsts)
 {  {
   int i,j;    int i,j, mincost;
   static int costs[MAX_BB+1];    static int costs[MAX_BB+1];
   
   assert(ninsts<MAX_BB);    assert(ninsts<MAX_BB);
   costs[ninsts]=0;    costs[ninsts]=0;
   for (i=ninsts-1; i>=0; i--) {    for (i=ninsts-1; i>=0; i--) {
     optimals[i] = origs[i];      optimals[i] = origs[i];
     costs[i] = costs[i+1] + ss_cost(optimals[i]);      costs[i] = mincost = costs[i+1] + ss_cost(optimals[i]);
     for (j=2; j<=max_super && i+j<=ninsts ; j++) {      for (j=2; j<=max_super && i+j<=ninsts ; j++) {
       int super, jcost;        int super, jcost;
   
       super = lookup_super(origs+i,j);        super = lookup_super(origs+i,j);
       if (super >= 0) {        if (super >= 0) {
         jcost = costs[i+j] + ss_cost(super);          jcost = costs[i+j] + ss_cost(super);
         if (jcost <= costs[i]) {          if (jcost <= mincost) {
           optimals[i] = super;            optimals[i] = super;
           costs[i] = jcost;            mincost = jcost;
             if (!ss_greedy)
               costs[i] = jcost;
         }          }
       }        }
     }      }
Line 1107  void optimize_bb(short origs[], short op Line 1123  void optimize_bb(short origs[], short op
    superinstructions in optimals */     superinstructions in optimals */
 void rewrite_bb(Cell *instps[], short *optimals, int ninsts)  void rewrite_bb(Cell *instps[], short *optimals, int ninsts)
 {  {
   int i, nextdyn;    int i,j, nextdyn;
   Cell inst;    Cell inst;
   
   for (i=0, nextdyn=0; i<ninsts; i++) {    for (i=0, nextdyn=0; i<ninsts; i++) {
     if (i==nextdyn) { /* compile dynamically */      if (i==nextdyn) { /* compile dynamically */
       nextdyn += super_costs[optimals[i]].length;        nextdyn += super_costs[optimals[i]].length;
       inst = compile_prim_dyn(optimals[i]);        inst = compile_prim_dyn(optimals[i]);
         for (j=0; j<sizeof(cost_sums)/sizeof(cost_sums[0]); j++)
           cost_sums[j].sum += cost_sums[j].costfunc(optimals[i]);
     } else { /* compile statically */      } else { /* compile statically */
       inst = (Cell)vm_prims[optimals[i]+DOESJUMP+1];        inst = (Cell)vm_prims[optimals[i]+DOESJUMP+1];
     }      }
Line 1422  void gforth_args(int argc, char ** argv, Line 1440  void gforth_args(int argc, char ** argv,
       {"no-super", no_argument, &no_super, 1},        {"no-super", no_argument, &no_super, 1},
       {"no-dynamic", no_argument, &no_dynamic, 1},        {"no-dynamic", no_argument, &no_dynamic, 1},
       {"dynamic", no_argument, &no_dynamic, 0},        {"dynamic", no_argument, &no_dynamic, 0},
       {"print-codesize", no_argument, &print_codesize, 1},        {"print-metrics", no_argument, &print_metrics, 1},
       {"ss-number", required_argument, NULL, ss_number},        {"ss-number", required_argument, NULL, ss_number},
 #ifndef NO_DYNAMIC  #ifndef NO_DYNAMIC
       {"ss-min-codesize", no_argument, NULL, ss_min_codesize},        {"ss-min-codesize", no_argument, NULL, ss_min_codesize},
Line 1430  void gforth_args(int argc, char ** argv, Line 1448  void gforth_args(int argc, char ** argv,
       {"ss-min-ls",       no_argument, NULL, ss_min_ls},        {"ss-min-ls",       no_argument, NULL, ss_min_ls},
       {"ss-min-lsu",      no_argument, NULL, ss_min_lsu},        {"ss-min-lsu",      no_argument, NULL, ss_min_lsu},
       {"ss-min-nexts",    no_argument, NULL, ss_min_nexts},        {"ss-min-nexts",    no_argument, NULL, ss_min_nexts},
         {"ss-greedy",       no_argument, &ss_greedy, 1},
       {0,0,0,0}        {0,0,0,0}
       /* no-init-file, no-rc? */        /* no-init-file, no-rc? */
     };      };
Line 1479  Engine Options:\n\ Line 1498  Engine Options:\n\
   --no-super                        No dynamically formed superinstructions\n\    --no-super                        No dynamically formed superinstructions\n\
   --offset-image                    Load image at a different position\n\    --offset-image                    Load image at a different position\n\
   -p PATH, --path=PATH              Search path for finding image and sources\n\    -p PATH, --path=PATH              Search path for finding image and sources\n\
   --print-codesize                  Print size of generated native code on exit\n\    --print-metrics                   Print some code generation metrics on exit\n\
   -r SIZE, --return-stack-size=SIZE Specify return stack size\n\    -r SIZE, --return-stack-size=SIZE Specify return stack size\n\
   --ss-number=N                     use N static superinsts (default max)\n    --ss-greedy                       greedy, not optimal superinst selection\n
   --ss-min-codesize                 select superinsts for smallest native code\n    --ss-min-codesize                 select superinsts for smallest native code\n
   --ss-min-ls                       minimize loads and stores\n    --ss-min-ls                       minimize loads and stores\n
   --ss-min-lsu                      minimize loads, stores, and pointer updates\n    --ss-min-lsu                      minimize loads, stores, and pointer updates\n
   --ss-min-nexts                    minimize the number of static superinsts\n    --ss-min-nexts                    minimize the number of static superinsts\n
     --ss-number=N                     use N static superinsts (default max)\n
   -v, --version                     Print engine version and exit\n\    -v, --version                     Print engine version and exit\n\
 SIZE arguments consist of an integer followed by a unit. The unit can be\n\  SIZE arguments consist of an integer followed by a unit. The unit can be\n\
   `b' (byte), `e' (element; default), `k' (KB), `M' (MB), `G' (GB) or `T' (TB).\n",    `b' (byte), `e' (element; default), `k' (KB), `M' (MB), `G' (GB) or `T' (TB).\n",
Line 1541  int main(int argc, char **argv, char **e Line 1561  int main(int argc, char **argv, char **e
 #ifndef NO_DYNAMIC  #ifndef NO_DYNAMIC
   if (no_dynamic && ss_cost == cost_codesize) {    if (no_dynamic && ss_cost == cost_codesize) {
     ss_cost = cost_lsu;      ss_cost = cost_lsu;
       cost_sums[0] = cost_sums[1];
     if (debug)      if (debug)
       fprintf(stderr, "--no-dynamic conflicts with --ss-min-codesize, reverting to --ss-min-lsu\n");        fprintf(stderr, "--no-dynamic conflicts with --ss-min-codesize, reverting to --ss-min-lsu\n");
   }    }
Line 1588  int main(int argc, char **argv, char **e Line 1609  int main(int argc, char **argv, char **e
 #endif  #endif
     deprep_terminal();      deprep_terminal();
   }    }
   if (print_codesize) {    if (print_metrics) {
     fprintf(stderr, "code size = %ld\n", dyncodesize());      int i;
       fprintf(stderr, "code size = %8ld\n", dyncodesize());
       for (i=0; i<sizeof(cost_sums)/sizeof(cost_sums[0]); i++)
         fprintf(stderr, "metric %8s: %8ld\n",
                 cost_sums[i].metricname, cost_sums[i].sum);
   }    }
   return retvalue;    return retvalue;
 }  }

Removed from v.1.109  
changed lines
  Added in v.1.110


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>