Exemplo n.º 1
0
        /// <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();
            }
        }