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

Added op_cmp_* logic, but mysterious bug causing failure, still 16 tests

parent dc03295f
No related branches found
No related tags found
No related merge requests found
......@@ -439,8 +439,7 @@ public class CodeGenImpl extends CodeGenBase {
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.emitADDI(SP, SP, -4, "Increment stack ptr for result");
backend.emitADDI(SP, SP, 4, "Decrement stack ptr for second operand");
backend.emitADD(T0, T0, T1, "Add operands");
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
......@@ -505,6 +504,107 @@ public class CodeGenImpl extends CodeGenBase {
backend.emitSW(T0, SP, 0, "Push result onto stack");
return null;
}
case "==":
if (binaryExpr.getInferredType().equals(SymbolType.BOOL_TYPE) ||
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.emitXOR(T0, T0, T1, "== operator on BOOL/INT");
backend.emitSEQZ(T0, T0, "Set to 1 if XOR results in 0, they were equal");
backend.emitSW(T0, SP, 0, "Push result onto stack");
}
case "!=":
if (binaryExpr.getInferredType().equals(SymbolType.BOOL_TYPE) ||
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.emitXOR(T0, T0, T1, "!= operator on BOOL/INT");
backend.emitSNEZ(T0, T0, "Set to 1 if XOR was not 0, they were not equal");
// 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");
}
case "<=":
if (binaryExpr.left.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.emitADDI(T1, T1, -1, "decrement LEFT by 1");
backend.emitSLT(T1, T1, T0, "LEFT <=? RIGHT");
backend.emitLA(T0, constants.getBoolConstant(false), "Load False object");
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");
}
case ">=":
if (binaryExpr.left.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.emitADDI(T0, T0, -1, "decrement RIGHT by 1");
backend.emitSLT(T1, T0, T1, "LEFT >=? RIGHT");
backend.emitLA(T0, constants.getBoolConstant(false), "Load False object");
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");
}
case "<":
if (binaryExpr.left.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.emitSLT(T1, T1, T0, "LEFT <? RIGHT");
backend.emitLA(T0, constants.getBoolConstant(false), "Load False object");
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");
}
case ">":
if (binaryExpr.left.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.emitSLT(T1, T0, T1, "LEFT >? RIGHT");
backend.emitLA(T0, constants.getBoolConstant(false), "Load False object");
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;
......
This diff is collapsed.
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