aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/instructions/loadstore.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'qtmips_machine/instructions/loadstore.cpp')
-rw-r--r--qtmips_machine/instructions/loadstore.cpp67
1 files changed, 67 insertions, 0 deletions
diff --git a/qtmips_machine/instructions/loadstore.cpp b/qtmips_machine/instructions/loadstore.cpp
new file mode 100644
index 0000000..c83eae4
--- /dev/null
+++ b/qtmips_machine/instructions/loadstore.cpp
@@ -0,0 +1,67 @@
+#include "loadstore.h"
+
+InstructionLoad::InstructionLoad(enum InstructionLoadStoreT type, std::uint8_t rs, std::uint8_t rt, std::uint16_t offset)
+ : InstructionI(rs, rt, offset) {
+ this->type = type;
+}
+
+std::vector<std::string> InstructionLoad::to_strs() {
+ std::vector<std::string> str = this->InstructionI::to_strs();
+ switch (this->type) {
+ case ILST_B:
+ str[0] = "lb";
+ break;
+ case ILST_HW:
+ str[0] = "lh";
+ break;
+ case ILST_WL:
+ str[0] = "lwl";
+ break;
+ case ILST_W:
+ str[0] = "lw";
+ break;
+ case ILST_BU:
+ str[0] = "lbu";
+ break;
+ case ILST_HU:
+ str[0] = "lhu";
+ break;
+ case ILST_WR:
+ str[0] = "lwr";
+ break;
+ default:
+ // TODO different exception
+ throw std::exception();
+ }
+ return str;
+}
+
+InstructionStore::InstructionStore(enum InstructionLoadStoreT type, std::uint8_t rs, std::uint8_t rt, std::uint16_t offset)
+ : InstructionI(rs, rt, offset) {
+ this->type = type;
+}
+
+std::vector<std::string> InstructionStore::to_strs() {
+ std::vector<std::string> str = this->InstructionI::to_strs();
+ switch (this->type) {
+ case ILST_B:
+ str[0] = "sb";
+ break;
+ case ILST_HW:
+ str[0] = "sh";
+ break;
+ case ILST_WL:
+ str[0] = "swl";
+ break;
+ case ILST_W:
+ str[0] = "sw";
+ break;
+ case ILST_WR:
+ str[0] = "swr";
+ break;
+ default:
+ // TODO different exception
+ throw std::exception();
+ }
+ return str;
+}