diff options
Diffstat (limited to 'inc')
-rw-r--r-- | inc/definitions.h | 6 | ||||
-rw-r--r-- | inc/ex.h | 18 | ||||
-rw-r--r-- | inc/instr.h | 1 | ||||
-rw-r--r-- | inc/stage.h | 18 |
4 files changed, 42 insertions, 1 deletions
diff --git a/inc/definitions.h b/inc/definitions.h index 3238a8b..c81c4e3 100644 --- a/inc/definitions.h +++ b/inc/definitions.h @@ -77,6 +77,12 @@ #define OPCODE_SIZE 4 /** + * The maximum value an integer can hold. + * The minimum is always this number plus one negated. + */ +#define MAX_INT 2147483647 + +/** * Return the N least-significant bits from integer K using a bit mask * @param the integer to be parsed * @param the number of bits to be parsed @@ -3,6 +3,7 @@ #include "instrDTO.h" #include "response.h" #include "stage.h" +#include <unordered_map> class EX : public Stage { @@ -15,6 +16,23 @@ class EX : public Stage EX(Stage *next); InstrDTO *advance(Response p) override; + + private: + /** + * Sets the (over|under)flow condition code if adding `a` and `b` results in + * either. + * @param the first operand + * @param the second operand + */ + void overflow_guard(signed int a, signed int b); + /** + * Maps each mnemonic to a function which carries out the instruction's base + * logic. + */ + std::unordered_map< + Mnemonic, + std::function<void(signed int &s1, signed int &s2)>> + instr_map; }; #endif /* EX_H_INCLUDED */ diff --git a/inc/instr.h b/inc/instr.h index 08b4fd0..7fbb42b 100644 --- a/inc/instr.h +++ b/inc/instr.h @@ -49,7 +49,6 @@ namespace instr { // clang-format off extern const std::unordered_map<unsigned int, Mnemonic> mnemonic_map; - extern const std::unordered_map<Mnemonic, std::function<void(signed int &s1, signed int &s2, signed int &s3)>> instr_map; // clang-format on } // namespace instr diff --git a/inc/stage.h b/inc/stage.h index 50c413a..c0dc6a8 100644 --- a/inc/stage.h +++ b/inc/stage.h @@ -9,6 +9,13 @@ #include <deque> #include <memory> +enum CC { + GT, + EQ, + UF, + OF, +}; + class Stage { public: @@ -31,6 +38,17 @@ class Stage protected: /** + * Sets the bit in the condition code register corresponding to `c`. + * @param the condition code to set. + * @param the truthy value to set it to. + */ + void set_condition(CC c, bool v); + /** + * Gets the bit in the condition code register correspondng to `c`. + * @param the condition code to retrieve, + */ + bool get_condition(CC c); + /** * Helper for `check_out`. * Returns true if r are not checked out, false otherwise. * @param a list of register numbers. |