コード例 #1
0
 public AstNodeStmIfElse(AstNodeExpr Condition, AstNodeStm True, AstNodeStm False = null)
 {
     //if (False == null) False = new AstNodeStmEmpty();
     this.Condition = Condition;
     this.True = True;
     this.False  = False;
 }
コード例 #2
0
 public AstNodeStmIfElse(AstNodeExpr condition, AstNodeStm @true, AstNodeStm @false = null)
 {
     //if (False == null) False = new AstNodeStmEmpty();
     Condition = condition;
     True      = @true;
     False     = @false;
 }
コード例 #3
0
		public AstNodeStm _branch_likely(AstNodeStm Code)
		{
			return ast.IfElse(
				BranchFlag(),
				Code
			);
		}
コード例 #4
0
 public AstNodeStmIfElse(AstNodeExpr Condition, AstNodeStm True, AstNodeStm False = null)
 {
     //if (False == null) False = new AstNodeStmEmpty();
     this.Condition = Condition;
     this.True      = True;
     this.False     = False;
 }
コード例 #5
0
ファイル: AstOptimizerPsp.cs プロジェクト: shin527/cspspemu
		public static AstNodeStm GlobalOptimize(CpuProcessor Processor, AstNodeStm AstNodeStm)
		{
			if (Processor.PspConfig.StoredConfig.EnableAstOptimizations)
			{
				return (AstNodeStm)(new AstOptimizerPsp(Processor)).Optimize(ast.Statements(AstNodeStm, ast.Return()));
			} else {
				return AstNodeStm;
			}
		}
コード例 #6
0
ファイル: AstOptimizerPsp.cs プロジェクト: soywiz/cspspemu
		public static AstNodeStm GlobalOptimize(CpuProcessor Processor, AstNodeStm AstNodeStm)
		{
			if (Processor == null || Processor.CpuConfig.EnableAstOptimizations)
			{
				return (AstNodeStm)(new AstOptimizerPsp(Processor != null ? Processor.Memory : null)).Optimize(ast.Statements(AstNodeStm, ast.Return()));
			} else {
				return AstNodeStm;
			}
		}
コード例 #7
0
 public static AstNodeStm GlobalOptimize(CpuProcessor processor, AstNodeStm astNodeStm)
 {
     if (processor == null || processor.CpuConfig.EnableAstOptimizations)
     {
         return((AstNodeStm)(new AstOptimizerPsp(processor?.Memory)).Optimize(
                    ast.Statements(astNodeStm, ast.Return())));
     }
     return(astNodeStm);
 }
コード例 #8
0
ファイル: MipsMethodEmitter.cs プロジェクト: shin527/cspspemu
		public Action<CpuThreadState> CreateDelegate(AstNodeStm AstNodeStm)
		{
			//ILGenerator.Emit(OpCodes.Ret);
			// Optimize
			AstNodeStm = AstOptimizerPsp.GlobalOptimize(Processor, ast.Statements(AstNodeStm, ast.Return()));

#if DEBUG_GENERATE_IL
			Console.WriteLine("{0}", GeneratorIL.GenerateToString<GeneratorILPsp>(DynamicMethod, AstNodeStm));
#endif
#if DEBUG_GENERATE_IL_CSHARP
			Console.WriteLine("{0}", (new GeneratorCSharpPsp()).GenerateRoot(AstNodeStm).ToString().Replace("CpuThreadState.", ""));
#endif

			new GeneratorILPsp().Init(DynamicMethod, ILGenerator).GenerateRoot(AstNodeStm);

			try
			{
				var Method = (Action<CpuThreadState>)DynamicMethod.CreateDelegate(typeof(Action<CpuThreadState>));
				//Console.WriteLine(Method.Method.);
				if (Platform.IsMono)
				{
					Marshal.Prelink(Method.Method);
				}

				return Method;
			}
			catch (InvalidProgramException InvalidProgramException)
			{
#if LOG_TRACE
				Console.WriteLine("Invalid Delegate:");
				foreach (var Line in SafeILGenerator.GetEmittedInstructions())
				{
					if (Line.Substr(0, 1) == ":")
					{
						Console.WriteLine("{0}", Line);
					}
					else
					{
						Console.WriteLine("    {0}", Line);
					}
				}
#endif
				throw (InvalidProgramException);
			}
		}
