aboutsummaryrefslogtreecommitdiff
path: root/src/Ryujinx.Cpu/LightningJit/Arm32/ScopedRegister.cs
blob: 18b1416eaa2e143c0c8e1e489e21dbb79c987944 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
using Ryujinx.Cpu.LightningJit.CodeGen;
using System;

namespace Ryujinx.Cpu.LightningJit.Arm32
{
    readonly struct ScopedRegister : IDisposable
    {
        private readonly RegisterAllocator _registerAllocator;
        private readonly Operand _operand;
        private readonly bool _isAllocated;

        public readonly Operand Operand => _operand;
        public readonly bool IsAllocated => _isAllocated;

        public ScopedRegister(RegisterAllocator registerAllocator, Operand operand, bool isAllocated = true)
        {
            _registerAllocator = registerAllocator;
            _operand = operand;
            _isAllocated = isAllocated;
        }

        public readonly void Dispose()
        {
            if (!_isAllocated)
            {
                return;
            }

            if (_operand.Type.IsInteger())
            {
                _registerAllocator.FreeTempGprRegister(_operand.AsInt32());
            }
            else
            {
                _registerAllocator.FreeTempFpSimdRegister(_operand.AsInt32());
            }
        }
    }
}