Beispiel #1
0
        public override void AddCodesV(OpModule codes, string op, Addr32 dest)
        {
            if (AddConstCodes(codes, op, dest)) return;

            OpCode last = new OpCode();
            Addr32 ad = Addr32.New(Reg32.ESP);
            var tb = CheckFunc();
            var c = GetCond();
            var v = values[0] as NodeBase;
            v.AddCodesV(codes, "push", null);
            for (int i = 1; i < values.Count; i++)
            {
                codes.AddOperatorCodes(tb, Tag, ad, values[i] as NodeBase, true);
                if (i < values.Count - 1)
                {
                    codes.Add(I386.Jcc(c.NotCondition, last.Address));
                    codes.Add(I386.MovAR(ad, Reg32.EAX));
                }
            }
            codes.Add(last);
            codes.Add(I386.MovR(Reg32.EAX, Val32.New(0)));
            codes.Add(I386.Setcc(c.Condition, Reg8.AL));
            if (!OpModule.NeedsDtor(v))
                codes.Add(I386.AddR(Reg32.ESP, Val32.New(4)));
            else
            {
                codes.Add(I386.XchgRA(Reg32.EAX, Addr32.New(Reg32.ESP)));
                codes.Add(I386.Push(Reg32.EAX));
                codes.AddDtorCodes(v.Type);
                codes.Add(I386.Pop(Reg32.EAX));
            }
            codes.AddCodes(op, dest);
        }
Beispiel #2
0
 private Addr32 Calculate(OpModule codes)
 {
     var dest = Var.Get(this.dest);
     if (dest == null)
         throw Abort("{0}: destination is not variable", Tag);
     var ad = dest.GetAddress(codes);
     var ad2 = ad;
     var tb = CheckFunc();
     var schar = "";
     var sint = "";
     if (dest.Type is TypeString)
     {
         if (dest.Type.CheckFunc(Tag + "-char"))
             schar = Tag + "-char";
         if (dest.Type.CheckFunc(Tag + "-int"))
             sint = Tag + "-int";
     }
     var size = dest.Type.Size;
     var cleanup = OpModule.NeedsDtor(dest);
     var indirect = (dest.Reference != null && dest.Reference.Parent != Parent)
         || size < Var.DefaultSize || cleanup;
     if (indirect)
     {
         if (!ad.IsAddress && ad.Register != Reg32.EBP)
             codes.Add(I386.Push(ad.Register));
         dest.Type.AddGetCodes(codes, "push", null, ad);
         ad2 = Addr32.New(Reg32.ESP);
     }
     for (int i = 0; i < values.Count; i++)
     {
         var v = values[i] as NodeBase;
         var tag = Tag;
         if (schar != "" && v.Type is TypeChar)
             tag = schar;
         else if (sint != "" && v.Type is TypeIntBase)
             tag = sint;
         codes.AddOperatorCodes(tb, tag, ad2, v, false);
     }
     if (indirect)
     {
         codes.Add(I386.Pop(Reg32.EAX));
         if (!ad.IsAddress && ad.Register != Reg32.EBP)
             codes.Add(I386.Pop(ad.Register));
         dest.Type.AddSetCodes(codes, ad);
     }
     return ad;
 }
Beispiel #3
0
        public override void AddCodesV(OpModule codes, string op, Addr32 dest)
        {
            if (AddConstCodes(codes, op, dest)) return;

            var ad = Addr32.New(Reg32.ESP);
            var tb = CheckFunc();
            var v = values[0] as NodeBase;
            var schar = "";
            var sint = "";
            if (v.Type is TypeString)
            {
                if (v.Type.CheckFunc(Tag + "-char"))
                    schar = Tag + "-char";
                if (v.Type.CheckFunc(Tag + "-int"))
                    sint = Tag + "-int";
            }
            var tr = v.Type as TypeReference;
            if (tr != null && tr.UseGC && !OpModule.NeedsDtor(v))
            {
                v.AddCodesV(codes, "mov", null);
                codes.Add(I386.Push(Reg32.EAX));
                TypeReference.AddReferenceCodes(codes);
            }
            else
                v.AddCodesV(codes, "push", null);
            for (int i = 1; i < values.Count; i++)
            {
                var vv = values[i] as NodeBase;
                var tag = Tag;
                if (schar != "" && vv.Type is TypeChar)
                    tag = schar;
                else if (sint != "" && vv.Type is TypeIntBase)
                    tag = sint;
                codes.AddOperatorCodes(tb, tag, ad, vv, false);
            }
            if (op != "push")
            {
                codes.Add(I386.Pop(Reg32.EAX));
                codes.AddCodes(op, dest);
            }
        }