コード例 #9
0
        public static void GenerateIl(this AstNodeStm astNodeStm, MethodInfo dynamicMethod)
        {
            ILGenerator ilGenerator;

            switch (dynamicMethod)
            {
            case DynamicMethod dm:
                ilGenerator = dm.GetILGenerator();
                break;

            case MethodBuilder mb:
                ilGenerator = mb.GetILGenerator();
                break;

            default:
                throw(new InvalidOperationException("Not a DynamicMethod/MethodBuilder"));
            }
            GenerateIl(astNodeStm, dynamicMethod, ilGenerator);
        }
コード例 #10
0
 public AstNodeCaseDefault Default(AstNodeStm code) => new AstNodeCaseDefault(code);
コード例 #11
0
 public AstNodeStmIfElse IfElse(AstNodeExpr condition, AstNodeStm True, AstNodeStm False) =>
 new AstNodeStmIfElse(condition, True, False);
コード例 #12
0
 public AstNodeCase Case(object value, AstNodeStm code) => new AstNodeCase(value, code);
コード例 #13
0
 public AstNodeCaseDefault(AstNodeStm Code)
 {
     this.Code = Code;
 }
コード例 #14
0
            private AstNodeStm ProcessGeneratedInstruction(MipsDisassembler.Result disasm, AstNodeStm astNodeStm)
            {
                var pc = disasm.InstructionPc;

                return(_ast.Statements(
#if DEBUG_TRACE_INSTRUCTIONS
                           ast.DebugWrite(String.Format("0x{0:X8}: {1}", PC, Disasm)),
#endif
                           astNodeStm
                           ));
            }
コード例 #15
0
        public Result CreateDelegate(AstNodeStm astNodeStm, int totalInstructions)
        {
            var time0 = DateTime.UtcNow;

            astNodeStm = AstOptimizerPsp.GlobalOptimize(_processor, Ast.Statements(astNodeStm, Ast.Return()));

            var time1 = DateTime.UtcNow;

#if DEBUG_GENERATE_IL
            Console.WriteLine("{0}", GeneratorIL.GenerateToString <GeneratorILPsp>(DynamicMethod, AstNodeStm));
#endif
#if DEBUG_GENERATE_IL_CSHARP
            Console.WriteLine("{0}", AstNodeExtensions.ToCSharpString(AstNodeStm).Replace("CpuThreadState.", ""));
#endif

            Action <CpuThreadState> Delegate;
            var time2 = time1;

            var disableOptimizations = DynarecConfig.DisableDotNetJitOptimizations;
            if (totalInstructions >= DynarecConfig.InstructionCountToDisableOptimizations)
            {
                disableOptimizations = true;
            }

            if (Platform.IsMono)
            {
                disableOptimizations = false;
            }
            if (DynarecConfig.ForceJitOptimizationsOnEvenLargeFunctions)
            {
                disableOptimizations = false;
            }

            try
            {
                Delegate = MethodCreator.CreateDynamicMethod <Action <CpuThreadState> >(
                    //Delegate = MethodCreator.CreateMethodInClass<Action<CpuThreadState>>(
                    Assembly.GetExecutingAssembly().ManifestModule,
                    $"DynamicMethod_0x{this._pc:X}",
                    disableOptimizations,
                    dynamicMethod =>
                {
                    astNodeStm.GenerateIl(dynamicMethod);
                    time2 = DateTime.UtcNow;
                }
                    );
            }
            catch (InvalidProgramException)
            {
                Console.Error.WriteLine("Invalid Delegate:");
#if LOG_TRACE
                Console.WriteLine("Invalid Delegate:");
                foreach (var Line in SafeILGenerator.GetEmittedInstructions())
                {
                    if (Line.Substr(0, 1) == ":")
                    {
                        Console.WriteLine("{0}", Line);
                    }
                    else
                    {
                        Console.WriteLine("    {0}", Line);
                    }
                }
#endif
                throw;
            }

            var time3 = DateTime.UtcNow;

            return(new Result
            {
                Delegate = Delegate,
                DisableOptimizations = disableOptimizations,
                TimeOptimize = time1 - time0,
                TimeGenerateIl = time2 - time1,
                TimeCreateDelegate = time3 - time2,
            });
        }
