60 lines
1.7 KiB
C++
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
|