From 87fcbd1aa903952301060f2c171de8dd35d25d7e Mon Sep 17 00:00:00 2001 From: Henry Date: Fri, 20 Dec 2019 15:28:58 +0000 Subject: [PATCH] Fix incorrect `call` operand generation & register "fp" is actually s0 --- task1/CodegenImpl.java | 12 ++++++------ task2/CodegenImpl.java | 12 ++++++------ task3/CodegenImpl.java | 12 ++++++------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/task1/CodegenImpl.java b/task1/CodegenImpl.java index c3f1139..bcee1be 100644 --- a/task1/CodegenImpl.java +++ b/task1/CodegenImpl.java @@ -16,7 +16,7 @@ public class CodegenImpl implements Codegen { } return builder.toString() - + "call " + String.format("%s_%d:\n", main.id, main.numOfArgs); + + "call " + String.format("%s_%d\n", main.id, main.numOfArgs); } private String generateLabel() { @@ -58,7 +58,7 @@ public class CodegenImpl implements Codegen { } else if (e instanceof Variable) { int offset = ((Variable) e).x; - return String.format("lw a0,%d(fp)\n", offset * 4); + return String.format("lw a0,%d(s0)\n", offset * 4); } else if (e instanceof Invoke) { return compileCall((Invoke) e, false); } else if (e instanceof Seq) { @@ -131,7 +131,7 @@ public class CodegenImpl implements Codegen { Assign assign = (Assign) e; return compileExp(assign.e) - + String.format("sw a0,%d(fp)", assign.x * 4); + + String.format("sw a0,%d(s0)", assign.x * 4); } else if (e instanceof Continue) { return "jr s2\n"; } else if (e instanceof Break) { @@ -165,15 +165,15 @@ public class CodegenImpl implements Codegen { } // push old frame pointer - builder.append("sw fp,-4(sp)\n"); + builder.append("sw s0,-4(sp)\n"); builder.append("addi sp,sp,-8\n"); builder.append( // set frame pointer to start of arguments - "addi fp,sp,8\n" + "addi s0,sp,8\n" + "call " + methodLabel + "\n" // restore old frame pointer & stack pointer - + "lw fp,4(sp)\n" + + "lw s0,4(sp)\n" + "lw sp,(sp)\n" // restore return address of caller + "lw ra,-4(sp)\n" diff --git a/task2/CodegenImpl.java b/task2/CodegenImpl.java index c3f1139..bcee1be 100644 --- a/task2/CodegenImpl.java +++ b/task2/CodegenImpl.java @@ -16,7 +16,7 @@ public class CodegenImpl implements Codegen { } return builder.toString() - + "call " + String.format("%s_%d:\n", main.id, main.numOfArgs); + + "call " + String.format("%s_%d\n", main.id, main.numOfArgs); } private String generateLabel() { @@ -58,7 +58,7 @@ public class CodegenImpl implements Codegen { } else if (e instanceof Variable) { int offset = ((Variable) e).x; - return String.format("lw a0,%d(fp)\n", offset * 4); + return String.format("lw a0,%d(s0)\n", offset * 4); } else if (e instanceof Invoke) { return compileCall((Invoke) e, false); } else if (e instanceof Seq) { @@ -131,7 +131,7 @@ public class CodegenImpl implements Codegen { Assign assign = (Assign) e; return compileExp(assign.e) - + String.format("sw a0,%d(fp)", assign.x * 4); + + String.format("sw a0,%d(s0)", assign.x * 4); } else if (e instanceof Continue) { return "jr s2\n"; } else if (e instanceof Break) { @@ -165,15 +165,15 @@ public class CodegenImpl implements Codegen { } // push old frame pointer - builder.append("sw fp,-4(sp)\n"); + builder.append("sw s0,-4(sp)\n"); builder.append("addi sp,sp,-8\n"); builder.append( // set frame pointer to start of arguments - "addi fp,sp,8\n" + "addi s0,sp,8\n" + "call " + methodLabel + "\n" // restore old frame pointer & stack pointer - + "lw fp,4(sp)\n" + + "lw s0,4(sp)\n" + "lw sp,(sp)\n" // restore return address of caller + "lw ra,-4(sp)\n" diff --git a/task3/CodegenImpl.java b/task3/CodegenImpl.java index c3f1139..bcee1be 100644 --- a/task3/CodegenImpl.java +++ b/task3/CodegenImpl.java @@ -16,7 +16,7 @@ public class CodegenImpl implements Codegen { } return builder.toString() - + "call " + String.format("%s_%d:\n", main.id, main.numOfArgs); + + "call " + String.format("%s_%d\n", main.id, main.numOfArgs); } private String generateLabel() { @@ -58,7 +58,7 @@ public class CodegenImpl implements Codegen { } else if (e instanceof Variable) { int offset = ((Variable) e).x; - return String.format("lw a0,%d(fp)\n", offset * 4); + return String.format("lw a0,%d(s0)\n", offset * 4); } else if (e instanceof Invoke) { return compileCall((Invoke) e, false); } else if (e instanceof Seq) { @@ -131,7 +131,7 @@ public class CodegenImpl implements Codegen { Assign assign = (Assign) e; return compileExp(assign.e) - + String.format("sw a0,%d(fp)", assign.x * 4); + + String.format("sw a0,%d(s0)", assign.x * 4); } else if (e instanceof Continue) { return "jr s2\n"; } else if (e instanceof Break) { @@ -165,15 +165,15 @@ public class CodegenImpl implements Codegen { } // push old frame pointer - builder.append("sw fp,-4(sp)\n"); + builder.append("sw s0,-4(sp)\n"); builder.append("addi sp,sp,-8\n"); builder.append( // set frame pointer to start of arguments - "addi fp,sp,8\n" + "addi s0,sp,8\n" + "call " + methodLabel + "\n" // restore old frame pointer & stack pointer - + "lw fp,4(sp)\n" + + "lw s0,4(sp)\n" + "lw sp,(sp)\n" // restore return address of caller + "lw ra,-4(sp)\n"