From d2e69d9b33f791e17c6a42edb42fc1bcbeefaff8 Mon Sep 17 00:00:00 2001 From: ZhuangYumin Date: Wed, 30 Oct 2024 00:30:01 +0000 Subject: [PATCH] optimize store 0 and add naive trace optimization --- src/opt/gen.cpp | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/opt/gen.cpp b/src/opt/gen.cpp index 5d30add..7fde3d3 100644 --- a/src/opt/gen.cpp +++ b/src/opt/gen.cpp @@ -24,6 +24,10 @@ void FetchValueToReg(std::string original_val, std::string &out_reg, FuncLayout std::string label_in_asm = original_val.substr(1, original_val.size() - 1); code_lines.push_back("la " + out_reg + ", " + label_in_asm); } else if (original_val[0] == '-' || std::isdigit(original_val[0])) { + if (original_val == "0") { + out_reg = "x0"; + return; + } // immediate value out_reg = AllocateTmpReg(available_tmp_regs); StoreImmToReg(std::stoi(original_val), out_reg, code_lines); @@ -75,26 +79,38 @@ void GenerateASM(std::shared_ptr act, std::vector &code std::string rs1_reg, rs2_reg; FetchValueToReg(beq_act->rs1, rs1_reg, layout, code_lines, available_tmp_regs); FetchValueToReg(beq_act->rs2, rs2_reg, layout, code_lines, available_tmp_regs); - code_lines.push_back("beq " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + beq_act->true_label_full); - code_lines.push_back("j .entrylabel." + beq_act->false_label_full); + // code_lines.push_back("beq " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + beq_act->true_label_full); + // code_lines.push_back("j .entrylabel." + beq_act->false_label_full); + // trace optimization + code_lines.push_back(("bne " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + beq_act->false_label_full)); + code_lines.push_back("j .entrylabel." + beq_act->true_label_full); } else if (auto bne_act = std::dynamic_pointer_cast(br_act)) { std::string rs1_reg, rs2_reg; FetchValueToReg(bne_act->rs1, rs1_reg, layout, code_lines, available_tmp_regs); FetchValueToReg(bne_act->rs2, rs2_reg, layout, code_lines, available_tmp_regs); - code_lines.push_back("bne " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bne_act->true_label_full); - code_lines.push_back("j .entrylabel." + bne_act->false_label_full); + // code_lines.push_back("bne " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bne_act->true_label_full); + // code_lines.push_back("j .entrylabel." + bne_act->false_label_full); + // trace optimization + code_lines.push_back(("beq " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bne_act->false_label_full)); + code_lines.push_back("j .entrylabel." + bne_act->true_label_full); } else if (auto blt_act = std::dynamic_pointer_cast(br_act)) { std::string rs1_reg, rs2_reg; FetchValueToReg(blt_act->rs1, rs1_reg, layout, code_lines, available_tmp_regs); FetchValueToReg(blt_act->rs2, rs2_reg, layout, code_lines, available_tmp_regs); - code_lines.push_back("blt " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + blt_act->true_label_full); - code_lines.push_back("j .entrylabel." + blt_act->false_label_full); + // code_lines.push_back("blt " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + blt_act->true_label_full); + // code_lines.push_back("j .entrylabel." + blt_act->false_label_full); + // trace optimization + code_lines.push_back("bge " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + blt_act->false_label_full); + code_lines.push_back("j .entrylabel." + blt_act->true_label_full); } else if (auto bge_act = std::dynamic_pointer_cast(br_act)) { std::string rs1_reg, rs2_reg; FetchValueToReg(bge_act->rs1, rs1_reg, layout, code_lines, available_tmp_regs); FetchValueToReg(bge_act->rs2, rs2_reg, layout, code_lines, available_tmp_regs); - code_lines.push_back("bge " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bge_act->true_label_full); - code_lines.push_back("j .entrylabel." + bge_act->false_label_full); + // code_lines.push_back("bge " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bge_act->true_label_full); + // code_lines.push_back("j .entrylabel." + bge_act->false_label_full); + // trace optimization + code_lines.push_back("blt " + rs1_reg + ", " + rs2_reg + ", .entrylabel." + bge_act->false_label_full); + code_lines.push_back("j .entrylabel." + bge_act->true_label_full); } else { std::string cond_reg; FetchValueToReg(br_act->cond, cond_reg, layout, code_lines, available_tmp_regs);