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