public Op GetJumpOp(AssemblyBuilder.AssemblyFunctionBuilder currentFunction) { switch (type) { case OperandTokenType.Literal: if (isAddressOf) { throw new InvalidOperationException(); } return(new Op(isDereference ? Operands.AddressInfoMask : Operands.LiteralInfoMask, op)); case OperandTokenType.Label: Boolean isFrameOffset = true; UInt64 labelOp; if (!currentFunction.instructionLabels.TryGetValue(text, out labelOp)) { // // TODO: Add check for dataOffset. If it is true, then set isFrameOffset to false // throw new FormatException(String.Format("For Op {0}, could not find instruction label '{1}'", ToString(), text)); } if (isAddressOf) { throw new NotImplementedException(); } if (isDereference) { return(new Op(isFrameOffset ? Operands.FrameOffsetDereferenceInfoMask : Operands.AddressDereferenceInfoMask, labelOp + op)); } return(new Op(isFrameOffset ? Operands.FrameOffsetInfoMask : Operands.AddressInfoMask, labelOp)); case OperandTokenType.FramePointer: throw new InvalidOperationException(); case OperandTokenType.DataPointer: throw new InvalidOperationException(); default: throw new InvalidOperationException(String.Format("Toke Type {0} unrecognized", type)); } }
public MemoryOp GetMemoryOp(AssemblyBuilder.AssemblyFunctionBuilder currentFunction) { switch (type) { case OperandTokenType.Literal: if (isAddressOf) { throw new InvalidOperationException(); } if (!isDereference) { throw new InvalidOperationException("You must dereference a literal (add '(#num)') if you are writing to it"); } return(new MemoryOp(Operands.AddressInfoMask, op)); case OperandTokenType.Label: Boolean isFrameOffset = true; UInt64 labelOp; if (!currentFunction.frameOffsetLabels.TryGetValue(text, out labelOp)) { // // TODO: Add check for dataOffset. If it is true, then set isFrameOffset to false // throw new FormatException(String.Format("For Op {0}, could not find label '{1}'", ToString(), text)); } if (isAddressOf) { throw new InvalidOperationException("For a memory op, you can't use address of ('&') on a label because it is not writable"); } if (isDereference) { return(new MemoryOp(isFrameOffset ? Operands.FrameOffsetDereferenceInfoMask : Operands.AddressDereferenceInfoMask, labelOp + op)); } return(new MemoryOp(isFrameOffset ? Operands.FrameOffsetInfoMask : Operands.AddressInfoMask, labelOp)); case OperandTokenType.FramePointer: if (isAddressOf) { throw new InvalidOperationException(); } if (!isDereference) { throw new NotImplementedException("Right now, the frame pointer must be dereferenced"); } return(new MemoryOp(Operands.FrameOffsetInfoMask, op)); case OperandTokenType.DataPointer: if (isAddressOf) { throw new InvalidOperationException(); } if (!isDereference) { throw new NotImplementedException("Right now, the data pointer must be dereferenced"); } return(new MemoryOp(Operands.AddressInfoMask, op)); default: throw new InvalidOperationException(String.Format("Toke Type {0} unrecognized", type)); } }