private ATranslatedSub TranslateTier0(AThreadState State, AMemory Memory, long Position) { ABlock Block = ADecoder.DecodeBasicBlock(State, Memory, Position); ABlock[] Graph = new ABlock[] { Block }; string SubName = GetSubroutineName(Position); AILEmitterCtx Context = new AILEmitterCtx(Cache, Graph, Block, SubName); do { Context.EmitOpCode(); }while (Context.AdvanceOpCode()); ATranslatedSub Subroutine = Context.GetSubroutine(); Subroutine.SetType(ATranslatedSubType.SubTier0); Cache.AddOrUpdate(Position, Subroutine, Block.OpCodes.Count); AOpCode LastOp = Block.GetLastOp(); return(Subroutine); }
private ATranslatedSub TranslateTier0(AMemory Memory, long Position) { ABlock Block = ADecoder.DecodeBasicBlock(this, Memory, Position); ABlock[] Graph = new ABlock[] { Block }; string SubName = GetSubName(Position); AILEmitterCtx Context = new AILEmitterCtx(this, Graph, Block, SubName); do { Context.EmitOpCode(); }while (Context.AdvanceOpCode()); ATranslatedSub Subroutine = Context.GetSubroutine(); lock (SubBlocks) { if (SubBlocks.Contains(Position)) { SubBlocks.Remove(Position); Subroutine.SetType(ATranslatedSubType.SubBlock); } else { Subroutine.SetType(ATranslatedSubType.SubTier0); } } CachedSubs.AddOrUpdate(Position, Subroutine, (Key, OldVal) => Subroutine); AOpCode LastOp = Block.GetLastOp(); lock (SubBlocks) { if (LastOp.Emitter != AInstEmit.Ret && LastOp.Emitter != AInstEmit.Br) { SubBlocks.Add(LastOp.Position + 4); } } return(Subroutine); }