Analyze Binary expression

master
Apoorva Ranade 4 years ago
parent 024cddfa95
commit c64ee11534

@ -162,7 +162,7 @@ public class CodeGenImpl extends CodeGenBase {
protected Label elseBlock; protected Label elseBlock;
// Variable to store offset from frame pointer to identify next // Variable to store offset from frame pointer to identify next
// empty space on stack frame to store variable // empty space on stack frame to store variable
private final int offset = 12; private int offset = 3;
/** /**
* An analyzer for the function described by FUNCINFO0, which is null for the * An analyzer for the function described by FUNCINFO0, which is null for the
* top level. * top level.
@ -272,7 +272,45 @@ public class CodeGenImpl extends CodeGenBase {
} }
@Override @Override
public Void analyze(BinaryExpr node) { public Void analyze(BinaryExpr node) {
node.left.dispatch(this);
backend.emitSW(Register.A0, Register.FP, offset*4, "Push on stack slot "+offset);
offset++;
node.right.dispatch(this);
offset--;
backend.emitLW(Register.T0, Register.FP, (offset)*4, "Pop stack slot "+offset);
if(node.operator.equals("+"))
backend.emitADD(Register.A0, Register.A0, Register.T0, "Add operation");
else if(node.operator.equals("-"))
backend.emitSUB(Register.A0, Register.A0, Register.T0, "Sub operation");
else if(node.operator.equals("*"))
backend.emitMUL(Register.A0, Register.A0, Register.T0, "Mul operation");
else if(node.operator.equals("/"))
backend.emitDIV(Register.A0, Register.A0, Register.T0, "Div operation");
else
{
elseBlock = generateLocalLabel(); elseBlock = generateLocalLabel();
String comment="Branch on not "+node.operator;
if(node.operator.equals("=="))
backend.emitBNE(Register.A0, Register.T0,elseBlock, comment);
else if(node.operator.equals("!="))
backend.emitBEQ(Register.A0, Register.T0,elseBlock, comment);
else if(node.operator.equals("<"))
backend.emitBGE(Register.A0, Register.T0,elseBlock, comment);
else if(node.operator.equals(">"))
{
backend.emitBLT(Register.A0, Register.T0,elseBlock, comment);
backend.emitBEQ(Register.A0, Register.T0,elseBlock, comment);
}
else if(node.operator.equals(">="))
backend.emitBLT(Register.A0, Register.T0,elseBlock, comment);
else if(node.operator.equals("<="))
{
Label temp = generateLocalLabel();
backend.emitBEQ(Register.A0, Register.T0,temp, "Branch on "+node.operator);
backend.emitBGE(Register.A0, Register.T0,elseBlock, comment);
backend.emitLocalLabel(temp, "True part of if check");
}
}
return null; return null;
} }

Loading…
Cancel
Save