From b8781807fd0697826dd1f5cf492d3e4d92c31167 Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 6 May 2021 15:12:04 +0800 Subject: [PATCH] modified function call sp = fp - (sp_off + n_args + 1)*wordSize --- src/main/java/chocopy/pa3/CodeGenImpl.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index fedf09b..d75e2b8 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -327,11 +327,11 @@ public class CodeGenImpl extends CodeGenBase curr = curr.getParentFuncInfo(); } - backend.emitSW(tmp, SP, -1 * wordSize, "Push static link onto active frame."); + backend.emitSW(tmp, FP, -(1+sp_off) * wordSize, "Push static link onto active frame."); freeRegister(tmpHandle); } else { - backend.emitSW(FP, SP, -1 * wordSize, "Push static link onto active frame."); + backend.emitSW(FP, FP, -(1+sp_off) * wordSize, "Push static link onto active frame."); } List args = node.args; @@ -368,12 +368,12 @@ public class CodeGenImpl extends CodeGenBase // All expressions should save their end result in A0 // So, once expr is evaluated add value inside A0 onto stack as an actual argument - backend.emitSW(A0, SP, -slotNum * wordSize, "Push actual argument for " + formalParamName + " onto stack"); + backend.emitSW(A0, FP, -(slotNum+sp_off) * wordSize, "Push actual argument for " + formalParamName + " onto stack"); } - backend.emitADDI(SP, SP, -spaceRequiredForArgs, "Set SP to last argument."); + backend.emitADDI(SP, FP, -spaceRequiredForArgs-sp_off*wordSize, "Set SP to last argument."); backend.emitJAL(calleeFunctionInfo.getCodeLabel(), "Invoke function: " + functionId.name); - backend.emitADDI(SP, SP, spaceRequiredForArgs, "Set SP to stack frame top."); + backend.emitADDI(SP, FP, spaceRequiredForArgs+sp_off*wordSize, "Set SP to stack frame top."); } return A0; @@ -1030,7 +1030,7 @@ public class CodeGenImpl extends CodeGenBase backend.emitMV(iter, Register.ZERO, "Initialize index variable"); backend.emitSW(iter, Register.FP, -sp_off*wordSize, "Store index on stack"); incSp(1); - backend.emitADDI(Register.SP, Register.SP, -2*wordSize, "Set SP to last argument"); + //backend.emitADDI(Register.SP, Register.SP, -2*wordSize, "Set SP to last argument"); backend.emitLocalLabel(startLoop, "Start for loop"); backend.emitLW(iter, Register.FP, -(sp_off-1)*wordSize, "Load index from stack"); backend.emitLW(l, Register.FP, -(sp_off-2)*wordSize, "Load string location from stack");