public GetOperand ( TargetUsage usage, Intermediate semantics = Intermediate.OperandSemantics.None, ushort offset ) : Intermediate.Operand | ||
usage | TargetUsage | |
semantics | Intermediate | |
offset | ushort | |
Résultat | Intermediate.Operand |
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.");
}
public override Intermediate.IRNode Emit(CompileContext context, Model.Scope scope, Target target) { var r = new TransientNode(); if (_struct.size == 0) throw new InternalError("Struct size not yet determined"); r.AddInstruction(Instructions.SET, target.GetOperand(TargetUsage.Push), Constant((ushort)_struct.size)); return r; }