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/Translation/ILOpCodeStoreState.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/Translation/ILOpCodeStoreState.cs')
| -rw-r--r-- | ChocolArm64/Translation/ILOpCodeStoreState.cs | 60 |
1 files changed, 0 insertions, 60 deletions
diff --git a/ChocolArm64/Translation/ILOpCodeStoreState.cs b/ChocolArm64/Translation/ILOpCodeStoreState.cs deleted file mode 100644 index a587dbfe..00000000 --- a/ChocolArm64/Translation/ILOpCodeStoreState.cs +++ /dev/null @@ -1,60 +0,0 @@ -using ChocolArm64.State; -using System.Reflection.Emit; - -namespace ChocolArm64.Translation -{ - struct ILOpCodeStoreState : IILEmit - { - private ILBlock _block; - - private TranslatedSub _callSub; - - public ILOpCodeStoreState(ILBlock block, TranslatedSub callSub = null) - { - _block = block; - _callSub = callSub; - } - - public void Emit(ILMethodBuilder context) - { - long intOutputs = context.RegUsage.GetIntOutputs(_block); - long vecOutputs = context.RegUsage.GetVecOutputs(_block); - - if (Optimizations.AssumeStrictAbiCompliance && context.IsSubComplete) - { - intOutputs = RegisterUsage.ClearCallerSavedIntRegs(intOutputs, context.IsAarch64); - vecOutputs = RegisterUsage.ClearCallerSavedVecRegs(vecOutputs, context.IsAarch64); - } - - if (_callSub != null) - { - //Those register are assigned on the callee function, without - //reading it's value first. We don't need to write them because - //they are not going to be read on the callee. - intOutputs &= ~_callSub.IntNiRegsMask; - vecOutputs &= ~_callSub.VecNiRegsMask; - } - - StoreLocals(context, intOutputs, RegisterType.Int); - StoreLocals(context, vecOutputs, RegisterType.Vector); - } - - private void StoreLocals(ILMethodBuilder context, long outputs, RegisterType baseType) - { - for (int bit = 0; bit < 64; bit++) - { - long mask = 1L << bit; - - if ((outputs & mask) != 0) - { - Register reg = ILMethodBuilder.GetRegFromBit(bit, baseType); - - context.Generator.EmitLdarg(TranslatedSub.StateArgIdx); - context.Generator.EmitLdloc(context.GetLocalIndex(reg)); - - context.Generator.Emit(OpCodes.Stfld, reg.GetField()); - } - } - } - } -}
\ No newline at end of file |