コード例 #16
0
 public AstNodeStmIfElse IfElse(AstNodeExpr Condition, AstNodeStm True, AstNodeStm False)
 {
     return(new AstNodeStmIfElse(Condition, True, False));
 }
コード例 #17
0
 public static void GenerateIl(this AstNodeStm astNodeStm, MethodInfo methodInfo, ILGenerator ilGenerator) =>
 GeneratorIlPsp.Init(methodInfo, ilGenerator).Reset().GenerateRoot(astNodeStm);
コード例 #18
0
 public static void GenerateIl(this AstNodeStm astNodeStm, MethodBuilder dynamicMethod) =>
 GenerateIl(astNodeStm, dynamicMethod, dynamicMethod.GetILGenerator());
コード例 #19
0
 public AstNodeCase(object value, AstNodeStm code)
 {
     CaseValue = value;
     Code      = code;
 }
コード例 #20
0
 public AstNodeStmCpuInstruction(InstructionInfo InstructionInfo, AstNodeStm AstNodeStm)
 {
     this.InstructionInfo = InstructionInfo;
     this.AstNodeStm = AstNodeStm;
 }
コード例 #21
0
 public AstNodeCaseDefault(AstNodeStm code)
 {
     Code = code;
 }
コード例 #22
0
ファイル: AstNodeCase.cs プロジェクト: soywiz/SafeILGenerator
 public AstNodeCaseDefault(AstNodeStm Code)
 {
     this.Code = Code;
 }
コード例 #23
0
ファイル: AstNodeCase.cs プロジェクト: soywiz/SafeILGenerator
 public AstNodeCase(object Value, AstNodeStm Code)
 {
     this.CaseValue = Value;
     this.Code = Code;
 }
コード例 #24
0
 public static AstNodeStm Optimize(this AstNodeStm astNodeStm, CpuProcessor cpuProcessor) =>
 AstOptimizerPsp.GlobalOptimize(cpuProcessor, astNodeStm);
コード例 #25
0
 public static string ToIlString(this AstNodeStm astNodeStm, MethodInfo methodInfo) =>
 GeneratorIlPsp.Reset().GenerateToString(methodInfo, astNodeStm);
コード例 #26
0
 public static TType GenerateDelegate <TType>(this AstNodeStm astNodeStm, string methodName) =>
 GeneratorIlPsp.GenerateDelegate <TType>(methodName, astNodeStm);
コード例 #27
0
 public AstNodeStmPspInstruction(MipsDisassembler.Result disassembledResult, AstNodeStm statement)
 {
     DisassembledResult = disassembledResult;
     Statement          = statement;
 }
コード例 #28
0
 public AstNodeCaseDefault Default(AstNodeStm Code)
 {
     return(new AstNodeCaseDefault(Code));
 }
コード例 #29
0
 public void AddStatement(AstNodeStm node) => Nodes.Add(node);
コード例 #30
0
 public static string ToIlString <TDelegate>(this AstNodeStm astNodeStm) =>
 ToIlString(astNodeStm, typeof(TDelegate).GetMethod("Invoke"));
コード例 #31
0
        private void UpdateText()
        {
            if (PcListBox.SelectedItem != null)
            {
                var        PCItem          = (PCItem)PcListBox.SelectedItem;
                var        MethodCacheInfo = PCItem.MethodCacheInfo;
                var        MinPC           = MethodCacheInfo.MinPc;
                var        MaxPC           = MethodCacheInfo.MaxPc;
                var        Memory          = CpuProcessor.Memory;
                AstNodeStm Node            = null;
                if (MethodCacheInfo.AstTree != null)
                {
                    Node = MethodCacheInfo.AstTree.Optimize(CpuProcessor);
                }

                var InfoLines = new List <string>();

                InfoLines.Add($"Name: {MethodCacheInfo.Name}");
                InfoLines.Add($"TotalInstructions: {MethodCacheInfo.TotalInstructions}");
                InfoLines.Add($"DisableOptimizations: {MethodCacheInfo.DynarecFunction.DisableOptimizations}");

                InfoLines.Add($"EntryPC: 0x{MethodCacheInfo.EntryPc:X8}");
                InfoLines.Add($"MinPC: 0x{MethodCacheInfo.MinPc:X8}");
                InfoLines.Add($"MaxPC: 0x{MethodCacheInfo.MaxPc:X8}");
                InfoLines.Add(
                    $"TimeAnalyzeBranches: {MethodCacheInfo.DynarecFunction.TimeAnalyzeBranches.TotalMilliseconds}");
                InfoLines.Add($"TimeGenerateAst: {MethodCacheInfo.DynarecFunction.TimeGenerateAst.TotalMilliseconds}");
                InfoLines.Add($"TimeOptimize: {MethodCacheInfo.DynarecFunction.TimeOptimize.TotalMilliseconds}");
                InfoLines.Add($"TimeGenerateIL: {MethodCacheInfo.DynarecFunction.TimeGenerateIl.TotalMilliseconds}");
                InfoLines.Add(
                    $"TimeCreateDelegate: {MethodCacheInfo.DynarecFunction.TimeCreateDelegate.TotalMilliseconds}");
                InfoLines.Add($"TimeLinking: {MethodCacheInfo.DynarecFunction.TimeLinking.TotalMilliseconds}");
                InfoLines.Add($"TimeTotal: {MethodCacheInfo.DynarecFunction.TimeTotal.TotalMilliseconds}");

                InfoLines.Add(string.Format(""));
                foreach (var Item in MethodCacheInfo.DynarecFunction.InstructionStats.OrderBy(Pair => Pair.Value))
                {
                    InfoLines.Add($"{Item.Key}: {Item.Value}");
                }

                InfoTextBox.Text = string.Join("\r\n", InfoLines);

                var OutString = "";
                switch (LanguageComboBox.SelectedItem.ToString())
                {
                case "C#":
                    if (Node != null)
                    {
                        OutString = Node.ToCSharpString().Replace("CpuThreadState.", "");
                    }
                    break;

                case "IL":
                    if (Node != null)
                    {
                        OutString = Node.ToIlString <Action <CpuThreadState> >();
                    }
                    break;

                case "Ast":
                    if (Node != null)
                    {
                        OutString = AstSerializer.SerializeAsXml(Node);
                    }
                    break;

                case "Mips":
                {
                    var MipsDisassembler = new MipsDisassembler();
                    try
                    {
                        for (uint PC = MinPC; PC <= MaxPC; PC += 4)
                        {
                            var Instruction = Memory.ReadSafe <Instruction>(PC);
                            var Result      = MipsDisassembler.Disassemble(PC, Instruction);
                            OutString += $"0x{PC:X8}: {Result.ToString()}\r\n";
                        }
                    }
                    catch (Exception Exception)
                    {
                        Console.Error.WriteLine(Exception);
                    }
                }
                break;

                default:
                    break;
                }

                ViewTextBox.Text = OutString.Replace("\n", "\r\n");
            }
        }
