using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Lost.JIT.AMD64 { [Serializable] public abstract class ConditionalJumpInstruction: ProcessorInstruction { public ConditionalJumpInstruction(int targetOffset) { TargetOffset = targetOffset; } public int TargetOffset { get; set; } public override int? Size { get { throw new NotImplementedException(); } } public override void Compile(Stream destStream) { if (TargetOffset.FitsInSByte()) { destStream.WriteByte(OpcodeBase); destStream.WriteSByte(TargetOffset); return; } else { destStream.WriteByte(0x0F); destStream.WriteByte(OpcodeBase + 0x10); destStream.WriteInt(TargetOffset); } } protected abstract int OpcodeBase { get; } public override string ToFASM() { return string.Format("{0} {1}", OpCodeFASM, TargetOffset + (TargetOffset.FitsInSByte() ? 2 : 6)); } } }