diff options
Diffstat (limited to 'fib/fib.cpp')
| -rw-r--r-- | fib/fib.cpp | 51 |
1 files changed, 37 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 {}; |
