mips64-assembler/InstHandler.h
2025-11-04 14:00:16 -05:00

60 lines
1.7 KiB
C++

#include <string>
#include <vector>
#include <map>
#include <regex>
#ifndef INSTHANDLER_H
#define INSTHANDLER_H
typedef struct {
uint64_t lineNumber;
std::vector<std::string> tokens;
uint32_t loc;
bool usesLabel;
uint32_t hex;
//xstd::string comment;
} inst_t;
typedef struct {
std::string name;
uint32_t loc;
} label_t;
class InstHandler {
private:
typedef std::function<int(inst_t*)> lf_t;
std::smatch matches;
std::map<std::string, lf_t> funcMap;
std::vector<label_t>* labels;
int handleLD(inst_t* inst);
int handleLfD(inst_t* inst);
int handleSD(inst_t* inst);
int handleSfD(inst_t* inst);
int handleDADDI(inst_t* inst);
int handleDADDIU(inst_t* inst);
int handleBEQ(inst_t* inst);
int handleBNE(inst_t* inst);
int handleDADD(inst_t* inst);
int handleDSUB(inst_t* inst);
int handleADDfD(inst_t* inst);
int handleSUBfD(inst_t* inst);
int handleMULfD(inst_t* inst);
int handleDIVfD(inst_t* inst);
int handleJ(inst_t* inst);
int handleHALT(inst_t* inst);
int handleNOP(inst_t* inst);
int handleDUMP(inst_t* inst);
int parseRegister(std::string arg, uint32_t& reg);
int parseFPRegister(std::string arg, uint32_t& reg);
int parseImmediate(std::string arg, uint32_t& imm, bool isDump);
int parseImmediateJump(std::string arg, uint32_t& imm);
int parseImmediateBranch(std::string arg, uint32_t& imm, uint32_t icount);
public:
InstHandler(std::vector<label_t>* labels_);
int handle(inst_t* inst);
uint32_t findLabel(std::string l);
};
#endif