diff options
| author | Julian Blake Kongslie | 2022-07-02 13:45:09 -0700 |
|---|---|---|
| committer | Julian Blake Kongslie | 2022-07-02 13:45:09 -0700 |
| commit | c72951a36d6cb9775dc1ecd9bc26bc13e796f10c (patch) | |
| tree | 5a8fe196beba5c7c674d1b3d627c9a0beac849f5 /fib | |
| parent | Trivial code reorg. (diff) | |
| download | issim-c72951a36d6cb9775dc1ecd9bc26bc13e796f10c.tar.xz | |
Dropping the async interface, and adding some real uarch.
Diffstat (limited to '')
| -rw-r--r-- | fib/fib.cpp | 51 | ||||
| -rw-r--r-- | fib/fib.h | 1 |
2 files changed, 38 insertions, 14 deletions
diff --git a/fib/fib.cpp b/fib/fib.cpp index 8ff7718..8e0cdf2 100644 --- a/fib/fib.cpp +++ b/fib/fib.cpp | |||
| @@ -225,12 +225,39 @@ namespace fib { | |||
| 225 | std::optional<std::pair<std::unique_ptr<const aisa::Step>, aisa::regval_t>> step(aisa::regval_t env) const override | 225 | std::optional<std::pair<std::unique_ptr<const aisa::Step>, aisa::regval_t>> step(aisa::regval_t env) const override |
| 226 | { | 226 | { |
| 227 | switch (env) { | 227 | switch (env) { |
| 228 | case 0: return {{std::make_unique<StepLoad<WORD>>(Reg::A, Reg::PC), env+1}}; | 228 | case 0: return {{std::make_unique<StepMove>(Reg::AREG, Reg::PC), env+1}}; |
| 229 | case 1: return {{std::make_unique<StepAddImmediate>(Reg::PC, Reg::PC, 1), env+1}}; | 229 | case 1: return {{std::make_unique<StepLoad<WORD>>(Reg::A, Reg::AREG), env+1}}; |
| 230 | case 2: return {{std::make_unique<StepLoad<WORD>>(Reg::B, Reg::PC), env+1}}; | 230 | case 2: return {{std::make_unique<StepAddImmediate>(Reg::AREG, Reg::AREG, 1), env+1}}; |
| 231 | case 3: return {{std::make_unique<StepAddImmediate>(Reg::AREG, Reg::PC, 1), env+1}}; | 231 | case 3: return {{std::make_unique<StepLoad<WORD>>(Reg::B, Reg::AREG), env+1}}; |
| 232 | case 4: return {{std::make_unique<StepAdd>(Reg::Q, Reg::A, Reg::B), env+1}}; | 232 | case 4: return {{std::make_unique<StepAddImmediate>(Reg::AREG, Reg::AREG, 1), env+1}}; |
| 233 | case 5: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::Q), env+1}}; | 233 | case 5: return {{std::make_unique<StepAdd>(Reg::Q, Reg::A, Reg::B), env+1}}; |
| 234 | case 6: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::Q), env+1}}; | ||
| 235 | } | ||
| 236 | |||
| 237 | return {}; | ||
| 238 | } | ||
| 239 | }; | ||
| 240 | |||
| 241 | template<unsigned int WORD> struct TaskInit : public aisa::Task { | ||
| 242 | TaskInit() | ||
| 243 | { | ||
| 244 | environment = Reg::ENV_INIT; | ||
| 245 | } | ||
| 246 | |||
| 247 | std::string disasm() const override | ||
| 248 | { | ||
| 249 | return "init"; | ||
| 250 | } | ||
| 251 | |||
| 252 | std::optional<std::pair<std::unique_ptr<const aisa::Step>, aisa::regval_t>> step(aisa::regval_t env) const override | ||
| 253 | { | ||
| 254 | switch(env) { | ||
| 255 | case 0: return {{std::make_unique<StepMoveImmediate>(Reg::AREG, 0), env+1}}; | ||
| 256 | case 1: return {{std::make_unique<StepMoveImmediate>(Reg::ATMP, 0), env+1}}; | ||
| 257 | case 2: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::ATMP), env+1}}; | ||
| 258 | case 3: return {{std::make_unique<StepMoveImmediate>(Reg::AREG, 1), env+1}}; | ||
| 259 | case 4: return {{std::make_unique<StepMoveImmediate>(Reg::ATMP, 1), env+1}}; | ||
| 260 | case 5: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::ATMP), env+1}}; | ||
| 234 | } | 261 | } |
| 235 | 262 | ||
| 236 | return {}; | 263 | return {}; |
| @@ -251,14 +278,10 @@ namespace fib { | |||
| 251 | std::optional<std::pair<std::unique_ptr<const aisa::Step>, aisa::regval_t>> step(aisa::regval_t env) const override | 278 | std::optional<std::pair<std::unique_ptr<const aisa::Step>, aisa::regval_t>> step(aisa::regval_t env) const override |
| 252 | { | 279 | { |
| 253 | switch (env) { | 280 | switch (env) { |
| 254 | case 0: return {{std::make_unique<StepMoveImmediate>(Reg::PC, 0), env+1}}; | 281 | case 0: return {{std::make_unique<StepSpawn<TaskInit<WORD>>>(), env+1}}; |
| 255 | case 1: return {{std::make_unique<StepMoveImmediate>(Reg::AREG, 0), env+1}}; | 282 | case 1: return {{std::make_unique<StepMoveImmediate>(Reg::PC, 0), env+1}}; |
| 256 | case 2: return {{std::make_unique<StepMoveImmediate>(Reg::ATMP, 0), env+1}}; | 283 | case 2: return {{std::make_unique<StepSpawn<TaskFib<WORD>>>(), env+1}}; |
| 257 | case 3: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::ATMP), env+1}}; | 284 | case 3: return {{std::make_unique<StepAddImmediate>(Reg::PC, Reg::PC, 1), env-1}}; |
| 258 | case 4: return {{std::make_unique<StepMoveImmediate>(Reg::AREG, 1), env+1}}; | ||
| 259 | case 5: return {{std::make_unique<StepMoveImmediate>(Reg::ATMP, 1), env+1}}; | ||
| 260 | case 6: return {{std::make_unique<StepStore<WORD>>(Reg::AREG, Reg::ATMP), env+1}}; | ||
| 261 | case 7: return {{std::make_unique<StepSpawn<TaskFib<WORD>>>(), env}}; | ||
| 262 | } | 285 | } |
| 263 | 286 | ||
| 264 | return {}; | 287 | return {}; |
| @@ -11,6 +11,7 @@ namespace fib { | |||
| 11 | 11 | ||
| 12 | enum { | 12 | enum { |
| 13 | ENV_TOP, | 13 | ENV_TOP, |
| 14 | ENV_INIT, | ||
| 14 | ENV_FIB, | 15 | ENV_FIB, |
| 15 | 16 | ||
| 16 | AREG, | 17 | AREG, |
