diff options
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); + } } } } |