コード例 #32
0
 public AstNodeCase(object Value, AstNodeStm Code)
 {
     this.CaseValue = Value;
     this.Code      = Code;
 }
コード例 #33
0
 public AstNodeStmPspInstruction(MipsDisassembler.Result DisassembledResult, AstNodeStm Statement)
 {
     this.DisassembledResult = DisassembledResult;
     this.Statement = Statement;
 }
コード例 #34
0
 public AstNodeCase Case(object Value, AstNodeStm Code)
 {
     return(new AstNodeCase(Value, Code));
 }
コード例 #35
0
		public Result CreateDelegate(AstNodeStm AstNodeStm, int TotalInstructions)
		{
			var Time0 = DateTime.UtcNow;

			AstNodeStm = AstOptimizerPsp.GlobalOptimize(Processor, ast.Statements(AstNodeStm, ast.Return()));

			var Time1 = DateTime.UtcNow;

#if DEBUG_GENERATE_IL
			Console.WriteLine("{0}", GeneratorIL.GenerateToString<GeneratorILPsp>(DynamicMethod, AstNodeStm));
#endif
#if DEBUG_GENERATE_IL_CSHARP
			Console.WriteLine("{0}", AstNodeExtensions.ToCSharpString(AstNodeStm).Replace("CpuThreadState.", ""));
#endif

			Action<CpuThreadState> Delegate;
			var Time2 = Time1;

			bool DisableOptimizations = _DynarecConfig.DisableDotNetJitOptimizations;
			if (TotalInstructions >= _DynarecConfig.InstructionCountToDisableOptimizations) DisableOptimizations = true;

			if (Platform.IsMono) DisableOptimizations = false;

			try
			{
				Delegate = MethodCreator.CreateDynamicMethod<Action<CpuThreadState>>(
				//Delegate = MethodCreator.CreateMethodInClass<Action<CpuThreadState>>(
					Assembly.GetExecutingAssembly().ManifestModule,
					String.Format("DynamicMethod_0x{0:X}", this.PC),
					DisableOptimizations,
					(DynamicMethod) =>
					{
						AstNodeStm.GenerateIL(DynamicMethod);
						Time2 = DateTime.UtcNow;
					}
				);
			}
			catch (InvalidProgramException InvalidProgramException)
			{
				Console.Error.WriteLine("Invalid Delegate:");
#if LOG_TRACE
				Console.WriteLine("Invalid Delegate:");
				foreach (var Line in SafeILGenerator.GetEmittedInstructions())
				{
					if (Line.Substr(0, 1) == ":")
					{
						Console.WriteLine("{0}", Line);
					}
					else
					{
						Console.WriteLine("    {0}", Line);
					}
				}
#endif
				throw (InvalidProgramException);
			}

			var Time3 = DateTime.UtcNow;

			return new Result()
			{
				Delegate = Delegate,
				DisableOptimizations = DisableOptimizations,
				TimeOptimize = Time1 - Time0,
				TimeGenerateIL = Time2 - Time1,
				TimeCreateDelegate = Time3 - Time2,
			};
		}
コード例 #36
0
 public void AddStatement(AstNodeStm Node)
 {
     this.Nodes.Add(Node);
 }
コード例 #37
0
 private AstNodeStm ProcessGeneratedInstruction(MipsDisassembler.Result Disasm, AstNodeStm AstNodeStm)
 {
     var PC = Disasm.InstructionPC;
     return ast.Statements(
     #if DEBUG_TRACE_INSTRUCTIONS
         ast.DebugWrite(String.Format("0x{0:X8}: {1}", PC, Disasm)),
     #endif
         AstNodeStm
     );
 }
コード例 #38
0
 public AstNodeStm _branch_likely(AstNodeStm code) => _ast.If(BranchFlag(), code);
コード例 #39
0
 public void AddStatement(AstNodeStm Node)
 {
     this.Nodes.Add(Node);
 }