deploy-20250820-3 #1

Merged
gh0s7 merged 352 commits from deploy-20250820-3 into master 2025-08-20 21:20:33 +08:00
Showing only changes of commit 1b9a7a4827 - Show all commits

View File

@@ -95,16 +95,17 @@ void PrologueEpilogueInsertionPass::runOnMachineFunction(MachineFunction* mfunc)
// 4.4. 保存所有使用到的被调用者保存寄存器 // 4.4. 保存所有使用到的被调用者保存寄存器
int next_available_offset = -(16 + frame_info.locals_size + frame_info.spill_size); int next_available_offset = -(16 + frame_info.locals_size + frame_info.spill_size);
for (const auto& reg : frame_info.callee_saved_regs_to_store) { for (const auto& reg : frame_info.callee_saved_regs_to_store) {
// 采用“先使用,后更新”逻辑 // 改为“先更新,后使用”逻辑
next_available_offset -= 8; // 先为当前寄存器分配下一个可用槽位
RVOpcodes store_op = isFPR(reg) ? RVOpcodes::FSD : RVOpcodes::SD; RVOpcodes store_op = isFPR(reg) ? RVOpcodes::FSD : RVOpcodes::SD;
auto save_cs_reg = std::make_unique<MachineInstr>(store_op); auto save_cs_reg = std::make_unique<MachineInstr>(store_op);
save_cs_reg->addOperand(std::make_unique<RegOperand>(reg)); save_cs_reg->addOperand(std::make_unique<RegOperand>(reg));
save_cs_reg->addOperand(std::make_unique<MemOperand>( save_cs_reg->addOperand(std::make_unique<MemOperand>(
std::make_unique<RegOperand>(PhysicalReg::S0), std::make_unique<RegOperand>(PhysicalReg::S0),
std::make_unique<ImmOperand>(next_available_offset) // 使用当前偏移 std::make_unique<ImmOperand>(next_available_offset) // 使用新计算出的正确偏移
)); ));
prologue_instrs.push_back(std::move(save_cs_reg)); prologue_instrs.push_back(std::move(save_cs_reg));
next_available_offset -= 8; // 为下一个寄存器准备偏移 // 不再需要在循环末尾递减
} }
// 4.5. 将所有生成的序言指令一次性插入到函数入口 // 4.5. 将所有生成的序言指令一次性插入到函数入口
@@ -121,6 +122,7 @@ void PrologueEpilogueInsertionPass::runOnMachineFunction(MachineFunction* mfunc)
// 5.1. 恢复被调用者保存寄存器 // 5.1. 恢复被调用者保存寄存器
int next_available_offset_restore = -(16 + frame_info.locals_size + frame_info.spill_size); int next_available_offset_restore = -(16 + frame_info.locals_size + frame_info.spill_size);
for (const auto& reg : frame_info.callee_saved_regs_to_store) { for (const auto& reg : frame_info.callee_saved_regs_to_store) {
next_available_offset_restore -= 8; // 为下一个寄存器准备偏移
RVOpcodes load_op = isFPR(reg) ? RVOpcodes::FLD : RVOpcodes::LD; RVOpcodes load_op = isFPR(reg) ? RVOpcodes::FLD : RVOpcodes::LD;
auto restore_cs_reg = std::make_unique<MachineInstr>(load_op); auto restore_cs_reg = std::make_unique<MachineInstr>(load_op);
restore_cs_reg->addOperand(std::make_unique<RegOperand>(reg)); restore_cs_reg->addOperand(std::make_unique<RegOperand>(reg));
@@ -129,7 +131,6 @@ void PrologueEpilogueInsertionPass::runOnMachineFunction(MachineFunction* mfunc)
std::make_unique<ImmOperand>(next_available_offset_restore) // 使用当前偏移 std::make_unique<ImmOperand>(next_available_offset_restore) // 使用当前偏移
)); ));
epilogue_instrs.push_back(std::move(restore_cs_reg)); epilogue_instrs.push_back(std::move(restore_cs_reg));
next_available_offset_restore -= 8; // 为下一个寄存器准备偏移
} }
// 5.2. 恢复 ra 和 s0 // 5.2. 恢复 ra 和 s0