From 3530c83c5fe525afe1599ccb267d80f9724dd425 Mon Sep 17 00:00:00 2001 From: bill Date: Thu, 6 May 2021 10:31:56 +0800 Subject: [PATCH] fixed ifexpr, binexpr, strindex etc --- src/main/java/chocopy/pa3/CodeGenImpl.java | 84 ++++++++++------------ 1 file changed, 39 insertions(+), 45 deletions(-) diff --git a/src/main/java/chocopy/pa3/CodeGenImpl.java b/src/main/java/chocopy/pa3/CodeGenImpl.java index 5fb4cae..2d989da 100644 --- a/src/main/java/chocopy/pa3/CodeGenImpl.java +++ b/src/main/java/chocopy/pa3/CodeGenImpl.java @@ -595,16 +595,20 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(IfExpr node) { - System.out.println("Inside IfExpr: "); Register result = node.condition.dispatch(this); Label ln = generateLocalLabel(); - backend.emitBEQZ(result, ln,"Jump to end of loop"); - node.thenExpr.dispatch(this); - backend.emitJ(ln, "Jump to end of if expression"); elseBlock.push(generateLocalLabel()); + + backend.emitBEQZ(result, elseBlock.peek(),"Jump to end of loop"); + result = node.thenExpr.dispatch(this); + if(result != A0) + backend.emitMV(A0, result, "move result"); + backend.emitJ(ln, "Jump to end of if expression"); backend.emitLocalLabel(elseBlock.peek(), "Else part of if expression"); - node.elseExpr.dispatch(this); + result = node.elseExpr.dispatch(this); + if(result != A0) + backend.emitMV(A0, result, "move result"); elseBlock.pop(); backend.emitLocalLabel(ln, "End of if expression"); return A0; @@ -694,7 +698,7 @@ public class CodeGenImpl extends CodeGenBase else if(operator.equals(">=")) { backend.emitADDI(Register.A0,Register.A0, 1, "Increment by 1"); - backend.emitSLT(Register.A0, Register.A0, Register.T0, comment); + backend.emitSLT(Register.A0, T0, A0, comment); } /* Maybe NA else if(operator.equals("is")) @@ -828,14 +832,14 @@ public class CodeGenImpl extends CodeGenBase } else if(operator.equals("is")) { - node.right.dispatch(this); - backend.emitSW(Register.A0, Register.FP, -sp_off*wordSize, "Push on stack slot "+sp_off); + Register l = node.right.dispatch(this); + backend.emitSW(l, FP, -sp_off*wordSize, "Push on stack slot "+sp_off); incSp(1); - node.left.dispatch(this); + Register r = node.left.dispatch(this); sp_off--; - backend.emitLW(Register.T0, Register.FP, -sp_off*wordSize, "Pop stack slot "+sp_off); - backend.emitXOR(Register.A0, Register.A0, Register.T0, "Operator: is"); - backend.emitSEQZ(Register.A0, Register.A0, "Result is True if XOR equals 0"); + backend.emitLW(T0, FP, -sp_off*wordSize, "Pop stack slot "+sp_off); + backend.emitXOR(A0, r, T0, "Operator: is"); + backend.emitSEQZ(A0, r, "Result is True if XOR equals 0"); } else { @@ -848,20 +852,12 @@ public class CodeGenImpl extends CodeGenBase public Register analyze(UnaryExpr node) { if(node.operator.equals("-") && node.getInferredType().equals(Type.INT_TYPE)) - { - node.operand.dispatch(this); - //backend.emitLI(Register.T0, -1, "Set value of Register T0 to -1"); - //backend.emitMUL(Register.A0, Register.A0, Register.T0, "Multiply by -1"); - backend.emitSUB(Register.A0, Register.ZERO, Register.A0, "Unary negation"); - } + backend.emitSUB(A0, ZERO, node.operand.dispatch(this), "Unary negation"); else if(node.operator.equals("not") && node.getInferredType().equals(Type.BOOL_TYPE)) - { - node.operand.dispatch(this); - backend.emitSEQZ(Register.T0, Register.A0, "Not operation on Register A0"); - } + backend.emitSEQZ(A0, node.operand.dispatch(this), "Not operation on Register A0"); else backend.emitJAL(errorNI, "Operator not implemented"); - return Register.A0; + return A0; } @Override public Register analyze(Identifier node) @@ -1078,17 +1074,21 @@ public class CodeGenImpl extends CodeGenBase @Override public Register analyze(IndexExpr node) { - incSp(1); + boolean old_lvalue = l_value; + l_value = false; Register listObj = node.list.dispatch(this); backend.emitSW(listObj, FP, -sp_off * wordSize, String.format("Push on stack slot %d", sp_off)); + incSp(1); + Register index = node.index.dispatch(this); + l_value = old_lvalue; Register vacantReg = (index != A0) ? A0 : A1; int tmpHandle = getRegister(); - Register temp= registerPool[tmpHandle]; + Register temp = registerPool[tmpHandle]; if (node.list.getInferredType().isListType()) { - backend.emitLW(vacantReg, FP, -sp_off * wordSize, String.format("Pop stack slot %d", sp_off)); + backend.emitLW(vacantReg, FP, -(sp_off-1) * wordSize, String.format("Pop stack slot %d", sp_off-1)); final Label bp = generateLocalLabel(); backend.emitBNEZ(vacantReg, bp, "Ensure not None"); backend.emitJ(errorNone, "Go to error handler"); @@ -1102,37 +1102,31 @@ public class CodeGenImpl extends CodeGenBase backend.emitLI(temp, wordSize, "Word size in bytes"); backend.emitMUL(index, index, temp, "Compute list element offset in bytes"); backend.emitADD(vacantReg, vacantReg, index, "Pointer to list element"); - backend.emitMV(temp,vacantReg,"Copy Result"); - backend.emitLW(A0, vacantReg, 0, "Load list element"); + if(l_value) + backend.emitMV(A0,vacantReg,"Copy Result"); + else + backend.emitLW(A0, vacantReg, 0, "Load list element"); } else { - backend.emitLW(vacantReg, FP, - sp_off * wordSize, String.format("Peek stack slot %d", sp_off- 1)); + backend.emitLW(vacantReg, FP, - (sp_off-1) * wordSize, String.format("Peek stack slot %d", sp_off- 1)); Label boundchk = generateLocalLabel(); backend.emitLW(temp, vacantReg, getAttrOffset(strClass, "__len__"), "Load attribute: __len__"); backend.emitBLTU(index, temp, boundchk, "Ensure 0 <= idx < len"); backend.emitJ(errorOob, "Go to error handler"); backend.emitLocalLabel(boundchk, "Index within bounds"); - incSp(1); - backend.emitSW(index, RiscVBackend.Register.FP, -sp_off * wordSize, String.format("Push on stack slot %d",sp_off)); - - getAttrOffset(strClass, "__len__"); - backend.emitLW(T0, FP, -sp_off * wordSize, String.format("Pop stack slot %d", sp_off)); - --sp_off; - backend.emitSW(A1, FP, -sp_off*wordSize, String.format("Push Argument %d", sp_off)); - - backend.emitADDI(T0, T0, 4 * wordSize, "Convert index to offset to char in bytes"); + backend.emitADDI(T0, vacantReg, 4 * wordSize, "Convert index to offset to char in bytes"); + backend.emitADD(T0, T0, index, "load char loc"); backend.emitLBU(T0, T0, 0, "Load character"); - backend.emitLA(vacantReg, strClass.getPrototypeLabel(), "Create Str for char"); - backend.emitJAL(objectAllocLabel, "Alloc char"); - backend.emitLI(T1, 1, "str size"); - backend.emitSW(T1, vacantReg, 3*wordSize, "len"); - backend.emitSW(T0, vacantReg, 4*wordSize, "ch"); - backend.emitMV(temp,vacantReg,"Copy Result"); + backend.emitSLLI(A0, T0, 2, "A0 = T0 * 4"); + backend.emitSLLI(T0, T0, 4, "T0 = T0 * 16"); + backend.emitADD(T0, T0, A0, " T0*20 = offset to all chars"); + backend.emitLA(A0, allCharsLabel, "All chars"); + backend.emitADD(A0, A0, T0, "get the char"); } freeRegister(tmpHandle); -- sp_off; - return temp; + return A0; } public Register analyze(MemberExpr node)