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 |