diff options
| author | FICTURE7 <FICTURE7@gmail.com> | 2021-10-19 02:51:22 +0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-10-18 19:51:22 -0300 |
| commit | fbf40424f4d3a9aecc7fe528d7503619738ce542 (patch) | |
| tree | df9ba920add4d744fe527e78cc040ff4658a6d7e /ARMeilleure/Translation/RegisterUsage.cs | |
| parent | d512ce122cb1c9a7fe7cb40d3f85d642ee37f897 (diff) | |
Add an early `TailMerge` pass (#2721)
* Add an early `TailMerge` pass
Some translations can have a lot of guest calls and since for each guest
call there is a call guard which may return. This can produce a lot of
epilogue code for returns. This pass merges the epilogue into a single
block.
```
Using filter 'hcq'.
Using metric 'code size'.
Total diff: -1648111 (-7.19 %) (bytes):
Base: 22913847
Diff: 21265736
Improved: 4567, regressed: 14, unchanged: 144
```
* Set PTC version
* Address feedback
* Handle `void` returning functions
* Actually handle `void` returning functions
* Fix `RegisterToLocal` logging
Diffstat (limited to 'ARMeilleure/Translation/RegisterUsage.cs')
| -rw-r--r-- | ARMeilleure/Translation/RegisterUsage.cs | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/ARMeilleure/Translation/RegisterUsage.cs b/ARMeilleure/Translation/RegisterUsage.cs index 035d4540..775fa3ab 100644 --- a/ARMeilleure/Translation/RegisterUsage.cs +++ b/ARMeilleure/Translation/RegisterUsage.cs @@ -203,12 +203,18 @@ namespace ARMeilleure.Translation // It always needs a context load as it is the first block to run. if (block.Predecessors.Count == 0 || hasContextLoad) { - arg = Local(OperandType.I64); + long vecMask = globalInputs[block.Index].VecMask; + long intMask = globalInputs[block.Index].IntMask; - Operation loadArg = block.Operations.AddFirst(Operation(Instruction.LoadArgument, arg, Const(0))); + if (vecMask != 0 || intMask != 0) + { + arg = Local(OperandType.I64); + + Operation loadArg = block.Operations.AddFirst(Operation(Instruction.LoadArgument, arg, Const(0))); - LoadLocals(block, globalInputs[block.Index].VecMask, RegisterType.Vector, mode, loadArg, arg); - LoadLocals(block, globalInputs[block.Index].IntMask, RegisterType.Integer, mode, loadArg, arg); + LoadLocals(block, vecMask, RegisterType.Vector, mode, loadArg, arg); + LoadLocals(block, intMask, RegisterType.Integer, mode, loadArg, arg); + } } bool hasContextStore = HasContextStore(block); @@ -220,15 +226,21 @@ namespace ARMeilleure.Translation if (EndsWithReturn(block) || hasContextStore) { - if (arg == default) + long vecMask = globalOutputs[block.Index].VecMask; + long intMask = globalOutputs[block.Index].IntMask; + + if (vecMask != 0 || intMask != 0) { - arg = Local(OperandType.I64); + if (arg == default) + { + arg = Local(OperandType.I64); - block.Append(Operation(Instruction.LoadArgument, arg, Const(0))); - } + block.Append(Operation(Instruction.LoadArgument, arg, Const(0))); + } - StoreLocals(block, globalOutputs[block.Index].IntMask, RegisterType.Integer, mode, arg); - StoreLocals(block, globalOutputs[block.Index].VecMask, RegisterType.Vector, mode, arg); + StoreLocals(block, intMask, RegisterType.Integer, mode, arg); + StoreLocals(block, vecMask, RegisterType.Vector, mode, arg); + } } } } |
