From d56d00d239dce6766947149f721b2f051db02e46 Mon Sep 17 00:00:00 2001 From: Julian Blake Kongslie Date: Sat, 5 Nov 2022 13:28:18 -0700 Subject: Stricter and more accurate decoder for RMF instruction --- isa/decode.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/isa/decode.cpp b/isa/decode.cpp index 5484234..745e529 100644 --- a/isa/decode.cpp +++ b/isa/decode.cpp @@ -288,13 +288,22 @@ instruction_context decode(std::uint_fast32_t flags, unsigned int pc, unsigned i }; break; case 04: - // RMF restore memory field - inst.read_ctlreg = FLAGS_SAVED; - inst.write_ctlreg = FLAGS; - inst.ef = [flags](auto &ctx) { - ctx.ctlval.value() &= FLAG_DF | FLAG_IF | FLAG_USER_MODE; - ctx.ctlval.value() |= flags & ~(FLAG_DF | FLAG_IF | FLAG_USER_MODE); - }; + switch (field) { + case 04: + // RMF restore memory field + inst.read_ctlreg = FLAGS_SAVED; + inst.write_ctlreg = FLAGS; + inst.ef = [flags](auto &ctx) { + ctx.ctlval.value() &= FLAG_DF | FLAG_IF | FLAG_USER_MODE; + ctx.ctlval.value() |= flags & ~(FLAG_DF | FLAG_IF | FLAG_USER_MODE); + }; + break; + default: + inst.ef = [bits, field](auto &ctx) { + std::cerr << "unimplemented IOT MEMORY suboperation " << (bits & 07) << " upon field " << field << "\n"; + assert(false); + }; + } break; default: inst.ef = [bits, field](auto &ctx) { -- cgit v1.2.3