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