added ALU with first commands

This commit is contained in:
black
2025-07-07 16:56:01 +02:00
parent b456f69fe1
commit 0479b1850a
7 changed files with 118 additions and 10 deletions

58
src/components/Alu.cpp Normal file
View 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);
}