diff options
author | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-09 08:08:38 -0500 |
---|---|---|
committer | Clyne Sullivan <clyne@bitgloo.com> | 2023-11-09 08:08:38 -0500 |
commit | 3dc947a7575bd23703644996d8e853e5e618b2e3 (patch) | |
tree | c91ff763003cb1b83f76c31b0948ff8699280f57 | |
parent | b33c0c564c51252ff241a2143e467dadfb8d8994 (diff) |
fix execute; disable verify(); bench w/ standalone
-rw-r--r-- | alee-standalone.cpp | 17 | ||||
-rw-r--r-- | forth/fib.fth | 2 | ||||
-rw-r--r-- | libalee/corewords.cpp | 12 | ||||
-rw-r--r-- | libalee/state.hpp | 14 | ||||
-rw-r--r-- | splitmemdict.hpp | 2 |
5 files changed, 36 insertions, 11 deletions
diff --git a/alee-standalone.cpp b/alee-standalone.cpp index 5681dbf..0285701 100644 --- a/alee-standalone.cpp +++ b/alee-standalone.cpp @@ -20,6 +20,7 @@ #include "splitmemdict.hpp" #include <charconv> +#include <chrono> #include <fstream> #include <iostream> #include <vector> @@ -83,6 +84,8 @@ static void load(State& state) void user_sys(State& state) { + static bool start = false; + static decltype(std::chrono::high_resolution_clock::now()) last; char buf[32] = {0}; switch (state.pop()) { @@ -103,6 +106,20 @@ void user_sys(State& state) case 4: // load load(state); break; + case 5: // time + if (!start) { + start = true; + last = std::chrono::high_resolution_clock::now(); + } else { + start = false; + auto diff = std::chrono::duration_cast<std::chrono::microseconds>( + std::chrono::high_resolution_clock::now() - last); + state.push((Cell)diff.count()); + } + break; + case 6: // double-add + { auto sum = state.popd() + state.popd(); state.pushd(sum); } + break; default: break; } diff --git a/forth/fib.fth b/forth/fib.fth index 82c87cd..671528a 100644 --- a/forth/fib.fth +++ b/forth/fib.fth @@ -9,7 +9,7 @@ 5 sys fib 5 sys >r 2drop r> ; variable avg 0 avg ! -100 constant iters +2000 constant iters : bench ( -- ) iters 0 do 100 fibbench avg +! loop diff --git a/libalee/corewords.cpp b/libalee/corewords.cpp index e323ed9..138ade4 100644 --- a/libalee/corewords.cpp +++ b/libalee/corewords.cpp @@ -40,16 +40,17 @@ void find(State& state, Word word) void CoreWords::run(Cell ins, State& state) { DoubleCell dcell; - const Addr index = ins; + Addr index = ins; auto& ip = state.ip(); +execute: if (index >= Dictionary::Begin) { // must be calling a defined subroutine state.pushr(ip); ip = index; return; } else if (index >= WordCount) { - state.push(index - WordCount); + state.push(static_cast<Cell>(index - WordCount)); } else switch (index) { case 0: // _lit state.push(state.beyondip()); @@ -148,11 +149,12 @@ void CoreWords::run(Cell ins, State& state) find(state, state.dict.input()); break; case 24: // execute - ip = state.pop(); - return; + index = state.pop(); + goto execute; case 25: // exit ip = state.popr(); - state.verify(ip != 0, Error::exit); + if (ip == 0) + state.exit(); break; case 26: // semic state.dict.add(findi("exit")); diff --git a/libalee/state.hpp b/libalee/state.hpp index 2e69463..abf7a1e 100644 --- a/libalee/state.hpp +++ b/libalee/state.hpp @@ -25,6 +25,8 @@ #include <csetjmp> #include <cstddef> +#define verify(C, E) + constexpr unsigned DataStackSize = 64; constexpr unsigned ReturnStackSize = 64; @@ -57,6 +59,10 @@ public: */ void reset(); + void exit() { + std::longjmp(context.jmpbuf, static_cast<int>(Error::exit)); + } + Addr& ip() noexcept { return context.ip; } @@ -129,10 +135,10 @@ public: return dict.read(context.ip); } - inline void verify(bool condition, Error error) { - if (!condition) - std::longjmp(context.jmpbuf, static_cast<int>(error)); - } +// inline void verify(bool condition, Error error) { +// if (!condition) +// std::longjmp(context.jmpbuf, static_cast<int>(error)); +// } private: InputFunc inputfunc; // User-provided function to collect "stdin" input. diff --git a/splitmemdict.hpp b/splitmemdict.hpp index 730d103..73b2013 100644 --- a/splitmemdict.hpp +++ b/splitmemdict.hpp @@ -36,7 +36,7 @@ class SplitMemDict : public Dictionary uint8_t extra[Dictionary::Begin]; Addr convertAddress(Addr addr) const noexcept { - return addr < RON ? addr : static_cast<Addr>(addr - RON); + return static_cast<Addr>(addr - (addr >= RON) * RON); } public: |