#ifndef ABC_GEN_H #define ABC_GEN_H #include #include // register type typedef uint8_t GenReg; // output needs to be set before using the rest of the interface void genSetOutput(FILE *out); // generate data void genLabeledUInt(const char *label, uint64_t val); // header / footer void genHeader(void); void genFooter(void); // set active segment void genText(void); void genData(void); void genBSS(void); // acquire / release register GenReg genGetReg(void); void genUngetReg(GenReg reg); // load literal into register void genLoadUInt(uint64_t val, GenReg reg); void genLoadLabel(const char *label, GenReg reg); // fetch / store quad word (8 bytes) void genFetch(GenReg addr, GenReg dest); void genFetchDispl(int64_t displ, GenReg addr, GenReg dest); void genStore(GenReg src, GenReg addr); void genStoreDispl(GenReg src, int64_t displ, GenReg addr); // supported instruction enum GenOp { GEN_OP2R_BEGIN, GEN_UNARYMINUS_R, GEN_OP2R_END, GEN_OP3R_BEGIN = GEN_OP2R_END, GEN_ADD_R = GEN_OP3R_BEGIN, // addition GEN_SUB_R, // subtraction GEN_IMUL_R, // multiplication GEN_DIV_R, // division GEN_MOD_R, // modulo GEN_OP3R_END, GEN_OP3I_BEGIN = GEN_OP3R_END, GEN_ADD_I = GEN_OP3I_BEGIN, GEN_SUB_I, GEN_IMUL_I, GEN_DIV_I, GEN_MOD_I, GEN_OP3I_END, }; // 2 address instructions void genOp2r(enum GenOp op, GenReg reg0, GenReg reg1); // 3 address instructions void genOp3r(enum GenOp op, GenReg reg0, GenReg reg1, GenReg reg2); void genOp3i(enum GenOp op, uint64_t val, GenReg reg1, GenReg reg2); // IO hack void genOutHack(GenReg src); void genInHack(GenReg dest); #endif // ABC_GEN_H