aboutsummaryrefslogtreecommitdiff
path: root/src/ARMeilleure/Translation/Compiler.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/ARMeilleure/Translation/Compiler.cs')
-rw-r--r--src/ARMeilleure/Translation/Compiler.cs68
1 files changed, 68 insertions, 0 deletions
diff --git a/src/ARMeilleure/Translation/Compiler.cs b/src/ARMeilleure/Translation/Compiler.cs
new file mode 100644
index 00000000..d4aa5cd9
--- /dev/null
+++ b/src/ARMeilleure/Translation/Compiler.cs
@@ -0,0 +1,68 @@
+using ARMeilleure.CodeGen;
+using ARMeilleure.CodeGen.Optimizations;
+using ARMeilleure.Diagnostics;
+using ARMeilleure.IntermediateRepresentation;
+using System;
+using System.Runtime.InteropServices;
+
+namespace ARMeilleure.Translation
+{
+ static class Compiler
+ {
+ public static CompiledFunction Compile(
+ ControlFlowGraph cfg,
+ OperandType[] argTypes,
+ OperandType retType,
+ CompilerOptions options,
+ Architecture target)
+ {
+ CompilerContext cctx = new(cfg, argTypes, retType, options);
+
+ if (options.HasFlag(CompilerOptions.Optimize))
+ {
+ Logger.StartPass(PassName.TailMerge);
+
+ TailMerge.RunPass(cctx);
+
+ Logger.EndPass(PassName.TailMerge, cfg);
+ }
+
+ if (options.HasFlag(CompilerOptions.SsaForm))
+ {
+ Logger.StartPass(PassName.Dominance);
+
+ Dominance.FindDominators(cfg);
+ Dominance.FindDominanceFrontiers(cfg);
+
+ Logger.EndPass(PassName.Dominance);
+
+ Logger.StartPass(PassName.SsaConstruction);
+
+ Ssa.Construct(cfg);
+
+ Logger.EndPass(PassName.SsaConstruction, cfg);
+ }
+ else
+ {
+ Logger.StartPass(PassName.RegisterToLocal);
+
+ RegisterToLocal.Rename(cfg);
+
+ Logger.EndPass(PassName.RegisterToLocal, cfg);
+ }
+
+ if (target == Architecture.X64)
+ {
+ return CodeGen.X86.CodeGenerator.Generate(cctx);
+ }
+ else if (target == Architecture.Arm64)
+ {
+ return CodeGen.Arm64.CodeGenerator.Generate(cctx);
+ }
+ else
+ {
+ throw new NotImplementedException(target.ToString());
+ }
+ }
+ }
+} \ No newline at end of file