From 0932b770a7152e59695ec62bb7e39d58a5e7bb44 Mon Sep 17 00:00:00 2001 From: Dimitar Trendafilov Date: Sun, 30 Oct 2022 11:33:02 +0200 Subject: Add demo for threaded interpretation --- demo/threaded/threaded.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 demo/threaded/threaded.cpp (limited to 'demo/threaded/threaded.cpp') 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 +#include + +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; +} -- cgit v1.3.1-23-gd82d