/// <summary> /// Push the result into the stack. /// </summary> /// <param name="type"></param> /// <param name="ret"></param> public void Push(Expr expr) { var ret = expr.ToX86Expr(this); switch (expr.Type.Kind) { case TKind.CHAR: case TKind.SCHAR: case TKind.UCHAR: if (ret == Ret.PTR) { Inst(mov, al, eax.Addr(Size.BYTE)); } Inst(push, eax); break; case TKind.PTR: case TKind.ENUM: case TKind.ULONG: case TKind.LONG: case TKind.UINT: case TKind.INT: Inst(push, ret == Ret.PTR ? eax.Addr() as Operand : eax); break; case TKind.DOUBLE: Inst(sub, esp, 8); if (ret == Ret.PTR) { Inst(movsd, xmm0, eax.Addr(Size.DWORD)); } Inst(movsd, esp.Addr(Size.QWORD), xmm0); break; default: throw new NotImplementedException(); } }