version 1.1, 2001/04/29 11:28:24
|
version 1.2, 2001/05/01 10:20:56
|
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)) |
|
|
typedef struct block_count { |
typedef struct block_count { |
struct block_count *next; /* next in hash table */ |
struct block_count *next; /* next in hash table */ |
Line 39 typedef struct block_count {
|
Line 40 typedef struct block_count {
|
} 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 87 void vm_count_block(Inst *ip)
|
Line 87 void vm_count_block(Inst *ip)
|
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 98 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 |