typedef enum Operator { // Arithmetic ops. OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, // Load/store/copy operations. OP_LD8, OP_LD16, OP_LD32, OP_LD64, OP_ST8, OP_ST16, OP_ST32, OP_ST64, OP_CP8, OP_CP16, OP_CP32, OP_CP64, // Bit fiddling operations. OP_NOT, OP_AND, OP_OR, OP_XOR, OP_LSHIFT, OP_RSHIFT, OP_LROT, OP_RROT, // (Un)conditional jump operations. OP_LABEL, OP_JMP, OP_JMP_EQ, OP_JMP_NEQ, OP_JMP_GT, OP_JMP_LT, OP_JMP_GE, OP_JMP_LE, } Operator; typedef enum OperandType { OP_TYPE_REG, OP_TYPE_CONST, OP_TYPE_LABEL, } OperandType; typedef struct Operand { OperandType type; union { struct { size_t num; } reg; struct { size_t num; } label; struct { union { u64 uval; s64 sval; }; } const; }; } Operand; typedef struct Instruction { Operator op; Operand dst; Operand src_a; Operand src_b; } Instruction; typedef struct LineInfo { size_t line; size_t col; } LineInfo; typedef struct ProgramBASM { Instruction *inst; LineInfo *lines; } ProgramBASM;