Diff for /gforth/vmgen-ex/profile.c between versions 1.1 and 1.5

version 1.1, 2001/04/29 11:28:24 version 1.5, 2003/02/01 14:28:08
Line 27 Line 27
 /* data structure: simple hash table with external chaining */  /* data structure: simple hash table with external chaining */
   
 #define HASH_SIZE (1<<20)  #define HASH_SIZE (1<<20)
   #define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1))
   
   #ifdef __GNUC__
   typedef long long long_long;
   #else
   typedef long long_long;
   #endif
   
 typedef struct block_count {  typedef struct block_count {
   struct block_count *next; /* next in hash table */    struct block_count *next; /* next in hash table */
   struct block_count *fallthrough; /* the block that this one falls    struct block_count *fallthrough; /* the block that this one falls
                                        through to without SUPER_END */                                         through to without SUPER_END */
   Inst *ip;    Inst *ip;
   long long count;    long_long count;
   char **insts;    char **insts;
   size_t ninsts;    size_t ninsts;
 } block_count;  } block_count;
   
 block_count *blocks[HASH_SIZE];  block_count *blocks[HASH_SIZE];
   Inst *vmcode_end;
 #define hash(p) ((((Cell)(p))/sizeof(Inst))&(HASH_SIZE-1))  
   
 block_count *block_lookup(Inst *ip)  block_count *block_lookup(Inst *ip)
 {  {
Line 63  block_count *block_insert(Inst *ip) Line 69  block_count *block_insert(Inst *ip)
   new->next = blocks[hash(ip)];    new->next = blocks[hash(ip)];
   new->fallthrough = NULL;    new->fallthrough = NULL;
   new->ip = ip;    new->ip = ip;
   new->count = 0LL;    new->count = (long_long)0;
   new->insts = malloc(0);    new->insts = malloc(1);
   assert(new->insts != NULL);    assert(new->insts != NULL);
   new->ninsts = 0;    new->ninsts = 0;
   blocks[hash(ip)] = new;    blocks[hash(ip)] = new;
Line 82  void vm_count_block(Inst *ip) Line 88  void vm_count_block(Inst *ip)
   block_insert(ip)->count++;    block_insert(ip)->count++;
 }  }
   
 #define VM_IS_INST(inst, n) ((inst) == vm_prim[n])  
   
 void postprocess_block(block_count *b)  void postprocess_block(block_count *b)
 {  {
   Inst *ip = b->ip;    Inst *ip = b->ip;
   block_count *next_block;    block_count *next_block=NULL;
   
   do {    while (next_block == NULL && ip<vmcode_end) {
 #include "mini-profile.i"  #include "mini-profile.i"
     /* else */      /* else */
     {      {
Line 98  void postprocess_block(block_count *b) Line 102  void postprocess_block(block_count *b)
     }      }
   _endif_:    _endif_:
     next_block = block_lookup(ip);      next_block = block_lookup(ip);
   } while (next_block == NULL);    }
   /* we fell through, so set fallthrough and update the count */    /* we fell through, so set fallthrough and update the count */
   b->fallthrough = next_block;    b->fallthrough = next_block;
   /* also update the counts of all following fallthrough blocks that    /* also update the counts of all following fallthrough blocks that

Removed from v.1.1  
changed lines
  Added in v.1.5


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