From da1d52033b5d726f6668fc759d09ef823f1ed593 Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Tue, 28 Jan 2025 18:19:31 -0500 Subject: [PATCH] Use contractions. --- InstructionSets/ARM/Executor.hpp | 10 ++++--- .../Implementation/PerformImplementation.hpp | 28 ++++++++++--------- .../x86/Implementation/Arithmetic.hpp | 10 ++++--- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/InstructionSets/ARM/Executor.hpp b/InstructionSets/ARM/Executor.hpp index cab1263cd..9371429d4 100644 --- a/InstructionSets/ARM/Executor.hpp +++ b/InstructionSets/ARM/Executor.hpp @@ -152,8 +152,9 @@ struct Executor { if constexpr (flags.set_condition_codes()) { // "For a subtraction, including the comparison instruction CMP, C is set to 0 if // the subtraction produced a borrow (that is, an unsigned underflow), and to 1 otherwise." - registers_.set_c(!Numeric::carried_out(lhs, rhs, conditions)); - registers_.set_v(Numeric::overflow(lhs, rhs, conditions)); + using NumOp = Numeric::Operation; + registers_.set_c(!Numeric::carried_out(lhs, rhs, conditions)); + registers_.set_v(Numeric::overflow(lhs, rhs, conditions)); } if constexpr (!is_comparison(flags.operation())) { @@ -185,8 +186,9 @@ struct Executor { } if constexpr (flags.set_condition_codes()) { - registers_.set_c(Numeric::carried_out(operand1, operand2, conditions)); - registers_.set_v(Numeric::overflow(operand1, operand2, conditions)); + using NumOp = Numeric::Operation; + registers_.set_c(Numeric::carried_out(operand1, operand2, conditions)); + registers_.set_v(Numeric::overflow(operand1, operand2, conditions)); } if constexpr (!is_comparison(flags.operation())) { diff --git a/InstructionSets/M68k/Implementation/PerformImplementation.hpp b/InstructionSets/M68k/Implementation/PerformImplementation.hpp index 52bfc4d99..2ec702b0e 100644 --- a/InstructionSets/M68k/Implementation/PerformImplementation.hpp +++ b/InstructionSets/M68k/Implementation/PerformImplementation.hpp @@ -32,8 +32,9 @@ template static void add_sub(const IntT source, IntT &destination, Status &status) { static_assert(!std::numeric_limits::is_signed); + static_assert(operation == Numeric::Operation::Add || operation == Numeric::Operation::Subtract); constexpr bool is_add = operation == Numeric::Operation::Add; - IntT result = is_add ? + IntT result = is_add ? destination + source : destination - source; status.carry_flag = is_add ? result < destination : result > destination; @@ -520,6 +521,7 @@ template < Status &status, FlowController &flow_controller ) { + using NumOp = Numeric::Operation; switch((operation != Operation::Undefined) ? operation : instruction.operation) { /* ABCD adds the lowest bytes from the source and destination using BCD arithmetic, @@ -552,20 +554,20 @@ template < // ADD and ADDA add two quantities, the latter sign extending and without setting any flags; // ADDQ and SUBQ act as ADD and SUB, but taking the second argument from the instruction code. - case Operation::ADDb: Primitive::add_sub(src.b, dest.b, status); break; - case Operation::SUBb: Primitive::add_sub(src.b, dest.b, status); break; - case Operation::ADDXb: Primitive::add_sub(src.b, dest.b, status); break; - case Operation::SUBXb: Primitive::add_sub(src.b, dest.b, status); break; + case Operation::ADDb: Primitive::add_sub(src.b, dest.b, status); break; + case Operation::SUBb: Primitive::add_sub(src.b, dest.b, status); break; + case Operation::ADDXb: Primitive::add_sub(src.b, dest.b, status); break; + case Operation::SUBXb: Primitive::add_sub(src.b, dest.b, status); break; - case Operation::ADDw: Primitive::add_sub(src.w, dest.w, status); break; - case Operation::SUBw: Primitive::add_sub(src.w, dest.w, status); break; - case Operation::ADDXw: Primitive::add_sub(src.w, dest.w, status); break; - case Operation::SUBXw: Primitive::add_sub(src.w, dest.w, status); break; + case Operation::ADDw: Primitive::add_sub(src.w, dest.w, status); break; + case Operation::SUBw: Primitive::add_sub(src.w, dest.w, status); break; + case Operation::ADDXw: Primitive::add_sub(src.w, dest.w, status); break; + case Operation::SUBXw: Primitive::add_sub(src.w, dest.w, status); break; - case Operation::ADDl: Primitive::add_sub(src.l, dest.l, status); break; - case Operation::SUBl: Primitive::add_sub(src.l, dest.l, status); break; - case Operation::ADDXl: Primitive::add_sub(src.l, dest.l, status); break; - case Operation::SUBXl: Primitive::add_sub(src.l, dest.l, status); break; + case Operation::ADDl: Primitive::add_sub(src.l, dest.l, status); break; + case Operation::SUBl: Primitive::add_sub(src.l, dest.l, status); break; + case Operation::ADDXl: Primitive::add_sub(src.l, dest.l, status); break; + case Operation::SUBXl: Primitive::add_sub(src.l, dest.l, status); break; case Operation::ADDAw: dest.l += u_extend16(src.w); break; case Operation::ADDAl: dest.l += src.l; break; diff --git a/InstructionSets/x86/Implementation/Arithmetic.hpp b/InstructionSets/x86/Implementation/Arithmetic.hpp index 0c903321a..ac7cafaa0 100644 --- a/InstructionSets/x86/Implementation/Arithmetic.hpp +++ b/InstructionSets/x86/Implementation/Arithmetic.hpp @@ -30,12 +30,13 @@ void add( */ const IntT result = destination + source + (with_carry ? context.flags.template carry_bit() : 0); + using NumOp = Numeric::Operation; context.flags.template set_from( - Numeric::carried_out() - 1>(destination, source, result)); + Numeric::carried_out() - 1>(destination, source, result)); context.flags.template set_from( Numeric::carried_in<4>(destination, source, result)); context.flags.template set_from( - Numeric::overflow(destination, source, result)); + Numeric::overflow(destination, source, result)); context.flags.template set_from(result); @@ -56,12 +57,13 @@ void sub( */ const IntT result = destination - source - (with_borrow ? context.flags.template carry_bit() : 0); + using NumOp = Numeric::Operation; context.flags.template set_from( - Numeric::carried_out() - 1>(destination, source, result)); + Numeric::carried_out() - 1>(destination, source, result)); context.flags.template set_from( Numeric::carried_in<4>(destination, source, result)); context.flags.template set_from( - Numeric::overflow(destination, source, result)); + Numeric::overflow(destination, source, result)); context.flags.template set_from(result);