summaryrefslogtreecommitdiff
path: root/src/instr.cc
blob: 271fc992859c055bbc48a8b591f03b36769dae90 (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
// Simulator for the RISC-V[ECTOR] mini-ISA
// Copyright (C) 2025 Siddarth Suresh
// Copyright (C) 2025 bdunahu

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.

// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

#include "instr.h"
#include <functional>
#include <map>
#include <unordered_map>

namespace instr
{
const std::unordered_map<unsigned int, Mnemonic> mnemonic_map = {
	{0b0000100, ADD},	{0b0001000, SUB},	{0b0001100, MUL},
	{0b0010000, QUOT},	{0b0010100, REM},	{0b0011000, SFTR},
	{0b0011100, SFTL},	{0b0100000, AND},	{0b0100100, OR},
	{0b0101000, NOT},	{0b0101100, XOR},	{0b0110000, ADDV},
	{0b0110100, SUBV},	{0b0111000, MULV},	{0b0111100, DIVV},
	{0b1000000, CMP},	{0b1000100, CEV},	{0b1001000, SRDL},
	{0b1001100, SRDS},	{0b000101, LOAD},	{0b0001001, ADDI},
	{0b0001101, SUBI},	{0b0010001, SFTRI}, {0b0010101, SFTLI},
	{0b0011001, ANDI},	{0b0011101, ORI},	{0b0100001, XORI},
	{0b0100101, STORE}, {0b0000110, JMP},	{0b0001010, JRL},
	{0b0001110, JAL},	{0b0010010, BEQ},	{0b0010110, BGT},
	{0b0011010, BUF},	{0b0011110, BOF},	{0b0100010, PUSH},
	{0b0100110, POP},	{0b0101010, RET},
};

FieldType get_field_types(Mnemonic m)
{
	if (m == ADDV || m == SUBV || m == MULV || m == DIVV || m == CEV) {
		return R_VECT;
	} else if (m == SRDL || m == SRDS) {
		return S_VECT;
	} else {
		return SI_INT;
	}
}
} // namespace instr