feat(mir): 增加 Lab3 AArch64 MVP 后端与 --emit-asm 支持
This commit is contained in:
@@ -1,4 +1,44 @@
|
||||
// 栈帧构建与序言尾声插入:
|
||||
// - 计算栈大小与对齐需求,分配栈槽
|
||||
// - 插入 prologue/epilogue,保存/恢复 callee-saved 等
|
||||
#include "mir/MIR.h"
|
||||
|
||||
#include <stdexcept>
|
||||
#include <vector>
|
||||
|
||||
namespace mir {
|
||||
namespace {
|
||||
|
||||
int AlignTo(int value, int align) {
|
||||
return ((value + align - 1) / align) * align;
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void RunFrameLowering(MachineFunction& function) {
|
||||
int cursor = 0;
|
||||
for (const auto& slot : function.frame_slots()) {
|
||||
cursor += slot.size;
|
||||
if (-cursor < -256) {
|
||||
throw std::runtime_error(
|
||||
"Lab3 MVP 后端暂不支持超过 64 个 i32 栈槽的函数");
|
||||
}
|
||||
}
|
||||
|
||||
cursor = 0;
|
||||
for (const auto& slot : function.frame_slots()) {
|
||||
cursor += slot.size;
|
||||
function.frame_slot(slot.index).offset = -cursor;
|
||||
}
|
||||
function.set_frame_size(AlignTo(cursor, 16));
|
||||
|
||||
auto& insts = function.entry().instructions();
|
||||
std::vector<MachineInstr> lowered;
|
||||
lowered.emplace_back(Opcode::Prologue);
|
||||
for (const auto& inst : insts) {
|
||||
if (inst.opcode() == Opcode::Ret) {
|
||||
lowered.emplace_back(Opcode::Epilogue);
|
||||
}
|
||||
lowered.push_back(inst);
|
||||
}
|
||||
insts = std::move(lowered);
|
||||
}
|
||||
|
||||
} // namespace mir
|
||||
|
||||
Reference in New Issue
Block a user