direct threaded codeの無効と有効で切り分けられるようにしてみた。

無効にする場合は

#define DIRECT_THREADED_CODE

コメントアウト

#include <stdio.h>
#define MAX_ISEC 200

enum Ins {
    INS1   = 0,
    INS2   = 1,
    RETURN = 2
};

#define DIRECT_THREADED_CODE 

#ifdef DIRECT_THREADED_CODE
#define SWITCH(v) 
#define CASE(LABEL) LABEL: 
#define BREAK goto *isec_addr[++pc]
#else
#define SWITCH(v) switch (v)
#define CASE(LABEL) case LABEL:
#define BREAK break
#endif

void eval(unsigned char *src, int line)
{
#ifdef DIRECT_THREADED_CODE
    void *tbl[] = {
	&&INS1, &&INS2, &&RETURN
    };
    void *isec_addr[MAX_ISEC];
    int i;
    for (i = 0; i < line; i++) {
	isec_addr[i] =  tbl[src[i]];
    }
    printf("use direct threaded code\n");
#endif
    int pc = 0;
    for (;;) {
	SWITCH(src[pc++]) {
	CASE(INS1)
	    printf("ins1\n");
	    BREAK;

	CASE(INS2)
	    printf("ins2\n");
	    BREAK;

	CASE(RETURN)
	    printf("return\n");
	    return;
	    BREAK;
	}
    }
}    

int main(int argc, char **argv) 
{
    unsigned char src[] = {
	INS1,
	INS2,
	INS2,
	INS1,
	INS2,
	RETURN
    };
    eval(src, sizeof(src) / sizeof(src[0]));
    return 0;
}