Skip to content
Snippets Groups Projects
Commit ce3700ad authored by Shivane Sabharwal's avatar Shivane Sabharwal
Browse files

Merge branch 'master' of...

Merge branch 'master' of https://github.com/cs164spring2019/pa3-chocopy-code-generation-code-generated
parents 6d8a1cd4 4135d07a
No related branches found
No related tags found
No related merge requests found
CLEAN=mvn clean package
TEST=java -cp "chocopy-ref.jar:target/assignment.jar" chocopy.ChocoPy --pass=..s --run --dir src/test/data/pa3/sample/ --test
FILE=None
FILE=op_cmp_int
clean:
$(CLEAN)
test:
......
x:bool = True
y:int = 5
while x:
print(123)
y = y-1
print(y)
y = y-1
print(y)
x = False
print(y)
print("Done")
......@@ -263,6 +263,8 @@ public class CodeGenImpl extends CodeGenBase {
* level. */
private FuncInfo funcInfo;
private int _r_local_label_counter = 427;
private Void allocPrototype(SymbolType typ, RiscVBackend.Register objReg) {
// Convention: if typ is INT_TYPE or BOOL_TYPE then objReg contains the literal value, not a pointer.
if (typ.equals(SymbolType.INT_TYPE)) {
......@@ -336,7 +338,7 @@ public class CodeGenImpl extends CodeGenBase {
}
if (symbolType.equals(SymbolType.INT_TYPE) || symbolType.equals(SymbolType.BOOL_TYPE)) {
// first run:
/*
/* All int and bool variable is not wrapped.
backend.emitLW(tmpReg, tmpReg, 3 * backend.getWordSize(), "ASSIGN: Load the value of INT or BOOL");
*/
}
......@@ -356,6 +358,63 @@ public class CodeGenImpl extends CodeGenBase {
return null;
}
private String getLablePrefix(String name) {
String labelPrefix = "";
if(funcInfo != null) {
labelPrefix += "$" + funcInfo.getFuncName();
}
labelPrefix += "$" + name + _r_local_label_counter;
++_r_local_label_counter;
return labelPrefix;
}
@Override
public Void analyze(IfStmt node) {
node.condition.dispatch(this);
RiscVBackend.Register tmpReg = /*regMgr.borrowTmp()*/ T6;
betterBackend.emitPop(tmpReg, "IfStmt: Get condition");
String labelPrefix = getLablePrefix("if");
Label elseLabel = new Label( labelPrefix + ".else");
Label exitLabel = new Label( labelPrefix + ".exit");
backend.emitBEQ(ZERO, tmpReg, elseLabel, "IfStmt: If condition is false, jump to else.");
for(Stmt stmt : node.thenBody) {
stmt.dispatch(this);
}
backend.emitJ(exitLabel, "IfStmt: Else body done. jump to end.");
backend.emitLocalLabel(elseLabel, "IfStmt: ELSE");
for(Stmt stmt : node.elseBody) {
stmt.dispatch(this);
}
backend.emitLocalLabel(exitLabel, "IfStmt: DONE");
return null;
}
@Override
public Void analyze(WhileStmt node) {
String labelPrefix = getLablePrefix("while");
Label beginLabel = new Label(labelPrefix + ".begin");
Label exitLabel = new Label(labelPrefix + ".exit");
backend.emitLocalLabel(beginLabel, "WhileStmt: Begin");
node.condition.dispatch(this);
RiscVBackend.Register tmpReg = /*borrowOneTmp*/ T6;
betterBackend.emitPop(tmpReg, "GetCondition");
backend.emitBEQ(ZERO, tmpReg, exitLabel, "WhileSTmt, IfFalse, exit");
for(Stmt stmt : node.body) {
stmt.dispatch(this);
}
backend.emitJ(beginLabel, "WhileStmt: GOTO begin");
backend.emitLocalLabel(exitLabel, "WhileStmt: End");
return null;
}
@Override
public Void analyze(CallExpr callExpr) {
......@@ -376,7 +435,6 @@ public class CodeGenImpl extends CodeGenBase {
}
backend.emitJAL(func.getCodeLabel(), "Invoke function");
// Restore SP
for (Expr e : callExpr.args) {
backend.emitADDI(SP, SP, 4, "Decrement stack ptr by 1");
......@@ -550,6 +608,7 @@ public class CodeGenImpl extends CodeGenBase {
// Don't think we need to do the SEQZ/SNEZ instructions here because XOR will already result in 1
// if they are not equal, which is the desired result.
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "<=":
if (binaryExpr.left.getInferredType().equals(SymbolType.INT_TYPE)) {
......@@ -567,7 +626,7 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSLLI(T1, T1, 4, "Compute offset to correct object");
backend.emitADD(T0, T0, T1, "Add offset to curr ptr");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case ">=":
if (binaryExpr.left.getInferredType().equals(SymbolType.INT_TYPE)) {
......@@ -585,6 +644,7 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSLLI(T1, T1, 4, "Compute offset to correct object");
backend.emitADD(T0, T0, T1, "Add offset to curr ptr");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "<":
if (binaryExpr.left.getInferredType().equals(SymbolType.INT_TYPE)) {
......@@ -601,7 +661,7 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSLLI(T1, T1, 4, "Compute offset to correct object");
backend.emitADD(T0, T0, T1, "Add offset to curr ptr");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case ">":
if (binaryExpr.left.getInferredType().equals(SymbolType.INT_TYPE)) {
......@@ -618,6 +678,37 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSLLI(T1, T1, 4, "Compute offset to correct object");
backend.emitADD(T0, T0, T1, "Add offset to curr ptr");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "and":
if (binaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
backend.emitAND(T0, T1, T0, "AND operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "or":
if (binaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
binaryExpr.left.dispatch(this);
backend.emitADDI(SP, SP, -4, "Increment stack ptr for second operand");
binaryExpr.right.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitLW(T1, SP, 0, "Load operand 1 into t1");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
backend.emitOR(T0, T1, T0, "OR operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
}
......@@ -639,6 +730,18 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "not":
if (unaryExpr.getInferredType().equals(SymbolType.INT_TYPE)) {
backend.emitADDI(SP, SP, -4, "Increment stack ptr for first operand");
unaryExpr.operand.dispatch(this);
backend.emitLW(T0, SP, 0, "Load operand 2 into t0");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for first operand");
backend.emitSEQZ(T0, T0, "NOT operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
}
return null;
}
......
This diff is collapsed.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment