diff --git a/include/mir/MIR.h b/include/mir/MIR.h index 47b8959..273836a 100644 --- a/include/mir/MIR.h +++ b/include/mir/MIR.h @@ -19,41 +19,144 @@ class MIRContext { MIRContext& DefaultContext(); -enum class PhysReg { W0, W8, W9, X29, X30, SP }; +enum class PhysReg { + //W0, W8, W9, X29, X30, SP + // 32位通用寄存器 + W0, W1, W2, W3, W4, W5, W6, W7, // 参数传递/临时 + W8, W9, // 临时寄存器(当前主要使用) + W10, W11, W12, W13, W14, W15, // 临时寄存器(扩展) + W16, W17, // intra-procedure-call 临时 + W18, // 平台预留 + W19, W20, W21, W22, W23, W24, // 被调用者保存(扩展用) + W25, W26, W27, W28, // 被调用者保存 + W29, // 帧指针 (FP) + W30, // 链接寄存器 (LR) + + // 64位版本 + X0, X1, X2, X3, X4, X5, X6, X7, + X8, X9, X10, X11, X12, X13, X14, X15, + X16, X17, X18, + X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, + X29, // FP + X30, // LR + + // 浮点寄存器 (32位) + S0, S1, S2, S3, S4, S5, S6, S7, + S8, S9, S10, S11, S12, S13, S14, S15, + S16, S17, S18, S19, S20, S21, S22, S23, + S24, S25, S26, S27, S28, S29, S30, S31, + + // 特殊寄存器 + SP, // 栈指针 + ZR, // 零寄存器 +}; const char* PhysRegName(PhysReg reg); +// ========== 条件码枚举(用于 BCond 指令)========== +enum class CondCode { + EQ, // 相等 (equal) + NE, // 不等 (not equal) + CS, // 进位设置 (carry set) / 无符号大于等于 + CC, // 进位清除 (carry clear) / 无符号小于 + MI, // 负数 (minus) + PL, // 非负数 (plus) + VS, // 溢出 (overflow set) + VC, // 无溢出 (overflow clear) + HI, // 无符号大于 (higher) + LS, // 无符号小于等于 (lower or same) + GE, // 有符号大于等于 (greater or equal) + LT, // 有符号小于 (less than) + GT, // 有符号大于 (greater than) + LE, // 有符号小于等于 (less or equal) + AL, // 总是 (always) +}; + +const char* CondCodeName(CondCode cc); + +// ========== MIR 指令操作码枚举 ========== enum class Opcode { - Prologue, - Epilogue, - MovImm, - LoadStack, - StoreStack, - AddRR, - Ret, + // ---------- 栈帧相关 ---------- + Prologue, // 函数序言(伪指令) + Epilogue, // 函数尾声(伪指令) + + // ---------- 数据传输 ---------- + MovImm, // 立即数移动到寄存器: MOV w8, #imm + MovReg, // 寄存器之间移动: MOV w8, w9 + LoadStack, // 从栈槽加载: LDR w8, [sp, #offset] + StoreStack, // 存储到栈槽: STR w8, [sp, #offset] + LoadStackPair,// 成对加载: LDP x29, x30, [sp], #16 + StoreStackPair,// 成对存储: STP x29, x30, [sp, #-16]! + + // ---------- 整数算术运算 ---------- + AddRR, // 加法: ADD w8, w8, w9 + AddRI, // 加法(立即数): ADD w8, w8, #imm + SubRR, // 减法: SUB w8, w8, w9 + SubRI, // 减法(立即数): SUB w8, w8, #imm + MulRR, // 乘法: MUL w8, w8, w9 + SDivRR, // 有符号除法: SDIV w8, w8, w9 + UDivRR, // 无符号除法: UDIV w8, w8, w9 + + // ---------- 浮点算术运算 ---------- + FAddRR, // 浮点加法: FADD s0, s0, s1 + FSubRR, // 浮点减法: FSUB s0, s0, s1 + FMulRR, // 浮点乘法: FMUL s0, s0, s1 + FDivRR, // 浮点除法: FDIV s0, s0, s1 + + // ---------- 比较运算 ---------- + CmpRR, // 比较(寄存器): CMP w8, w9 + CmpRI, // 比较(立即数): CMP w8, #imm + FCmpRR, // 浮点比较: FCMP s0, s1 + + // ---------- 类型转换 ---------- + SIToFP, // 有符号整数转浮点: SCVTF s0, w0 + FPToSI, // 浮点转有符号整数: FCVTZS w0, s0 + ZExt, // 零扩展(i1 -> i32): AND w8, w8, #1 + + // ---------- 控制流 ---------- + B, // 无条件跳转: B label + BCond, // 条件跳转: B.EQ label, B.NE label, B.GT label 等 + Call, // 函数调用: BL target + Ret, // 函数返回: RET + + // ---------- 逻辑运算 ---------- + AndRR, // 按位与: AND w8, w8, w9 + OrRR, // 按位或: ORR w8, w8, w9 + EorRR, // 按位异或: EOR w8, w8, w9 + LslRR, // 逻辑左移: LSL w8, w8, w9 + LsrRR, // 逻辑右移: LSR w8, w8, w9 + AsrRR, // 算术右移: ASR w8, w8, w9 + + // ---------- 特殊 ---------- + Nop, // 空操作: NOP }; +// ========== 操作数类 ========== class Operand { public: - enum class Kind { Reg, Imm, FrameIndex }; + enum class Kind { Reg, Imm, FrameIndex, Cond }; static Operand Reg(PhysReg reg); static Operand Imm(int value); static Operand FrameIndex(int index); + static Operand Cond(CondCode cc); Kind GetKind() const { return kind_; } PhysReg GetReg() const { return reg_; } int GetImm() const { return imm_; } int GetFrameIndex() const { return imm_; } + CondCode GetCondCode() const { return cc_; } private: - Operand(Kind kind, PhysReg reg, int imm); + Operand(Kind kind, PhysReg reg, int imm, CondCode cc); Kind kind_; PhysReg reg_; int imm_; + CondCode cc_; }; +// ========== MIR 指令类 ========== class MachineInstr { public: MachineInstr(Opcode opcode, std::vector operands = {}); @@ -66,12 +169,14 @@ class MachineInstr { std::vector operands_; }; +// ========== 栈槽结构 ========== struct FrameSlot { int index = 0; int size = 4; int offset = 0; }; +// ========== MIR 基本块 ========== class MachineBasicBlock { public: explicit MachineBasicBlock(std::string name); @@ -82,35 +187,60 @@ class MachineBasicBlock { MachineInstr& Append(Opcode opcode, std::initializer_list operands = {}); + MachineInstr& Append(Opcode opcode, std::vector operands); + + // 控制流信息 + std::vector& GetSuccessors() { return successors_; } + const std::vector& GetSuccessors() const { return successors_; } + void AddSuccessor(MachineBasicBlock* succ) { successors_.push_back(succ); } private: std::string name_; std::vector instructions_; + std::vector successors_; }; +// ========== MIR 函数 ========== class MachineFunction { public: explicit MachineFunction(std::string name); const std::string& GetName() const { return name_; } + + // 基本块管理 MachineBasicBlock& GetEntry() { return entry_; } const MachineBasicBlock& GetEntry() const { return entry_; } + std::vector>& GetBasicBlocks() { + return basic_blocks_; + } + const std::vector>& GetBasicBlocks() const { + return basic_blocks_; + } + + void AddBasicBlock(std::unique_ptr bb) { + basic_blocks_.push_back(std::move(bb)); + } + + // 栈槽管理 int CreateFrameIndex(int size = 4); FrameSlot& GetFrameSlot(int index); const FrameSlot& GetFrameSlot(int index) const; const std::vector& GetFrameSlots() const { return frame_slots_; } - + + // 栈帧大小 int GetFrameSize() const { return frame_size_; } void SetFrameSize(int size) { frame_size_ = size; } private: std::string name_; MachineBasicBlock entry_; + std::vector> basic_blocks_; std::vector frame_slots_; int frame_size_ = 0; }; +// ========== 后端流程函数 ========== std::unique_ptr LowerToMIR(const ir::Module& module); void RunRegAlloc(MachineFunction& function); void RunFrameLowering(MachineFunction& function); diff --git a/src/mir/Lowering.cpp b/src/mir/Lowering.cpp index 9a18396..5adca7f 100644 --- a/src/mir/Lowering.cpp +++ b/src/mir/Lowering.cpp @@ -6,6 +6,7 @@ #include "ir/IR.h" #include "utils/Log.h" + namespace mir { namespace { diff --git a/src/mir/MIRBasicBlock.cpp b/src/mir/MIRBasicBlock.cpp index d42b4b3..ab0dd57 100644 --- a/src/mir/MIRBasicBlock.cpp +++ b/src/mir/MIRBasicBlock.cpp @@ -9,7 +9,8 @@ MachineBasicBlock::MachineBasicBlock(std::string name) MachineInstr& MachineBasicBlock::Append(Opcode opcode, std::initializer_list operands) { - instructions_.emplace_back(opcode, std::vector(operands)); + //instructions_.emplace_back(opcode, std::vector(operands)); + instructions_.emplace_back(opcode, std::move(operands)); return instructions_.back(); } diff --git a/src/mir/MIRInstr.cpp b/src/mir/MIRInstr.cpp index 0a21a03..34da3d3 100644 --- a/src/mir/MIRInstr.cpp +++ b/src/mir/MIRInstr.cpp @@ -4,17 +4,21 @@ namespace mir { -Operand::Operand(Kind kind, PhysReg reg, int imm) - : kind_(kind), reg_(reg), imm_(imm) {} +Operand::Operand(Kind kind, PhysReg reg, int imm, CondCode cc) + : kind_(kind), reg_(reg), imm_(imm), cc_(cc) {} -Operand Operand::Reg(PhysReg reg) { return Operand(Kind::Reg, reg, 0); } +Operand Operand::Reg(PhysReg reg) { return Operand(Kind::Reg, reg, 0, CondCode::EQ); } Operand Operand::Imm(int value) { - return Operand(Kind::Imm, PhysReg::W0, value); + return Operand(Kind::Imm, PhysReg::W0, value, CondCode::EQ); } Operand Operand::FrameIndex(int index) { - return Operand(Kind::FrameIndex, PhysReg::W0, index); + return Operand(Kind::FrameIndex, PhysReg::W0, index, CondCode::EQ); +} + +Operand Operand::Cond(CondCode cc) { + return Operand(Kind::Cond, PhysReg::W0, 0, cc); } MachineInstr::MachineInstr(Opcode opcode, std::vector operands) diff --git a/src/mir/Register.cpp b/src/mir/Register.cpp index 7530470..5bf605f 100644 --- a/src/mir/Register.cpp +++ b/src/mir/Register.cpp @@ -8,20 +8,79 @@ namespace mir { const char* PhysRegName(PhysReg reg) { switch (reg) { - case PhysReg::W0: - return "w0"; - case PhysReg::W8: - return "w8"; - case PhysReg::W9: - return "w9"; - case PhysReg::X29: - return "x29"; - case PhysReg::X30: - return "x30"; - case PhysReg::SP: - return "sp"; + // 32位寄存器 + case PhysReg::W0: return "w0"; + case PhysReg::W1: return "w1"; + case PhysReg::W2: return "w2"; + case PhysReg::W3: return "w3"; + case PhysReg::W4: return "w4"; + case PhysReg::W5: return "w5"; + case PhysReg::W6: return "w6"; + case PhysReg::W7: return "w7"; + case PhysReg::W8: return "w8"; + case PhysReg::W9: return "w9"; + case PhysReg::W10: return "w10"; + case PhysReg::W11: return "w11"; + case PhysReg::W12: return "w12"; + case PhysReg::W13: return "w13"; + case PhysReg::W14: return "w14"; + case PhysReg::W15: return "w15"; + case PhysReg::W29: return "w29"; + case PhysReg::W30: return "w30"; + + // 64位寄存器 + case PhysReg::X0: return "x0"; + case PhysReg::X1: return "x1"; + case PhysReg::X2: return "x2"; + case PhysReg::X3: return "x3"; + case PhysReg::X4: return "x4"; + case PhysReg::X5: return "x5"; + case PhysReg::X6: return "x6"; + case PhysReg::X7: return "x7"; + case PhysReg::X8: return "x8"; + case PhysReg::X9: return "x9"; + case PhysReg::X29: return "x29"; + case PhysReg::X30: return "x30"; + + // 浮点寄存器 + case PhysReg::S0: return "s0"; + case PhysReg::S1: return "s1"; + case PhysReg::S2: return "s2"; + case PhysReg::S3: return "s3"; + case PhysReg::S4: return "s4"; + case PhysReg::S5: return "s5"; + case PhysReg::S6: return "s6"; + case PhysReg::S7: return "s7"; + + // 特殊寄存器 + case PhysReg::SP: return "sp"; + case PhysReg::ZR: return "xzr"; + + default: return "unknown"; } throw std::runtime_error(FormatError("mir", "未知物理寄存器")); } +const char* CondCodeName(CondCode cc) { + switch (cc) { + case CondCode::EQ: return "eq"; + case CondCode::NE: return "ne"; + case CondCode::CS: return "cs"; + case CondCode::CC: return "cc"; + case CondCode::MI: return "mi"; + case CondCode::PL: return "pl"; + case CondCode::VS: return "vs"; + case CondCode::VC: return "vc"; + case CondCode::HI: return "hi"; + case CondCode::LS: return "ls"; + case CondCode::GE: return "ge"; + case CondCode::LT: return "lt"; + case CondCode::GT: return "gt"; + case CondCode::LE: return "le"; + case CondCode::AL: return "al"; + default: return "unknown"; + } + throw std::runtime_error(FormatError("mir", "未知条件码")); +} + } // namespace mir