-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.h
67 lines (61 loc) · 1.29 KB
/
test.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#if OPT_CONTEXT_THREADING
#define NEXT() do { pc++; __asm__ __volatile__ ("ret" : : "r" (pc)); } while(0)
#elif OPT_DIRECT_THREADING
#define NEXT() goto **pc++
#else
#error unsupported value for "CALL_MODEL"
#endif
static void **
#if OPT_CONTEXT_THREADING
test_context_threading(void ** stream)
#else
test_direct_threading(void ** stream)
#endif
{
register void ** pc __asm__("r14");
#define L(n) &&l##n
#define LABELS(n) L(n##0), L(n##1), L(n##2), L(n##3), L(n##4), L(n##5), L(n##6), L(n##7), L(n##8), L(n##9)
if (0 == stream) {
static void * table[] = {
LABELS(0),
LABELS(1),
LABELS(2),
LABELS(3),
LABELS(4),
LABELS(5),
LABELS(6),
LABELS(7),
LABELS(8),
LABELS(9),
&&term
};
return table;
}
pc = stream;
goto **pc++;
#define INSTRUCTION(n) l##n: NEXT()
#define INSTRUCTIONS(n) \
INSTRUCTION(n##0); \
INSTRUCTION(n##1); \
INSTRUCTION(n##2); \
INSTRUCTION(n##3); \
INSTRUCTION(n##4); \
INSTRUCTION(n##5); \
INSTRUCTION(n##6); \
INSTRUCTION(n##7); \
INSTRUCTION(n##8); \
INSTRUCTION(n##9)
INSTRUCTIONS(0);
INSTRUCTIONS(1);
INSTRUCTIONS(2);
INSTRUCTIONS(3);
INSTRUCTIONS(4);
INSTRUCTIONS(5);
INSTRUCTIONS(6);
INSTRUCTIONS(7);
INSTRUCTIONS(8);
INSTRUCTIONS(9);
term:
return NULL;
}
#undef NEXT