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); }