예제 #1
0
        public x86StackLocation AllocMemory(int Size, int Align)
        {
            var P = DataStoring.AlignWithIncrease(StackOffset, Align);

            StackOffset = P + Size;

            return(new x86StackLocation(Arch, FuncScope, P, Size, false));
        }
    public void LoadDiaglogue()
    {
        DataStoring.Load();

        gameState = STATES.CURRENT;

        ChangeDialogue();
    }
예제 #3
0
        public SimpleRecResult Recognize(IdContainer Container, ref CodeString Code, List <Modifier> Out)
        {
            var        State = Container.State;
            CodeString Inside, Cutted;

            var Result = RecognizerHelper.ExtractBracket(State, String, '(', ref Code, out Inside, out Cutted);

            if (Result == SimpleRecResult.Succeeded)
            {
                var Params = RecognizerHelper.GetParamList(State, Inside, 1);
                if (Params == null)
                {
                    return(SimpleRecResult.Failed);
                }

                var Node = Constants.CreateCIntNode(Container, Params[0]);
                if (Node == null)
                {
                    return(SimpleRecResult.Failed);
                }

                var Align = (int)Node.Integer;
                if (!DataStoring.VerifyAlign(Align))
                {
                    State.Messages.Add(MessageId.InvalidAlign, Cutted);
                    return(SimpleRecResult.Failed);
                }

                for (var i = 0; i < Out.Count; i++)
                {
                    if (Out[i] is AlignModifier)
                    {
                        State.Messages.Add(MessageId.NotExpected, Cutted);
                        return(SimpleRecResult.Failed);
                    }
                }

                Out.Add(new AlignModifier(Cutted, Align));
                return(SimpleRecResult.Succeeded);
            }

            return(Result);
        }
예제 #4
0
        public x86DataLocation GetAllocated(x86DataLocationType Type, int Size, int Align = -1)
        {
            if ((Type & x86DataLocationType.General) != 0)
            {
                var Sequence = x86CallConv.AllocationSequence.GRegisters;
                var Mask     = new x86RegisterMask(Size);
                var HighMask = new x86RegisterMask(1, Size);

                if ((Type & x86DataLocationType.OneByte) == 0)
                {
                    for (var i = 0; i < Sequence.Length; i++)
                    {
                        var Reg = Sequence[i];
                        if (Arch.IsGRegisterExists(Reg, Mask) && !Arch.IsGRegisterExists(Reg, 0, 1) && !GRegisters.IsFree(Reg, Mask))
                        {
                            return(new x86GRegLocation(Arch, Reg, Mask));
                        }
                    }

                    for (var i = 0; i < Sequence.Length; i++)
                    {
                        var Reg = Sequence[i];
                        if (Arch.IsGRegisterExists(Reg, Mask) && !GRegisters.IsFree(Reg, Mask))
                        {
                            return(new x86GRegLocation(Arch, Reg, Mask));
                        }
                    }
                }
                else
                {
                    for (var i = 0; i < Sequence.Length; i++)
                    {
                        var Reg = Sequence[i];
                        if (Arch.IsGRegisterExists(Reg, Mask) && Arch.IsGRegisterExists(Reg, 0, 1) && !GRegisters.IsFree(Reg, Mask))
                        {
                            return(new x86GRegLocation(Arch, Reg, Mask));
                        }
                    }
                }
            }

            if ((Type & x86DataLocationType.SSEReg) != 0)
            {
                var Sequence = x86CallConv.AllocationSequence.SSERegisters;
                for (var i = 0; i < Sequence.Length; i++)
                {
                    var Reg = Sequence[i];
                    if (Reg < Arch.RegCount && !SSERegisters.IsFree(Reg))
                    {
                        return(new x86SSERegLocation(Arch, Reg, Size));
                    }
                }
            }

            if ((Type & x86DataLocationType.Memory) != 0)
            {
                StackOffset = DataStoring.AlignWithDecrease(StackOffset - Size, Align);
                return(new x86StackLocation(Arch, FuncScope, StackOffset, Size, false));
            }

            return(null);
        }
예제 #5
0
 public void AlignStack(int Align)
 {
     StackOffset = DataStoring.AlignWithIncrease(StackOffset, Align);
 }
 public void SaveDialogue()
 {
     DataStoring.Save();
 }