public Intermediate.Operand GetOperand(TargetUsage usage,
Intermediate.OperandSemantics semantics = Intermediate.OperandSemantics.None,
ushort offset = 0)
{
if (target == Targets.Stack)
{
switch (usage)
{
case TargetUsage.Peek: return CompilableNode.Operand("PEEK", semantics, offset);
case TargetUsage.Push: return CompilableNode.Operand("PUSH", semantics, offset);
case TargetUsage.Pop: return CompilableNode.Operand("POP", semantics, offset);
}
}
else if (target == Targets.Discard)
throw new InternalError("Unable to get operand from target with semantic 'discard'.");
else if (target == Targets.Raw)
return new Intermediate.Operand
{
register = (Intermediate.OperandRegister)virtualId,
semantics = semantics,
constant = offset
};
else
return CompilableNode.Virtual(virtualId, semantics, offset);
throw new InternalError("Unknown error while getting operand from target.");
}