// File: zgimbutas[P]mwrap/src/mwrap-cgen.cc
// Function: mex_make_stmt(_IO_FILE*, Func*)
void mex_make_stmt(FILE* fp, Func* f)
{
    if (!f)
        return;

    if (f->thisv)
        fprintf(fp,
                "    if (!in0_) {\n"
                "        mw_err_txt_ = \"Cannot dispatch to NULL\";\n"
                "        goto mw_err_label;\n"
                "    }\n");

    if (mw_generate_catch)
        fprintf(fp, "    try {\n    ");

    if (f->ret) {
        Var* v = f->ret;
        if (v->tinfo == VT_obj) {

            if (is_mxarray_type(v->basetype)) {
                fprintf(fp, "    plhs[0] = mxWrapSet_%s(&(", v->basetype);
                mex_make_call(fp, f);
                fprintf(fp ,"));\n");
            } else {
                fprintf(fp, "    out0_ = new %s(", v->basetype);
                mex_make_call(fp, f);
                fprintf(fp ,");\n");
            }

        } else if (is_array(v->tinfo)) {

            fprintf(fp, "    plhs[0] = mxWrapReturn_%s(", v->basetype);
            mex_make_call(fp, f);
            fprintf(fp, ", ");
            Expr* e = v->qual->args;
            if (e && e->next && !e->next->next) {
                fprintf(fp, " dim%d_, dim%d_);\n",
                        e->input_label, e->next->input_label);
            } else {
                mex_alloc_size(fp, v->qual->args);
                fprintf(fp, ", 1);\n");
            }

        } else if (v->tinfo == VT_scalar  || v->tinfo == VT_r_scalar  ||
                   v->tinfo == VT_cscalar || v->tinfo == VT_r_cscalar ||
                   v->tinfo == VT_zscalar || v->tinfo == VT_r_zscalar) {

            fprintf(fp, "    out0_ = ");
            mex_make_call(fp, f);
            fprintf(fp, ";\n");

        } else if (v->tinfo == VT_string) {

            fprintf(fp, "    plhs[0] = mxWrapStrncpy(");
            mex_make_call(fp, f);
            fprintf(fp, ");\n");

        } else if (v->tinfo == VT_mx) {

            fprintf(fp, "    plhs[0] = ");
            mex_make_call(fp, f);
            fprintf(fp, ";\n");

        } else if (v->tinfo == VT_p_obj) {

            if (is_mxarray_type(v->basetype)) {
                fprintf(fp, "    plhs[0] = mxWrapSet_%s(", v->basetype);
                mex_make_call(fp, f);
                fprintf(fp, ");\n");
            } else {
                fprintf(fp, "    out0_ = ");
                mex_make_call(fp, f);
                fprintf(fp, ";\n");
            }

        } else if (v->tinfo == VT_p_scalar ||
                   v->tinfo == VT_p_cscalar ||
                   v->tinfo == VT_p_zscalar) {

            fprintf(fp, "    plhs[0] = mxWrapReturn_%s(", v->basetype);
            mex_make_call(fp, f);
            fprintf(fp, ", 1, 1);\n");

        } else if (v->tinfo == VT_r_obj) {

            if (is_mxarray_type(v->basetype)) {
                fprintf(fp, "    plhs[0] = mxWrapSet_%s(&(", v->basetype);
                mex_make_call(fp, f);
                fprintf(fp, "));\n");
            } else {
                fprintf(fp, "    out0_ = &(");
                mex_make_call(fp, f);
                fprintf(fp, ");\n");
            }

        }
    } else {
        fprintf(fp, "    ");
        mex_make_call(fp, f);
        fprintf(fp, ";\n");
    }

    if (mw_generate_catch)
        fprintf(fp,
                "    } catch(...) {\n"
                "        mw_err_txt_ = \"Caught C++ exception from %s\";\n"
                "    }\n"
                "    if (mw_err_txt_)\n"
                "        goto mw_err_label;\n",
                f->funcv);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x20, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0xff0c
jmp 0x103a1
movq -0x10(%rbp), %rax
cmpq $0x0, 0x30(%rax)
je 0xff29
movq -0x8(%rbp), %rdi
leaq 0xc8ef(%rip), %rsi      # 0x1c811
movb $0x0, %al
callq 0x33a0
leaq 0x153a1(%rip), %rax     # 0x252d1
testb $0x1, (%rax)
je 0xff47
movq -0x8(%rbp), %rdi
leaq 0xc935(%rip), %rsi      # 0x1c875
movb $0x0, %al
callq 0x33a0
movq -0x10(%rbp), %rax
cmpq $0x0, 0x50(%rax)
je 0x1034a
movq -0x10(%rbp), %rax
movq 0x50(%rax), %rax
movq %rax, -0x18(%rbp)
movq -0x18(%rbp), %rax
cmpl $0x1, 0x20(%rax)
jne 0xfffc
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x8290
testb $0x1, %al
jne 0xff83
jmp 0xffbe
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc8ee(%rip), %rsi      # 0x1c884
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xc08c(%rip), %rsi      # 0x1c041
movb $0x0, %al
callq 0x33a0
jmp 0xfff7
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc8d1(%rip), %rsi      # 0x1c8a2
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xd819(%rip), %rsi      # 0x1d809
movb $0x0, %al
callq 0x33a0
jmp 0x10348
movq -0x18(%rbp), %rax
movl 0x20(%rax), %edi
callq 0xcc60
testb $0x1, %al
jne 0x10011
jmp 0x100cb
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc892(%rip), %rsi      # 0x1c8b6
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xca7f(%rip), %rsi      # 0x1cac2
movb $0x0, %al
callq 0x33a0
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x1009f
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0x1009f
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x10(%rax)
jne 0x1009f
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movl (%rax), %edx
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movl (%rax), %ecx
leaq 0xc83f(%rip), %rsi      # 0x1c8d5
movb $0x0, %al
callq 0x33a0
jmp 0x100c6
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0xf140
movq -0x8(%rbp), %rdi
leaq 0xc881(%rip), %rsi      # 0x1c940
movb $0x0, %al
callq 0x33a0
jmp 0x10346
movq -0x18(%rbp), %rax
cmpl $0x6, 0x20(%rax)
je 0x10107
movq -0x18(%rbp), %rax
cmpl $0x10, 0x20(%rax)
je 0x10107
movq -0x18(%rbp), %rax
cmpl $0x7, 0x20(%rax)
je 0x10107
movq -0x18(%rbp), %rax
cmpl $0x11, 0x20(%rax)
je 0x10107
movq -0x18(%rbp), %rax
cmpl $0x8, 0x20(%rax)
je 0x10107
movq -0x18(%rbp), %rax
cmpl $0x12, 0x20(%rax)
jne 0x1013d
movq -0x8(%rbp), %rdi
leaq 0xc7d6(%rip), %rsi      # 0x1c8e8
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0x4e71(%rip), %rsi      # 0x14fa2
movb $0x0, %al
callq 0x33a0
jmp 0x10344
movq -0x18(%rbp), %rax
cmpl $0x9, 0x20(%rax)
jne 0x1017d
movq -0x8(%rbp), %rdi
leaq 0xc7a3(%rip), %rsi      # 0x1c8f5
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xd698(%rip), %rsi      # 0x1d809
movb $0x0, %al
callq 0x33a0
jmp 0x10342
movq -0x18(%rbp), %rax
cmpl $0xa, 0x20(%rax)
jne 0x101bd
movq -0x8(%rbp), %rdi
leaq 0xc780(%rip), %rsi      # 0x1c912
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0x4df1(%rip), %rsi      # 0x14fa2
movb $0x0, %al
callq 0x33a0
jmp 0x10340
movq -0x18(%rbp), %rax
cmpl $0xb, 0x20(%rax)
jne 0x1024f
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x8290
testb $0x1, %al
jne 0x101de
jmp 0x10219
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc730(%rip), %rsi      # 0x1c921
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xd5f9(%rip), %rsi      # 0x1d809
movb $0x0, %al
callq 0x33a0
jmp 0x1024a
movq -0x8(%rbp), %rdi
leaq 0xc6c4(%rip), %rsi      # 0x1c8e8
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0x4d5f(%rip), %rsi      # 0x14fa2
movb $0x0, %al
callq 0x33a0
jmp 0x1033e
movq -0x18(%rbp), %rax
cmpl $0xc, 0x20(%rax)
je 0x1026d
movq -0x18(%rbp), %rax
cmpl $0xd, 0x20(%rax)
je 0x1026d
movq -0x18(%rbp), %rax
cmpl $0xe, 0x20(%rax)
jne 0x102ab
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc636(%rip), %rsi      # 0x1c8b6
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xc69e(%rip), %rsi      # 0x1c93d
movb $0x0, %al
callq 0x33a0
jmp 0x1033c
movq -0x18(%rbp), %rax
cmpl $0xf, 0x20(%rax)
jne 0x1033a
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x8290
testb $0x1, %al
jne 0x102cc
jmp 0x10307
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xc5a5(%rip), %rsi      # 0x1c884
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xbd43(%rip), %rsi      # 0x1c041
movb $0x0, %al
callq 0x33a0
jmp 0x10338
movq -0x8(%rbp), %rdi
leaq 0xc635(%rip), %rsi      # 0x1c947
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0xd4d8(%rip), %rsi      # 0x1d809
movb $0x0, %al
callq 0x33a0
jmp 0x1033a
jmp 0x1033c
jmp 0x1033e
jmp 0x10340
jmp 0x10342
jmp 0x10344
jmp 0x10346
jmp 0x10348
jmp 0x1037b
movq -0x8(%rbp), %rdi
leaq 0xc52a(%rip), %rsi      # 0x1c87f
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xfe20
movq -0x8(%rbp), %rdi
leaq 0x4c2e(%rip), %rsi      # 0x14fa2
movb $0x0, %al
callq 0x33a0
leaq 0x14f4f(%rip), %rax     # 0x252d1
testb $0x1, (%rax)
je 0x103a1
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rdx
leaq 0xc5bc(%rip), %rsi      # 0x1c956
movb $0x0, %al
callq 0x33a0
addq $0x20, %rsp
popq %rbp
retq
nopw (%rax,%rax)