#ifndef ABC_GEN_H
#define ABC_GEN_H
#include <stdint.h>
#include <stdio.h>
typedef uint8_t GenReg;
// before the interface can be used an output needs to be specified
void genSetOutput(FILE *out);
// header / footer
void genHeader(void);
void genFooter(void);
// set active segment
void genText(void);
void genData(void);
void genBSS(void);
// generate data
void genLabeledUInt(const char *label, uint64_t val);
// 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 genStore(GenReg src, GenReg addr);
enum GenOp
{
GEN_OP3R_BEGIN,
GEN_ADD_R = GEN_OP3R_BEGIN,
GEN_OP3R_END,
GEN_OP3I_BEGIN = GEN_OP3R_END,
GEN_ADD_I = GEN_OP3I_BEGIN,
GEN_OP3I_END,
};
// 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);
#endif // ABC_GEN_H