From d8eae0f8c99a45a9622f019cc35daaaf22bebc97 Mon Sep 17 00:00:00 2001 From: HangShuLYH <19291212@bjtu.edu.cn> Date: Thu, 11 Aug 2022 14:49:06 +0800 Subject: [PATCH] fix bugs of fp codegen --- include/frontend/Instruction.hh | 4 +- src/backend/codegen.cc | 234 +++++++++++++++++++++----------- 2 files changed, 158 insertions(+), 80 deletions(-) diff --git a/include/frontend/Instruction.hh b/include/frontend/Instruction.hh index 1c82117..30dbe8b 100644 --- a/include/frontend/Instruction.hh +++ b/include/frontend/Instruction.hh @@ -335,11 +335,11 @@ public: class GTFIR:public ArithmeticIR{ public: GTFIR(TempVal res,TempVal left,TempVal right) : ArithmeticIR(res,left,right){ - if (left.getVal() && left.isInt()) { + if (!left.getVal() && left.isInt()) { this->left.setType(new Type(TypeID::FLOAT)); this->left.setFloat(left.getInt()); } - if (right.getVal() && right.isInt()) { + if (!right.getVal() && right.isInt()) { this->right.setType(new Type(TypeID::FLOAT)); this->right.setFloat(right.getInt()); } diff --git a/src/backend/codegen.cc b/src/backend/codegen.cc index 62713ed..fd9f1b0 100644 --- a/src/backend/codegen.cc +++ b/src/backend/codegen.cc @@ -1212,7 +1212,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1223,10 +1227,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, LT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LT)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1237,16 +1244,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, GE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, LT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LT)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + } } return vec; } @@ -1255,7 +1268,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1266,10 +1283,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, LE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LE)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1280,16 +1300,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, GT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GT)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, LE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + } } return vec; } @@ -1298,7 +1324,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1309,10 +1339,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, GT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GT)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1323,16 +1356,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, LE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LE)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LE)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, GT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GT)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GT)); + } } return vec; } @@ -1341,7 +1380,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1352,10 +1395,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, GE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GE)); + vec.push_back(new B(branchIr->falseTarget->name)); + }else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1366,16 +1412,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, LT)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, LT)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, LT)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, GE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, GE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, GE)); + } } return vec; } @@ -1384,7 +1436,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1395,10 +1451,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, EQU)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, EQU)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1409,16 +1468,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, EQU)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, EQU)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, EQU)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, EQU)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, EQU)); + } } return vec; } @@ -1427,7 +1492,11 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, std::vector<Instr *> vec; BranchIR* branchIr = dynamic_cast<BranchIR *>(*(iter + 1)); iter++; - assert(branchIr != nullptr); + bool flag = false; + if (branchIr == nullptr) { + flag = true; + } + //assert(branchIr != nullptr); if (!ir2->right.getVal()) { if (is_legal_immediate(ir2->right.getInt())) { vec.push_back(new CmpImm(getGR(ir2->left.getVal()), ir2->right.getInt())); @@ -1438,10 +1507,13 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR right_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->left.getVal()), right_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, NE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, NE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + } } else if (!ir2->left.getVal()) { if (is_legal_immediate(ir2->left.getInt())) { vec.push_back(new CmpImm(getGR(ir2->right.getVal()), ir2->left.getInt())); @@ -1452,16 +1524,22 @@ std::vector<Instr *> Codegen::translateInstr(Instruction *ir, BasicBlock *block, GR left_gr = GR(12); vec.push_back(new Cmp(getGR(ir2->right.getVal()), left_gr)); } - vec.push_back(new B(branchIr->trueTarget->name, NE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, NE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + } } else { vec.push_back(new Cmp(getGR(ir2->left.getVal()), getGR(ir2->right.getVal()))); - vec.push_back(new B(branchIr->trueTarget->name, NE)); - vec.push_back(new B(branchIr->falseTarget->name)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); -// vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + if (!flag) { + vec.push_back(new B(branchIr->trueTarget->name, NE)); + vec.push_back(new B(branchIr->falseTarget->name)); + } else { + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 0)); + vec.push_back(new MovImm(getGR(ir2->res.getVal()), 1, NE)); + } } return vec; } -- GitLab