コード例 #1
0
ファイル: ATranslator.cs プロジェクト: simontime/Ryujinx
        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);
        }
コード例 #2
0
        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);
        }