diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index b2919bc2ddcefb8f435c0b08f4ee60d1e2327582..b2a79b63a7fdf83f56cf42685125980dad18ebe8 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -6,6 +6,7 @@ import java.util.*; import chocopy.common.analysis.SymbolTable; import chocopy.common.analysis.AbstractNodeAnalyzer; import chocopy.common.analysis.types.SymbolType; +import chocopy.common.analysis.types.ValueType; import chocopy.common.astnodes.*; import chocopy.common.codegen.*; @@ -602,25 +603,19 @@ public class CodeGenImpl extends CodeGenBase { @Override public RiscVBackend.Register analyze(UnaryExpr node) { - RiscVBackend.Register operandReg = node.operand.dispatch(this); + RiscVBackend.Register operand = node.operand.dispatch(this); + RiscVBackend.Register operandReg = regMgr.borrowOnePersist(); + backend.emitMV(operandReg, operand, "save operand to persist reg"); + regMgr.returnOne(operand); // allocPrototype will destroy it! switch (node.operator) { case "-": - RiscVBackend.Register savedOpAddr = regMgr.borrowOneTmp(); - RiscVBackend.Register savedResult = regMgr.borrowOnePersist(); - backend.emitMV(savedOpAddr, operandReg, "Save operand addr in register"); - // TODO FIXME NOOOOO! YOU"RE DOINT THINGS WRONGLY. I'll complete the merge and fix it later. - if (node.operand instanceof IntegerLiteral) { - backend.emitLW(operandReg, operandReg, 3 * backend.getWordSize(), "Load operand value"); - } else if (node.operand instanceof Identifier) { - backend.emitLW(operandReg, operandReg, 0, "Load operand value"); - } - backend.emitSUB(savedResult, ZERO, operandReg, "Unary Operator-::INT save in same operand reg"); - RiscVBackend.Register heapObject = allocPrototype(SymbolType.INT_TYPE, savedResult); - regMgr.returnOne(operandReg); - regMgr.returnOne(savedOpAddr); - regMgr.returnOne(savedResult); + backend.emitLW(operandReg, operandReg, 3 * backend.getWordSize(), "Load operand value"); + backend.emitSUB(operandReg, ZERO, operandReg, "Unary Operator-::INT save in same operand reg"); + RiscVBackend.Register heapObject = allocPrototype(SymbolType.INT_TYPE, operandReg); + regMgr.returnOne(operandReg); + return heapObject; } return null; } @@ -630,9 +625,12 @@ public class CodeGenImpl extends CodeGenBase { SymbolInfo id = sym.get(node.name); if (id instanceof GlobalVarInfo) { GlobalVarInfo globalVarInfo = (GlobalVarInfo) id; - RiscVBackend.Register tmpReg = regMgr.borrowOneTmp(); - backend.emitLA(tmpReg, globalVarInfo.getLabel(), "Load address of the global var."); - return tmpReg; // FIXME: The global var contains a bare int rather than a INT OBJECT> + RiscVBackend.Register tmpReg = regMgr.borrowOnePersist(); + backend.emitLW(tmpReg, globalVarInfo.getLabel(), "Load address of the global var."); + // It at least works for int. + RiscVBackend.Register heapObject = allocPrototype(globalVarInfo.getVarType(), tmpReg); + regMgr.returnOne(tmpReg); + return heapObject; } // FIXME: not implemented return null;