package zinara.ast.expression;
import zinara.ast.type.Type;
import zinara.ast.type.IntType;
import zinara.ast.type.FloatType;
import zinara.code_generator.Genx86;
import zinara.parser.parser;
import zinara.exceptions.InvalidCodeException;
import zinara.exceptions.TypeClashException;
import java.io.IOException;
public class UnaryExp extends Expression {
public int operator;
public Expression operand;
public UnaryExp ( int o, Expression e ) throws TypeClashException {
operator=o;
operand=e;
type = parser.operators.check(this.operator, this.operand.getType(), null);
}
public Type getType() {
return type;
}
public String toString() {
return operator + " " + operand;
}
public void tox86(Genx86 generate)
throws IOException,InvalidCodeException{
String reg = generate.regName(register,operand.type);
String stack_p = generate.stack_pointer();
if (operand instanceof IntegerExp)
((IntegerExp)operand).negative();
else if (operand instanceof FloatExp)
((FloatExp)operand).negative();
operand.tox86(generate);
if (operand instanceof Identifier){
if (operand.type instanceof IntType)
generate.write(generate.imul(reg,"-1"));
else if (operand.type instanceof FloatType){
String auxReg = generate.realRegName(register+1);
generate.save(register+1);
generate.write(generate.movReal(auxReg,
generate.toReal((double)-1)));
generate.write(generate.fmul(reg,auxReg));
generate.restore(register+1);
}
}
}
public boolean isStaticallyKnown() { return operand.isStaticallyKnown(); }
public Object staticValue() {
Object op = operand.staticValue();
if (op instanceof Integer) return new Integer(-((Integer)op).intValue());
else return new Float(-((Float)op).floatValue());
}
}