aboutsummaryrefslogtreecommitdiff
path: root/ChocolArm64/IntermediateRepresentation/Operation.cs
diff options
context:
space:
mode:
authorgdkchan <gab.dark.100@gmail.com>2019-04-26 01:55:12 -0300
committerjduncanator <1518948+jduncanator@users.noreply.github.com>2019-04-26 14:55:12 +1000
commit8a7d99cdeae2355511d4eb43aefb76d0d886bcf8 (patch)
tree655d33f4db5dc3eb21c9c4ff5867b1179913585a /ChocolArm64/IntermediateRepresentation/Operation.cs
parent2b8eac1bcec6d4870776b4f302d9dd7794223642 (diff)
Refactoring and optimization on CPU translation (#661)
* Refactoring and optimization on CPU translation * Remove now unused property * Rename ilBlock -> block (local) * Change equality comparison on RegisterMask for consistency Co-Authored-By: gdkchan <gab.dark.100@gmail.com> * Add back the aggressive inlining attribute to the Synchronize method * Implement IEquatable on the Register struct * Fix identation
Diffstat (limited to 'ChocolArm64/IntermediateRepresentation/Operation.cs')
-rw-r--r--ChocolArm64/IntermediateRepresentation/Operation.cs112
1 files changed, 112 insertions, 0 deletions
diff --git a/ChocolArm64/IntermediateRepresentation/Operation.cs b/ChocolArm64/IntermediateRepresentation/Operation.cs
new file mode 100644
index 00000000..dcd01bcd
--- /dev/null
+++ b/ChocolArm64/IntermediateRepresentation/Operation.cs
@@ -0,0 +1,112 @@
+using ChocolArm64.State;
+using System;
+using System.Reflection;
+using System.Reflection.Emit;
+
+namespace ChocolArm64.IntermediateRepresentation
+{
+ class Operation
+ {
+ public BasicBlock Parent { get; set; }
+
+ public OperationType Type { get; }
+
+ private object[] _arguments { get; }
+
+ private Operation(OperationType type, params object[] arguments)
+ {
+ Type = type;
+ _arguments = arguments;
+ }
+
+ public T GetArg<T>(int index)
+ {
+ return (T)GetArg(index);
+ }
+
+ public object GetArg(int index)
+ {
+ if ((uint)index >= _arguments.Length)
+ {
+ throw new ArgumentOutOfRangeException(nameof(index));
+ }
+
+ return _arguments[index];
+ }
+
+ public static Operation Call(MethodInfo info)
+ {
+ return new Operation(OperationType.Call, info);
+ }
+
+ public static Operation CallVirtual(MethodInfo info)
+ {
+ return new Operation(OperationType.CallVirtual, info);
+ }
+
+ public static Operation IL(OpCode ilOp)
+ {
+ return new Operation(OperationType.IL, ilOp);
+ }
+
+ public static Operation ILBranch(OpCode ilOp, ILLabel target)
+ {
+ return new Operation(OperationType.ILBranch, ilOp, target);
+ }
+
+ public static Operation LoadArgument(int index)
+ {
+ return new Operation(OperationType.LoadArgument, index);
+ }
+
+ public static Operation LoadConstant(int value)
+ {
+ return new Operation(OperationType.LoadConstant, value);
+ }
+
+ public static Operation LoadConstant(long value)
+ {
+ return new Operation(OperationType.LoadConstant, value);
+ }
+
+ public static Operation LoadConstant(float value)
+ {
+ return new Operation(OperationType.LoadConstant, value);
+ }
+
+ public static Operation LoadConstant(double value)
+ {
+ return new Operation(OperationType.LoadConstant, value);
+ }
+
+ public static Operation LoadContext()
+ {
+ return new Operation(OperationType.LoadContext);
+ }
+
+ public static Operation LoadField(FieldInfo info)
+ {
+ return new Operation(OperationType.LoadField, info);
+ }
+
+ public static Operation LoadLocal(int index, RegisterType type, RegisterSize size)
+ {
+ return new Operation(OperationType.LoadLocal, index, type, size);
+ }
+
+ public static Operation MarkLabel(ILLabel label)
+ {
+ return new Operation(OperationType.MarkLabel, label);
+ }
+
+ public static Operation StoreContext()
+ {
+ return new Operation(OperationType.StoreContext);
+ }
+
+ public static Operation StoreLocal(int index, RegisterType type, RegisterSize size)
+ {
+ return new Operation(OperationType.StoreLocal, index, type, size);
+ }
+ }
+} \ No newline at end of file