aboutsummaryrefslogtreecommitdiff
path: root/qtmips_machine/instructions/shift.cpp
blob: 34bc1c9f559f0b6d8e06a67bce0c0beb154e0650 (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
#include "shift.h"

InstructionShift::InstructionShift(enum InstructionShiftT type, std::uint8_t rt, std::uint8_t rd, std::uint8_t sa)
    : InstructionR(0, rt, rd, sa) {
    this->type = type;
}

QVector<QString> InstructionShift::to_strs() {
    QVector<QString> str = this->InstructionR::to_strs();
    str.erase(str.begin() + 1); // Drop rs field
    switch (this->type) {
    case IST_LL:
        str[0] = "sll";
        break;
    case IST_RL:
        str[0] = "srl";
        break;
    case IST_RA:
        str[0] = "sra";
        break;
    default:
        // TODO different exception
        throw std::exception();
    }
    return str;
}

InstructionShiftVariable::InstructionShiftVariable(enum InstructionShiftT type, std::uint8_t rs, std::uint8_t rt, std::uint8_t rd)
    : InstructionR(rs, rt, rd, 0) {
    this->type = type;
}

QVector<QString> InstructionShiftVariable::to_strs() {
    QVector<QString> str = this->InstructionR::to_strs();
    str.erase(str.begin() + 4); // Drop sa field
    switch (this->type) {
    case IST_LL:
        str[0] = "sllv";
        break;
    case IST_RL:
        str[0] = "srlv";
        break;
    case IST_RA:
        str[0] = "srav";
        break;
    default:
        // TODO different exception
        throw std::exception();
    }
    return str;
}