summaryrefslogtreecommitdiff
path: root/fib/fib.cpp
diff options
context:
space:
mode:
authorJulian Blake Kongslie2022-07-02 13:45:09 -0700
committerJulian Blake Kongslie2022-07-02 13:45:09 -0700
commitc72951a36d6cb9775dc1ecd9bc26bc13e796f10c (patch)
tree5a8fe196beba5c7c674d1b3d627c9a0beac849f5 /fib/fib.cpp
parentTrivial code reorg. (diff)
downloadissim-c72951a36d6cb9775dc1ecd9bc26bc13e796f10c.tar.xz
Dropping the async interface, and adding some real uarch.
Diffstat (limited to '')
-rw-r--r--fib/fib.cpp51
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 {};