aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/instructions/loadstore.cpp
blob: c83eae4718ca611bd1a9489d6d0370f1617d6887 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
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;
}