summaryrefslogtreecommitdiff
path: root/inc
diff options
context:
space:
mode:
authorbd <bdunahu@operationnull.com>2025-03-30 12:33:25 -0400
committerbd <bdunahu@operationnull.com>2025-03-30 12:33:25 -0400
commit6557e7e623140871968776429d241570002a65f5 (patch)
tree420c2aced8e008708ea951edf36608e0bc5d4e2c /inc
parent8e56373a5436852fe9c7934e03d7b57493625003 (diff)
Setting condition code register, overflow guard
Diffstat (limited to 'inc')
-rw-r--r--inc/definitions.h6
-rw-r--r--inc/ex.h18
-rw-r--r--inc/instr.h1
-rw-r--r--inc/stage.h18
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
diff --git a/inc/ex.h b/inc/ex.h
index 2ca8876..4edf873 100644
--- a/inc/ex.h
+++ b/inc/ex.h
@@ -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.