diff --git a/InstructionSets/x86/AccessType.hpp b/InstructionSets/x86/AccessType.hpp index b666c59ea..bba27e948 100644 --- a/InstructionSets/x86/AccessType.hpp +++ b/InstructionSets/x86/AccessType.hpp @@ -31,6 +31,10 @@ enum class AccessType { PreauthorisedRead, }; +constexpr bool is_writeable(AccessType type) { + return type == AccessType::ReadModifyWrite || type == AccessType::Write; +} + template struct Accessor; // Reads: return a value directly. diff --git a/InstructionSets/x86/Implementation/PerformImplementation.hpp b/InstructionSets/x86/Implementation/PerformImplementation.hpp index 495363122..713ca3141 100644 --- a/InstructionSets/x86/Implementation/PerformImplementation.hpp +++ b/InstructionSets/x86/Implementation/PerformImplementation.hpp @@ -306,7 +306,7 @@ void sub( context.flags.template set_from(result); - if constexpr (destination_type == AccessType::Write) { + if constexpr (is_writeable(destination_type)) { destination = result; } } @@ -1536,7 +1536,7 @@ template < // // (though GCC offers C++20 syntax as an extension, and Clang seems to follow along, so maybe I'm overthinking) IntT immediate; - const auto source_r = [&]() -> IntT { + const auto source_r = [&]() -> read_t { return resolve( instruction, instruction.source().source(), @@ -1545,7 +1545,7 @@ template < nullptr, &immediate); }; - const auto source_rmw = [&]() -> IntT& { + const auto source_rmw = [&]() -> modify_t { return resolve( instruction, instruction.source().source(), @@ -1554,7 +1554,7 @@ template < nullptr, &immediate); }; - const auto destination_r = [&]() -> IntT { + const auto destination_r = [&]() -> read_t { return resolve( instruction, instruction.destination().source(), @@ -1563,7 +1563,7 @@ template < nullptr, &immediate); }; - const auto destination_w = [&]() -> IntT& { + const auto destination_w = [&]() -> write_t { return resolve( instruction, instruction.destination().source(), @@ -1572,7 +1572,7 @@ template < nullptr, &immediate); }; - const auto destination_rmw = [&]() -> IntT& { + const auto destination_rmw = [&]() -> modify_t { return resolve( instruction, instruction.destination().source(), @@ -1762,7 +1762,7 @@ template < case Operation::XCHG: Primitive::xchg(destination_rmw(), source_rmw()); break; - case Operation::SALC: Primitive::salc(context.registers.al(), context); return; + case Operation::SALC: Primitive::salc(context.registers.al(), context); return; case Operation::SETMO: if constexpr (ContextT::model == Model::i8086) { Primitive::setmo(destination_w(), context);