Beispiel #1
0
        // set value
        public override void AddSetCodes(OpModule codes, Addr32 ad)
        {
            var flag = !ad.IsAddress && ad.Register == Var.DestRegister;
            if (flag) codes.Add(I386.Push(ad.Register));

            codes.Add(I386.Push(Reg32.EAX));
            codes.Add(I386.PushA(ad));
            codes.Add(codes.GetCall("delegate", DelgFunc.Free));
            codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
            codes.Add(codes.GetCall("delegate", DelgFunc.Duplicate));
            codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));

            if (flag) codes.Add(I386.Pop(ad.Register));
            base.AddSetCodes(codes, ad);
        }
Beispiel #2
0
        public override void AddCodes(OpModule codes)
        {
            int len = values.Count;
            if (len == 0)
            {
                codes.Add(I386.JmpD(Block.First));
                return;
            }

            for (int i = 0; i < values.Count; i++)
            {
                var v = values[i] as NodeBase;
                codes.Add(I386.Push(Reg32.EDX));
                if (v.Type is TypeString)
                {
                    v.AddCodesV(codes, "push", null);
                    codes.Add(codes.GetCall("case", TypeString.Equal));
                    codes.Add(I386.AddR(Reg32.ESP, Val32.New(8)));
                    codes.Add(I386.Test(Reg32.EAX, Reg32.EAX));
                    codes.Add(I386.Jcc(Cc.NZ, Block.First));
                }
                else
                {
                    v.AddCodesV(codes, "mov", null);
                    codes.Add(I386.Pop(Reg32.EDX));
                    codes.Add(I386.Cmp(Reg32.EDX, Reg32.EAX));
                    codes.Add(I386.Jcc(Cc.E, Block.First));
                }
            }
            if (IsLast) codes.Add(I386.JmpD(Parent.Destruct));
        }
Beispiel #3
0
 public override void AddDestructor(OpModule codes)
 {
     codes.Add(I386.MovRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
     codes.Add(I386.PushA(Addr32.New(Reg32.EAX)));
     codes.Add(codes.GetCall("delegate", DelgFunc.Free));
     codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
 }
Beispiel #4
0
 public static void AddReferenceCodes(OpModule codes)
 {
     codes.Add(I386.Push(Reg32.EAX));
     codes.Add(codes.GetCall("var", Reference));
     codes.Add(I386.Pop(Reg32.EAX));
 }
Beispiel #5
0
 private void AddFunc(OpModule codes, Addr32 dest, string func)
 {
     codes.Add(I386.PushA(dest));
     codes.Add(I386.XchgRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
     codes.Add(I386.Push(Reg32.EAX));
     codes.Add(codes.GetCall("string", func));
     codes.Add(I386.AddR(Reg32.ESP, Val32.New(8)));
     codes.Add(I386.XchgRA(Reg32.EAX, dest));
     codes.Add(I386.Push(Reg32.EAX));
     codes.AddDtorCodes(TypeString.Instance);
 }
Beispiel #6
0
 public override void AddOpCodes(string op, OpModule codes, Addr32 dest)
 {
     switch (op)
     {
         case "equal":
         case "not-equal":
             codes.Add(I386.PushA(dest));
             codes.Add(I386.XchgRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
             codes.Add(I386.Push(Reg32.EAX));
             codes.Add(codes.GetCall("string", Equal));
             codes.Add(I386.AddR(Reg32.ESP, Val32.New(8)));
             codes.Add(I386.Test(Reg32.EAX, Reg32.EAX));
             break;
         case "add":
             AddFunc(codes, dest, Add);
             break;
         case "add-char":
             AddFunc(codes, dest, Add + "_char");
             break;
         case "add-int":
             AddFunc(codes, dest, Add + "_int");
             break;
         case "sub":
             AddFunc(codes, dest, Sub);
             break;
         case "sub-char":
             AddFunc(codes, dest, Sub + "_char");
             break;
         case "sub-int":
             AddFunc(codes, dest, Sub + "_int");
             break;
         case "mul":
             AddFunc(codes, dest, Add);
             break;
         case "mul-int":
             AddFunc(codes, dest, Mul + "_int");
             break;
         default:
             base.AddOpCodes(op, codes, dest);
             break;
     }
 }