54 lines
1.3 KiB
Java
54 lines
1.3 KiB
Java
/*
|
|
* Code formatter project
|
|
* CS 4481
|
|
*/
|
|
package submit.ast;
|
|
|
|
import submit.MIPSResult;
|
|
import submit.RegisterAllocator;
|
|
import submit.SymbolTable;
|
|
|
|
/**
|
|
*
|
|
* @author edwajohn
|
|
*/
|
|
public class UnaryOperator extends AbstractNode implements Expression {
|
|
|
|
private final UnaryOperatorType type;
|
|
private final Expression expression;
|
|
|
|
public UnaryOperator(String type, Expression expression) {
|
|
this.type = UnaryOperatorType.fromString(type);
|
|
this.expression = expression;
|
|
}
|
|
|
|
@Override
|
|
public void toCminus(StringBuilder builder, String prefix) {
|
|
builder.append(type);
|
|
expression.toCminus(builder, prefix);
|
|
}
|
|
@Override
|
|
public MIPSResult toMIPS(StringBuilder code, StringBuilder data,
|
|
SymbolTable symbolTable,
|
|
RegisterAllocator regAllocator) {
|
|
MIPSResult result =
|
|
expression.toMIPS(code, data, symbolTable, regAllocator);
|
|
|
|
String reg = regAllocator.getRegisterOrLoadIntoRegister(result, code);
|
|
|
|
switch (type) {
|
|
case NEG:
|
|
code.append(String.format("sub %s $zero %s\n", reg, reg));
|
|
break;
|
|
case NOT:
|
|
code.append(String.format("sltu %s $zero %s\n", reg, reg))
|
|
.append(String.format("xori %s %s 1\n", reg, reg));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return MIPSResult.createRegisterResult(reg, VarType.INT);
|
|
}
|
|
}
|