added ALU with first commands
This commit is contained in:
58
src/components/Alu.cpp
Normal file
58
src/components/Alu.cpp
Normal file
@@ -0,0 +1,58 @@
|
||||
//
|
||||
// Created by black on 07.07.25.
|
||||
//
|
||||
|
||||
#include "Alu.h"
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "Register.h"
|
||||
|
||||
void Alu::calculate(const std::vector<std::string> &commandVector) {
|
||||
/// Extrahiere den eigentlichen RISC-V Befehl für die ALU
|
||||
const std::string &command = commandVector.at(0);
|
||||
|
||||
/// Extrahiere die Argumente des Befehls
|
||||
const auto arg1 = parseArgument(commandVector.at(0));
|
||||
const auto arg2 = parseArgument(commandVector.at(1));
|
||||
int arg3 = 0;
|
||||
if (!commandVector.at(2).empty()) {
|
||||
arg3 = parseArgument(commandVector.at(2));
|
||||
}
|
||||
|
||||
if (command == "add") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto register2 = Register::getInstance().getRegister(arg3);
|
||||
const auto result = register1 + register2;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "sub") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto register2 = Register::getInstance().getRegister(arg3);
|
||||
const auto result = register1 - register2;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "and") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto register2 = Register::getInstance().getRegister(arg3);
|
||||
const auto result = register1 & register2;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "or") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto register2 = Register::getInstance().getRegister(arg3);
|
||||
const auto result = register1 | register2;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
} else if (command == "xor") {
|
||||
const auto register1 = Register::getInstance().getRegister(arg2);
|
||||
const auto register2 = Register::getInstance().getRegister(arg3);
|
||||
const auto result = register1 ^ register2;
|
||||
Register::getInstance().setRegister(arg1, result);
|
||||
}
|
||||
}
|
||||
|
||||
int Alu::parseArgument(std::string argument) {
|
||||
/// Falls das erste Argument ein Register ist, entferne das führende "x"
|
||||
if (argument.at(0) == 'x') {
|
||||
argument = argument.substr(1, argument.length() - 1);
|
||||
}
|
||||
/// Da das Argument noch als String vorliegt, muss es in ein int umgewandelt werden
|
||||
return std::stoi(argument);
|
||||
}
|
||||
Reference in New Issue
Block a user