diff options
| author | gdkchan <gab.dark.100@gmail.com> | 2019-04-26 01:55:12 -0300 |
|---|---|---|
| committer | jduncanator <1518948+jduncanator@users.noreply.github.com> | 2019-04-26 14:55:12 +1000 |
| commit | 8a7d99cdeae2355511d4eb43aefb76d0d886bcf8 (patch) | |
| tree | 655d33f4db5dc3eb21c9c4ff5867b1179913585a /ChocolArm64/IntermediateRepresentation/Operation.cs | |
| parent | 2b8eac1bcec6d4870776b4f302d9dd7794223642 (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.cs | 112 |
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 |
