From e7c2eeb6c82d5341019cbb00cfefc55c8a27f232 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sun, 26 Jun 2022 21:48:45 -0700 Subject: Move a bunch of code from headers to separate compilation units. --- Makefile | 23 +++-- aisa/aisa.cpp | 14 +++ aisa/aisa.h | 6 +- fib/fib.cpp | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fib/fib.d | 1 + fib/fib.h | 34 +++++++ isa/fib/fib.h | 288 ---------------------------------------------------------- main.cpp | 6 +- 8 files changed, 353 insertions(+), 302 deletions(-) create mode 100644 aisa/aisa.cpp create mode 100644 fib/fib.cpp create mode 100644 fib/fib.d create mode 100644 fib/fib.h delete mode 100644 isa/fib/fib.h diff --git a/Makefile b/Makefile index ed96817..be9dc32 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ CHRONIC ?= chronic PKGS := fmt PKG_FLAGS := $(shell pkg-config --cflags ${PKGS}) -PKG_LIBS := -Wl,--push-state,--as-needed $(shell pkg-config --libs ${PKGS}) -Wl,--pop-state +PKG_LIBS := -Wl,--push-state,--as-needed,--start-group $(shell pkg-config --libs ${PKGS}) -Wl,--end-group,--pop-state CXXFLAGS := -Wall -Werror -std=c++20 -fPIC -iquote . ${PKG_FLAGS} ${OPTIMIZE} ${DEBUG} @@ -28,7 +28,7 @@ endef export GITTAGCPP ifneq ($(shell which ${IWYU}),) -iwyu = ${CHRONIC} ${IWYU} -Xiwyu --error -Xiwyu --mapping_file=tools/iwyu.imp ${CXXFLAGS} $(1) +iwyu = ${CHRONIC} ${IWYU} -Xiwyu --error -Xiwyu --mapping_file=tools/iwyu.imp -Xiwyu --no_fwd_decls ${CXXFLAGS} $(1) else $(warning Not using IWYU) iwyu = @@ -36,6 +36,10 @@ endif libname = $(shell realpath --canonicalize-missing --relative-to . build/$(dir $(1))/lib$(notdir $(1))) +define mksodeps = +$(1)_SODEPS := +endef + define mklib = ifneq ($(wildcard $(1)/*.cpp),) @@ -44,9 +48,9 @@ $(call libname,$(1).a): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) @mkdir -p $$(dir $$@) $${AR} cr $$@ $$+ -$(call libname,$(1).so): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) +$(call libname,$(1).so): $(patsubst %.cpp,build/%.o,$(wildcard $(1)/*.cpp)) $${$(1)_SODEPS} @mkdir -p $$(dir $$@) - $${CXX} $${CXXFLAGS} -shared -o $$@ $$+ ${PKG_LIBS} + $${CXX} $${CXXFLAGS} -shared -o $$@ -Wl,--start-group $$+ -Wl,--end-group PARTARS += $(call libname,$(1).a) PARTSOS += $(call libname,$(1).so) @@ -73,6 +77,11 @@ PARTARS := PARTSOS := IWYU_CPPS := +$(foreach part,${PARTS},$(eval $(call mksodeps,${part}))) + +DEPFILES := $(shell find -mindepth 1 -name .\* -prune -o -type f -name \*.d -print) +include ${DEPFILES} + $(foreach part,${PARTS},$(eval $(call mklib,${part}))) MAINOBJS := $(patsubst %.cpp,build/%.o,$(wildcard *.cpp)) @@ -92,11 +101,11 @@ issim-static: build/issim-static build/issim-dynamic: ${MAINOBJS} ${PARTSOS} @mkdir -p $(dir $@) - ${CXX} ${CXXFLAGS} -o $@ $+ ${PKG_LIBS} + ${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS} build/issim-static: ${MAINOBJS} ${PARTARS} @mkdir -p $(dir $@) - ${CXX} ${CXXFLAGS} -o $@ $+ ${PKG_LIBS} + ${CXX} ${CXXFLAGS} -o $@ -Wl,--start-group $+ -Wl,--end-group ${PKG_LIBS} clean: rm -rf build issim issim-static @@ -107,8 +116,6 @@ build/git-tag.cpp: @echo "$$GITTAGCPP" > $@ .PHONY: build/git-tag.cpp -include $(shell find -type f -name \*.d) - build/%.o: %.cpp @mkdir -p $(dir $@) @$(call iwyu,$<) diff --git a/aisa/aisa.cpp b/aisa/aisa.cpp new file mode 100644 index 0000000..811c882 --- /dev/null +++ b/aisa/aisa.cpp @@ -0,0 +1,14 @@ +#include +#include +#include + +#include "aisa/aisa.h" + +namespace aisa { + + std::optional, regval_t>> Task::step(regval_t environment_val) const { return {}; } + + MemInfo Step::meminfo(const Wires &wires) const { return {}; } + void Step::evaluate(Wires &wires) const { } + +} diff --git a/aisa/aisa.h b/aisa/aisa.h index 4488529..e4e1074 100644 --- a/aisa/aisa.h +++ b/aisa/aisa.h @@ -31,7 +31,7 @@ namespace aisa { virtual std::string disasm() const = 0; - virtual std::optional, regval_t>> step(regval_t environment_val) const { return {}; } + virtual std::optional, regval_t>> step(regval_t environment_val) const; }; struct MemInfo { @@ -78,8 +78,8 @@ namespace aisa { MOp mop = MOp::NONE; - virtual MemInfo meminfo(const Wires &wires) const { return {}; } - virtual void evaluate(Wires &wires) const { }; + virtual MemInfo meminfo(const Wires &wires) const; + virtual void evaluate(Wires &wires) const; }; } diff --git a/fib/fib.cpp b/fib/fib.cpp new file mode 100644 index 0000000..8ff7718 --- /dev/null +++ b/fib/fib.cpp @@ -0,0 +1,283 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "aisa/aisa.h" +#include "fib/fib.h" + +namespace fib { + + namespace Reg { + + const char *disasm(aisa::regnum_t x) + { + switch (x) { + case ENV_TOP: return "ENV_TOP"; + case ENV_FIB: return "ENV_FIB"; + case AREG: return "AREG"; + case ATMP: return "ATMP"; + case PC: return "PC"; + case A: return "A"; + case B: return "B"; + case Q: return "Q"; + default: return "???"; + } + } + + } + + struct StepAdd : public aisa::Step { + StepAdd(aisa::regnum_t q, aisa::regnum_t a, aisa::regnum_t b) + { + source_regs.resize(2); + source_regs[0] = a; + source_regs[1] = b; + + destination_regs.resize(1); + destination_regs[0] = q; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("{}({}) <- {}({}) + {}({})", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0], Reg::disasm(source_regs[1]), w->source_vals[1]); + return fmt::format("{} <- {} + {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0]), Reg::disasm(source_regs[1])); + } + + void evaluate(aisa::Wires &w) const override + { + w.destination_vals.resize(1); + w.destination_vals[0] = w.source_vals[0] + w.source_vals[1]; + } + }; + + struct StepAddImmediate : public aisa::Step { + aisa::regval_t x; + + StepAddImmediate(aisa::regnum_t q, aisa::regnum_t a, aisa::regval_t x) + :x(x) + { + source_regs.resize(1); + source_regs[0] = a; + + destination_regs.resize(1); + destination_regs[0] = q; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("{}({}) <- {}({}) + {}", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0], x); + return fmt::format("{} <- {} + {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0]), x); + } + + void evaluate(aisa::Wires &w) const override + { + w.destination_vals.resize(1); + w.destination_vals[0] = w.source_vals[0] + x; + } + }; + + template struct StepLoad : public aisa::Step { + StepLoad(aisa::regnum_t q, aisa::regnum_t a) + { + source_regs.resize(1); + source_regs[0] = a; + + destination_regs.resize(1); + destination_regs[0] = q; + + mop = aisa::MOp::LOAD; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("{}({}) <- [{}({})]", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0]); + return fmt::format("{} <- [{}]", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0])); + } + + aisa::MemInfo meminfo(const aisa::Wires &w) const override + { + aisa::MemInfo mi; + mi.physical_addr = w.source_vals[0] * WORD; + mi.size = WORD; + return mi; + } + + void evaluate(aisa::Wires &w) const override + { + w.destination_vals.resize(1); + auto &q = w.destination_vals[0]; + q = 0; + for (unsigned int i = 0; i < WORD; ++i) + q |= static_cast(w.memory_val[i]) << (8 * i); + } + }; + + struct StepMove : public aisa::Step { + StepMove(aisa::regnum_t q, aisa::regnum_t a) + { + source_regs.resize(1); + source_regs[0] = a; + + destination_regs.resize(1); + destination_regs[0] = q; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("{}({}) <- {}({})", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0]); + return fmt::format("{} <- {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0])); + } + + void evaluate(aisa::Wires &w) const override + { + w.destination_vals = w.source_vals; + } + }; + + struct StepMoveImmediate : public aisa::Step { + aisa::regval_t x; + + StepMoveImmediate(aisa::regnum_t q, aisa::regval_t x) + : x(x) + { + destination_regs.resize(1); + destination_regs[0] = q; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("{}({}) <- {}", Reg::disasm(destination_regs[0]), w->destination_vals[0], x); + return fmt::format("{} <- {}", Reg::disasm(destination_regs[0]), x); + } + + void evaluate(aisa::Wires &w) const override + { + w.destination_vals.resize(1); + w.destination_vals[0] = x; + } + }; + + template struct StepSpawn : public aisa::Step { + void evaluate(aisa::Wires &w) const override + { + w.new_task = {std::make_unique(), 0}; + } + + std::string disasm(const aisa::Wires *w) const override + { + return fmt::format("spawn"); + } + }; + + template struct StepStore : public aisa::Step { + StepStore(aisa::regnum_t a, aisa::regnum_t d) + { + source_regs.resize(2); + source_regs[0] = a; + source_regs[1] = d; + + mop = aisa::MOp::STORE; + } + + std::string disasm(const aisa::Wires *w) const override + { + if (w) + return fmt::format("[{}({})] <- {}({})", Reg::disasm(source_regs[0]), w->source_vals[0], Reg::disasm(source_regs[1]), w->source_vals[1]); + return fmt::format("[{}] <- {}", Reg::disasm(source_regs[0]), Reg::disasm(source_regs[1])); + } + + aisa::MemInfo meminfo(const aisa::Wires &w) const override + { + aisa::MemInfo mi; + mi.physical_addr = w.source_vals[0] * WORD; + mi.size = WORD; + return mi; + } + + void evaluate(aisa::Wires &w) const override + { + w.memory_val.resize(WORD); + for (unsigned int i = 0; i < WORD; ++i) + w.memory_val[i] = w.source_vals[1] >> (8 * i); + } + }; + + template struct TaskFib : public aisa::Task { + TaskFib() + { + environment = Reg::ENV_FIB; + } + + std::string disasm() const override + { + return "fib"; + } + + std::optional, aisa::regval_t>> step(aisa::regval_t env) const override + { + switch (env) { + case 0: return {{std::make_unique>(Reg::A, Reg::PC), env+1}}; + case 1: return {{std::make_unique(Reg::PC, Reg::PC, 1), env+1}}; + case 2: return {{std::make_unique>(Reg::B, Reg::PC), env+1}}; + case 3: return {{std::make_unique(Reg::AREG, Reg::PC, 1), env+1}}; + case 4: return {{std::make_unique(Reg::Q, Reg::A, Reg::B), env+1}}; + case 5: return {{std::make_unique>(Reg::AREG, Reg::Q), env+1}}; + } + + return {}; + } + }; + + template struct TaskTop : public aisa::Task { + TaskTop() + { + environment = Reg::ENV_TOP; + } + + std::string disasm() const override + { + return "top"; + } + + std::optional, aisa::regval_t>> step(aisa::regval_t env) const override + { + switch (env) { + case 0: return {{std::make_unique(Reg::PC, 0), env+1}}; + case 1: return {{std::make_unique(Reg::AREG, 0), env+1}}; + case 2: return {{std::make_unique(Reg::ATMP, 0), env+1}}; + case 3: return {{std::make_unique>(Reg::AREG, Reg::ATMP), env+1}}; + case 4: return {{std::make_unique(Reg::AREG, 1), env+1}}; + case 5: return {{std::make_unique(Reg::ATMP, 1), env+1}}; + case 6: return {{std::make_unique>(Reg::AREG, Reg::ATMP), env+1}}; + case 7: return {{std::make_unique>>(), env}}; + } + + return {}; + } + }; + + template std::pair, aisa::regval_t> Fib::initial_task() const + { + auto t = std::make_unique>(); + return {std::move(t), 0}; + } + + template struct Fib<1>; + template struct Fib<2>; + template struct Fib<3>; + template struct Fib<4>; + template struct Fib<5>; + template struct Fib<6>; + template struct Fib<7>; + template struct Fib<8>; + +} diff --git a/fib/fib.d b/fib/fib.d new file mode 100644 index 0000000..a6d18cc --- /dev/null +++ b/fib/fib.d @@ -0,0 +1 @@ +fib_SODEPS += build/libaisa.so diff --git a/fib/fib.h b/fib/fib.h new file mode 100644 index 0000000..6719d06 --- /dev/null +++ b/fib/fib.h @@ -0,0 +1,34 @@ +#pragma once + +#include +#include + +#include "aisa/aisa.h" + +namespace fib { + + namespace Reg { + + enum { + ENV_TOP, + ENV_FIB, + + AREG, + ATMP, + + PC, + + A, + B, + Q, + }; + + const char *disasm(aisa::regnum_t x); + + } + + template struct Fib : public aisa::ISA { + std::pair, aisa::regval_t> initial_task() const override; + }; + +} diff --git a/isa/fib/fib.h b/isa/fib/fib.h deleted file mode 100644 index 13801c8..0000000 --- a/isa/fib/fib.h +++ /dev/null @@ -1,288 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - -#include "aisa/aisa.h" - -namespace isa::fib { - - namespace Reg { - enum { - ENV_TOP, - ENV_FIB, - - AREG, - ATMP, - - PC, - - A, - B, - Q, - }; - - const char *disasm(aisa::regnum_t x) - { - switch (x) { - case ENV_TOP: return "ENV_TOP"; - case ENV_FIB: return "ENV_FIB"; - case AREG: return "AREG"; - case ATMP: return "ATMP"; - case PC: return "PC"; - case A: return "A"; - case B: return "B"; - case Q: return "Q"; - default: return "???"; - } - } - } - - struct StepAdd : public aisa::Step { - StepAdd(aisa::regnum_t q, aisa::regnum_t a, aisa::regnum_t b) - { - source_regs.resize(2); - source_regs[0] = a; - source_regs[1] = b; - - destination_regs.resize(1); - destination_regs[0] = q; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("{}({}) <- {}({}) + {}({})", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0], Reg::disasm(source_regs[1]), w->source_vals[1]); - return fmt::format("{} <- {} + {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0]), Reg::disasm(source_regs[1])); - } - - void evaluate(aisa::Wires &w) const override - { - w.destination_vals.resize(1); - w.destination_vals[0] = w.source_vals[0] + w.source_vals[1]; - } - }; - - struct StepAddImmediate : public aisa::Step { - aisa::regval_t x; - - StepAddImmediate(aisa::regnum_t q, aisa::regnum_t a, aisa::regval_t x) - :x(x) - { - source_regs.resize(1); - source_regs[0] = a; - - destination_regs.resize(1); - destination_regs[0] = q; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("{}({}) <- {}({}) + {}", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0], x); - return fmt::format("{} <- {} + {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0]), x); - } - - void evaluate(aisa::Wires &w) const override - { - w.destination_vals.resize(1); - w.destination_vals[0] = w.source_vals[0] + x; - } - }; - - template struct StepLoad : public aisa::Step { - StepLoad(aisa::regnum_t q, aisa::regnum_t a) - { - source_regs.resize(1); - source_regs[0] = a; - - destination_regs.resize(1); - destination_regs[0] = q; - - mop = aisa::MOp::LOAD; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("{}({}) <- [{}({})]", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0]); - return fmt::format("{} <- [{}]", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0])); - } - - aisa::MemInfo meminfo(const aisa::Wires &w) const override - { - aisa::MemInfo mi; - mi.physical_addr = w.source_vals[0] * WORD; - mi.size = WORD; - return mi; - } - - void evaluate(aisa::Wires &w) const override - { - w.destination_vals.resize(1); - auto &q = w.destination_vals[0]; - q = 0; - for (unsigned int i = 0; i < WORD; ++i) - q |= static_cast(w.memory_val[i]) << (8 * i); - } - }; - - struct StepMove : public aisa::Step { - StepMove(aisa::regnum_t q, aisa::regnum_t a) - { - source_regs.resize(1); - source_regs[0] = a; - - destination_regs.resize(1); - destination_regs[0] = q; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("{}({}) <- {}({})", Reg::disasm(destination_regs[0]), w->destination_vals[0], Reg::disasm(source_regs[0]), w->source_vals[0]); - return fmt::format("{} <- {}", Reg::disasm(destination_regs[0]), Reg::disasm(source_regs[0])); - } - - void evaluate(aisa::Wires &w) const override - { - w.destination_vals = w.source_vals; - } - }; - - struct StepMoveImmediate : public aisa::Step { - aisa::regval_t x; - - StepMoveImmediate(aisa::regnum_t q, aisa::regval_t x) - : x(x) - { - destination_regs.resize(1); - destination_regs[0] = q; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("{}({}) <- {}", Reg::disasm(destination_regs[0]), w->destination_vals[0], x); - return fmt::format("{} <- {}", Reg::disasm(destination_regs[0]), x); - } - - void evaluate(aisa::Wires &w) const override - { - w.destination_vals.resize(1); - w.destination_vals[0] = x; - } - }; - - template struct StepSpawn : public aisa::Step { - void evaluate(aisa::Wires &w) const override - { - w.new_task = {std::make_unique(), 0}; - } - - std::string disasm(const aisa::Wires *w) const override - { - return fmt::format("spawn"); - } - }; - - template struct StepStore : public aisa::Step { - StepStore(aisa::regnum_t a, aisa::regnum_t d) - { - source_regs.resize(2); - source_regs[0] = a; - source_regs[1] = d; - - mop = aisa::MOp::STORE; - } - - std::string disasm(const aisa::Wires *w) const override - { - if (w) - return fmt::format("[{}({})] <- {}({})", Reg::disasm(source_regs[0]), w->source_vals[0], Reg::disasm(source_regs[1]), w->source_vals[1]); - return fmt::format("[{}] <- {}", Reg::disasm(source_regs[0]), Reg::disasm(source_regs[1])); - } - - aisa::MemInfo meminfo(const aisa::Wires &w) const override - { - aisa::MemInfo mi; - mi.physical_addr = w.source_vals[0] * WORD; - mi.size = WORD; - return mi; - } - - void evaluate(aisa::Wires &w) const override - { - w.memory_val.resize(WORD); - for (unsigned int i = 0; i < WORD; ++i) - w.memory_val[i] = w.source_vals[1] >> (8 * i); - } - }; - - template struct TaskFib : public aisa::Task { - TaskFib() - { - environment = Reg::ENV_FIB; - } - - std::string disasm() const override - { - return "fib"; - } - - std::optional, aisa::regval_t>> step(aisa::regval_t env) const override - { - switch (env) { - case 0: return {{std::make_unique>(Reg::A, Reg::PC), env+1}}; - case 1: return {{std::make_unique(Reg::PC, Reg::PC, 1), env+1}}; - case 2: return {{std::make_unique>(Reg::B, Reg::PC), env+1}}; - case 3: return {{std::make_unique(Reg::AREG, Reg::PC, 1), env+1}}; - case 4: return {{std::make_unique(Reg::Q, Reg::A, Reg::B), env+1}}; - case 5: return {{std::make_unique>(Reg::AREG, Reg::Q), env+1}}; - } - - return {}; - } - }; - - template struct TaskTop : public aisa::Task { - TaskTop() - { - environment = Reg::ENV_TOP; - } - - std::string disasm() const override - { - return "top"; - } - - std::optional, aisa::regval_t>> step(aisa::regval_t env) const override - { - switch (env) { - case 0: return {{std::make_unique(Reg::PC, 0), env+1}}; - case 1: return {{std::make_unique(Reg::AREG, 0), env+1}}; - case 2: return {{std::make_unique(Reg::ATMP, 0), env+1}}; - case 3: return {{std::make_unique>(Reg::AREG, Reg::ATMP), env+1}}; - case 4: return {{std::make_unique(Reg::AREG, 1), env+1}}; - case 5: return {{std::make_unique(Reg::ATMP, 1), env+1}}; - case 6: return {{std::make_unique>(Reg::AREG, Reg::ATMP), env+1}}; - case 7: return {{std::make_unique>>(), env}}; - } - - return {}; - } - }; - - template struct Fib : public aisa::ISA { - std::pair, aisa::regval_t> initial_task() const override - { - auto t = std::make_unique>(); - return {std::move(t), 0}; - } - }; - -} diff --git a/main.cpp b/main.cpp index f172226..4bd455a 100644 --- a/main.cpp +++ b/main.cpp @@ -8,8 +8,8 @@ #include "aisa/aisa.h" #include "aisa/async.h" #include "aisa/simple-models.h" +#include "fib/fib.h" #include "git-tag.h" -#include "isa/fib/fib.h" const bool show_mem_fetch = false; const bool show_mem_store = true; @@ -21,7 +21,7 @@ int main(int argc, const char *argv[]) { std::cout << "Version " << GIT_TAG << "\n"; - isa::fib::Fib<2> fib; + fib::Fib<2> fib; struct Eval : public aisa::AsyncEval, aisa::PagedMem<>, aisa::TaskStack, aisa::VectorRF { bool fetch_mem(aisa::byte_t *bytes, aisa::addr_t addr, aisa::addr_t size) @@ -55,7 +55,7 @@ int main(int argc, const char *argv[]) { if (aisa::VectorRF::store_reg(rn, rv)) { if (show_regs) - fmt::print(".{} = {}\n", isa::fib::Reg::disasm(rn), rv); + fmt::print(".{} = {}\n", fib::Reg::disasm(rn), rv); return true; } return false; -- cgit v1.2.3