internal DynarecFunction CreateFunction()
{
CpuEmitter.SpecialName = "";
var Time0 = DateTime.UtcNow;
AnalyzeBranches();
var Time1 = DateTime.UtcNow;
var Nodes = GenerateCode();
Nodes = ast.Statements(
ast.Comment(String.Format("Function {0:X8}-{1:X8}. Entry: {2:X8}", MinPC, MaxPC, EntryPC)),
//ast.DebugWrite(String.Format("Dynarec:PC:{0:X8}", EntryPC)),
//ast.Comment("Returns immediately when argument CpuThreadState is null, so we can call it on the generation thread to do prelinking."),
ast.If(
ast.Binary(ast.CpuThreadState, "==", ast.Null<CpuThreadState>()),
ast.Return()
),
Nodes
);
var Time2 = DateTime.UtcNow;
//var MipsMethodEmitterResult = MipsMethodEmitter.CreateDelegate(Nodes, (int)((MaxPC - MinPC) / 4));
var MipsMethodEmitterResult = MipsMethodEmitter.CreateDelegate(Nodes, AnalyzedPC.Count);
return new DynarecFunction()
{
Name = CpuEmitter.SpecialName,
CallingPCs = CallingPCs,
EntryPC = EntryPC,
MinPC = MinPC,
MaxPC = MaxPC,
AstNode = Nodes,
DisableOptimizations = MipsMethodEmitterResult.DisableOptimizations,
Delegate = MipsMethodEmitterResult.Delegate,
InstructionStats = InstructionStats,
TimeOptimize = MipsMethodEmitterResult.TimeOptimize,
TimeGenerateIL = MipsMethodEmitterResult.TimeGenerateIL,
TimeCreateDelegate = MipsMethodEmitterResult.TimeCreateDelegate,
TimeAnalyzeBranches = Time1 - Time0,
TimeGenerateAst = Time2 - Time1,
};
}