diff options
Add demo for threaded interpretation
1 files changed, 88 insertions, 0 deletions
| -rw-r--r-- | demo/threaded/threaded.cpp | 88 |
diff --git a/demo/threaded/threaded.cpp b/demo/threaded/threaded.cpp new file mode 100644 index 0000000..f263bd0 --- /dev/null +++ b/demo/threaded/threaded.cpp @@ -0,0 +1,88 @@ +#include <cstdio>
+#include <cstdint>
+
+void run_threaded(uint8_t* code, int limit)
+{
+ static void* opjump[] = {
+ &&add,
+ &&sub,
+ &&mul,
+ &&div,
+ &&print,
+ &&halt,
+ &&restart,
+ };
+
+ int counts[] = { 0, 0, 0, 0, 0, 0, 0 };
+
+ int ops = 0;
+ int pc = 0;
+ goto *opjump[code[pc]];
+
+ while (1)
+ {
+add:
+ {
+ ++counts[0];
+ if (++ops == limit) break;
+ goto *opjump[code[++pc]];
+ }
+sub:
+ {
+ ++counts[1];
+ if (++ops == limit) break;
+ goto *opjump[code[++pc]];
+ }
+mul:
+ {
+ ++counts[2];
+ if (++ops == limit) break;
+ goto *opjump[code[++pc]];
+ }
+div:
+ {
+ ++counts[3];
+ if (++ops == limit) break;
+ goto *opjump[code[++pc]];
+ }
+print:
+ {
+ ++counts[4];
+ if (++ops == limit) break;
+ goto *opjump[code[++pc]];
+ }
+halt:
+ {
+ ++counts[5];
+ if (++ops == limit) break;
+ break;
+ }
+
+restart:
+ {
+ ++counts[6];
+ if (++ops == limit) break;
+ pc = 0;
+ goto *opjump[code[pc]];
+ }
+ }
+ std::printf("add: %d\n", counts[0]);
+ std::printf("sub: %d\n", counts[1]);
+ std::printf("mul: %d\n", counts[2]);
+ std::printf("div: %d\n", counts[3]);
+ std::printf("print: %d\n", counts[4]);
+ std::printf("halt: %d\n", counts[5]);
+ std::printf("restart: %d\n", counts[6]);
+}
+
+int main()
+{
+ uint8_t program[] = {
+ 0, 0, 0, 0,
+ 1, 2, 1, 2,
+ 4, 3, 4, 3,
+ 6,
+ };
+ run_threaded(program, 32 * 1000 * 1000);
+ return 0;
+}
|
