示例#1
0
        x86GRegLocation AllocGRegHelper(int Size, bool OneByteVariant,
                                        x86GRegisterList CantBe = new x86GRegisterList(), bool EnableParamLocs = false)
        {
            if (Size == 1)
            {
                OneByteVariant = false;
            }

            var Mask     = new x86RegisterMask(Size);
            var HighMask = new x86RegisterMask(1, 1);

            var Sequence = x86CallConv.AllocationSequence.GRegisters;

            for (var i = 0; i < Sequence.Length; i++)
            {
                var Reg = Sequence[i];
                if (Arch.IsGRegisterExists(Reg, Mask) && IsGRegisterFree(Reg, Mask, EnableParamLocs))
                {
                    if (CantBe.Initialized && !CantBe.IsFree(Reg, Mask))
                    {
                        continue;
                    }
                    if (OneByteVariant && !Arch.IsGRegisterExists(Reg, 0, 1))
                    {
                        continue;
                    }

                    GRegisters.SetUsed(Reg, Mask);
                    return(new x86GRegLocation(Arch, Reg, Mask));
                }

                if (Size == 1 && Arch.IsGRegisterExists(Reg, HighMask) &&
                    IsGRegisterFree(Reg, HighMask, EnableParamLocs))
                {
                    if (CantBe.Initialized && !CantBe.IsFree(Reg, HighMask))
                    {
                        continue;
                    }
                    GRegisters.SetUsed(Reg, HighMask);
                    return(new x86GRegLocation(Arch, Reg, HighMask));
                }
            }

            return(null);
        }