diff --git a/src/Compiler.java b/src/Compiler.java index b13f46aaa0f4232677148c5859479f5974d786b1..60acf54d11d312b4198d0893767ea42fd6ab0fd0 100644 --- a/src/Compiler.java +++ b/src/Compiler.java @@ -39,10 +39,10 @@ public class Compiler { //IRTest(); //åŽç«¯ä»£ç ç”Ÿæˆæµ‹è¯• - //CodeGenTest(); + CodeGenTest(); //寄å˜å™¨åˆ†é…测试 - RegAllocTest(); + //RegAllocTest(); } public static void LexerTest() throws IOException { @@ -89,7 +89,7 @@ public class Compiler { Program program = new Program(ast); HashSet<Function> functions = new HashSet<>(program.getFunctions().values()); DFG.doDFG(functions); - Mem2Reg.doMem2Reg(functions); + //Mem2Reg.doMem2Reg(functions); BufferedWriter writer = new BufferedWriter(new FileWriter("out.ll")); program.printIR(writer); writer.close(); diff --git a/src/backend/RegAlloc.java b/src/backend/RegAlloc.java index dacb0cbf46f6728c708546638ac2cebe6e81e5e2..4664e4739305fc509634e8adf10aeaca2f7cbada 100644 --- a/src/backend/RegAlloc.java +++ b/src/backend/RegAlloc.java @@ -112,13 +112,13 @@ public class RegAlloc { for (int i = 0; i < instrHead.regUse.size(); i++) { if (instrHead.regUse.get(i) instanceof AsmVirReg) { int nowColor = color.get(instrHead.regUse.get(i)); - instrHead.addUseReg(instrHead.regUse.get(i), RegGeter.AllRegsInt.get(nowColor)); + instrHead.changeUseReg(i,instrHead.regUse.get(i), RegGeter.AllRegsInt.get(nowColor)); } } for (int i = 0; i < instrHead.regDef.size(); i++) { if (instrHead.regDef.get(i) instanceof AsmVirReg) { int nowColor = color.get(instrHead.regDef.get(i)); - instrHead.addDefReg(instrHead.regDef.get(i), RegGeter.AllRegsInt.get(nowColor)); + instrHead.changeDstReg(i, instrHead.regDef.get(i), RegGeter.AllRegsInt.get(nowColor)); } } instrHead = (AsmInstr) instrHead.getNext(); @@ -499,7 +499,7 @@ public class RegAlloc { AsmVirReg v1 = new AsmVirReg(); for (int i = 0; i< instrHead.regUse.size();i++) { if (instrHead.regUse.get(i) == v) { - instrHead.addUseReg(instrHead.regUse.get(i), v1); + instrHead.changeUseReg(i,instrHead.regUse.get(i), v1); } } AsmImm12 place = new AsmImm12(spillPlace); @@ -511,7 +511,7 @@ public class RegAlloc { AsmVirReg v2 = new AsmVirReg(); for (int i = 0; i < instrHead.regDef.size(); i++) { if (instrHead.regDef.get(i) == v) { - instrHead.addDefReg(instrHead.regUse.get(i), v2); + instrHead.changeDstReg(i,instrHead.regUse.get(i), v2); } } AsmImm12 place = new AsmImm12(spillPlace); diff --git a/src/backend/asmInstr/AsmInstr.java b/src/backend/asmInstr/AsmInstr.java index d91be166da2cccf65b04dfacb424ba056ff34fbf..26973fa9c9169db610c5d252de54581869859e69 100644 --- a/src/backend/asmInstr/AsmInstr.java +++ b/src/backend/asmInstr/AsmInstr.java @@ -1,6 +1,9 @@ package backend.asmInstr; import Utils.CustomList; +import backend.asmInstr.asmBinary.AsmBinary; +import backend.asmInstr.asmLS.AsmL; +import backend.asmInstr.asmLS.AsmS; import backend.itemStructure.AsmOperand; import backend.regs.AsmReg; @@ -18,6 +21,7 @@ public class AsmInstr extends CustomList.Node { public ArrayList<AsmReg> regUse = new ArrayList<>(); private String type; + public AsmInstr(String type) { this.type = type; } @@ -36,4 +40,42 @@ public class AsmInstr extends CustomList.Node { regUse.add((AsmReg) newReg); } + public void changeUseReg(int index ,AsmReg oldReg, AsmReg newReg) { + if (type == "AsmL") { + if (this.regUse.get(index) == oldReg) { + this.regUse.set(index, newReg); + AsmL asmL = (AsmL) this; + asmL.ReSetSrc(newReg); + } + } else if (type == "AsmS") { + if (this.regUse.get(index) == oldReg) { + this.regUse.set(index, newReg); + AsmS asmS = (AsmS) this; + asmS.ReSetSrc(newReg); + } + } else if (type == "AsmBinary") { + if (this.regUse.get(index) == oldReg) { + this.regUse.set(index, newReg); + AsmBinary asmBinary = (AsmBinary) this; + asmBinary.ReSetSrc(index, newReg); + } + } + } + public void changeDstReg(int index ,AsmReg oldReg, AsmReg newReg) { + if (type == "AsmL") { + if (this.regDef.get(index) == oldReg) { + this.regDef.set(index, newReg); + AsmL asmL = (AsmL) this; + asmL.ReSetDst(newReg); + } + } else if (type == "AsmBinary") { + if (this.regDef.get(index) == oldReg) { + this.regDef.set(index, newReg); + AsmBinary asmBinary = (AsmBinary) this; + asmBinary.ReSetDst(newReg); + } + } + } + + } diff --git a/src/backend/asmInstr/asmBinary/AsmBinary.java b/src/backend/asmInstr/asmBinary/AsmBinary.java index b5542d6e29af897470c5d94dfc36700f89ba2f0e..89101ee6c14f78ecde10cb3efdb872cf6e117f81 100644 --- a/src/backend/asmInstr/asmBinary/AsmBinary.java +++ b/src/backend/asmInstr/asmBinary/AsmBinary.java @@ -27,4 +27,15 @@ public class AsmBinary extends AsmInstr { addUseReg(this.src2, src2); this.src2 = src2; } + public void ReSetSrc(int index,AsmOperand src) { + if (index == 0) { + this.src1 = src; + } else if (index == 1) { + this.src2 = src; + } + } + + public void ReSetDst(AsmOperand dst) { + this.dst = dst; + } } diff --git a/src/backend/asmInstr/asmLS/AsmL.java b/src/backend/asmInstr/asmLS/AsmL.java index c1fa78f044f9316165612c29e064e2cef382c981..7c2c9e9009127b4e07726f3625bae2386e2a11a1 100644 --- a/src/backend/asmInstr/asmLS/AsmL.java +++ b/src/backend/asmInstr/asmLS/AsmL.java @@ -31,4 +31,11 @@ public class AsmL extends AsmInstr { public AsmOperand getSrc() { return src; } + + public void ReSetSrc(AsmOperand src) { + this.src = src; + } + public void ReSetDst(AsmOperand dst) { + this.dst = dst; + } } diff --git a/src/backend/asmInstr/asmLS/AsmS.java b/src/backend/asmInstr/asmLS/AsmS.java index c0920e066ee30a33c694b19b703754a1b2d936c6..3931d108527166e791f17dfca4593d55772486e3 100644 --- a/src/backend/asmInstr/asmLS/AsmS.java +++ b/src/backend/asmInstr/asmLS/AsmS.java @@ -21,4 +21,7 @@ public class AsmS extends AsmInstr { addUseReg(this.offset, offset); this.offset = offset; } + public void ReSetSrc(AsmOperand src) { + this.src = src; + } } diff --git a/src/backend/asmInstr/asmTermin/AsmCall.java b/src/backend/asmInstr/asmTermin/AsmCall.java index 15a389c9535f4c5e2591e5a008878cf7bd53155e..ef1924e26a01434b66a8ceb9db2d9bf3d2f7c71c 100644 --- a/src/backend/asmInstr/asmTermin/AsmCall.java +++ b/src/backend/asmInstr/asmTermin/AsmCall.java @@ -6,6 +6,7 @@ public class AsmCall extends AsmInstr { public String funcName; public AsmCall(String funcName) { + super("AsmCall"); this.funcName = funcName; } diff --git a/src/backend/asmInstr/asmTermin/AsmRet.java b/src/backend/asmInstr/asmTermin/AsmRet.java index a22824c94e60fd4c577faad7898bf1366351c1ff..f0192ba5b3d1277360352652f80f79f6daa556c7 100644 --- a/src/backend/asmInstr/asmTermin/AsmRet.java +++ b/src/backend/asmInstr/asmTermin/AsmRet.java @@ -3,6 +3,9 @@ package backend.asmInstr.asmTermin; import backend.asmInstr.AsmInstr; public class AsmRet extends AsmInstr { + public AsmRet() { + super("ret"); + } public String toString() { return "ret"; }