#pragma once #include "common.h" namespace codegen{ // a?, t?, ra are caller-saved // s? are callee-saved // x0,gp,tp are preserved in user-space enum class RV64Reg { x0 = 0, // zero x1, // ra, caller x2, // sp, callee x3, // gp x4, // tp x5, // t0, caller x6,x7, // t1-2, caller x8, // s0/fp, callee x9, // s1, callee x10,x11, // a0-1,caller x12,x13,x14,x15,x16,x17, // a2-7,caller x18,x19,x20,x21,x22,x23,x24,x25,x26,x27, // s2-11,callee x28,x29,x30,x31, // t3-6,caller }; inline std::string Reg2Name(RV64Reg reg) { std::string regname = "x" + std::to_string((int)reg); return regname; } class MOperand { public: enum class type { Virt, Imm, Reg, } op_type; int value; }; class MInst { public: enum class MInstTag { Add, Sub, Rsb, Mul, Div, Mod, Lt, Le, Ge, Gt, Eq, Ne, And, Or, LongMul, FMA, Mv, Branch, Jump, Return, Load, Store,Compare, Call, Global, } tag; MInst(MInstTag tag) : tag(tag) {} }; class MBasicBlock { }; class MFunction { std::list bbs; }; class MGlobalVar { }; class MCModule { std::list functions; std::list globals; }; }