aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorClyne Sullivan <clyne@bitgloo.com>2023-11-09 08:08:38 -0500
committerClyne Sullivan <clyne@bitgloo.com>2023-11-09 08:08:38 -0500
commit3dc947a7575bd23703644996d8e853e5e618b2e3 (patch)
treec91ff763003cb1b83f76c31b0948ff8699280f57
parentb33c0c564c51252ff241a2143e467dadfb8d8994 (diff)
fix execute; disable verify(); bench w/ standalone
-rw-r--r--alee-standalone.cpp17
-rw-r--r--forth/fib.fth2
-rw-r--r--libalee/corewords.cpp12
-rw-r--r--libalee/state.hpp14
-rw-r--r--splitmemdict.hpp2
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: