// 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); }
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)); }
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))); }
public static void AddReferenceCodes(OpModule codes) { codes.Add(I386.Push(Reg32.EAX)); codes.Add(codes.GetCall("var", Reference)); codes.Add(I386.Pop(Reg32.EAX)); }
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); }
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; } }