// File: zgimbutas[P]mwrap/src/mwrap-cgen.cc
// Function: mex_alloc_output(_IO_FILE*, Var*, bool)
void mex_alloc_output(FILE* fp, Var* v, bool return_flag)
{
    if (!v)
        return;
    if (v->iospec == 'o') {
        if (v->devicespec != 'g'){
        if (!return_flag && is_obj(v->tinfo) && is_mxarray_type(v->basetype)) {
            fprintf(fp, "    out%d_ = mxWrapAlloc_%s();\n",
                    v->output_label, v->basetype);
        } else if (is_array(v->tinfo)) {
            fprintf(fp, "    out%d_ = (%s*) mxMalloc(",
                    v->output_label, v->basetype);
            mex_alloc_size(fp, v->qual->args);
            fprintf(fp, "*sizeof(%s));\n", v->basetype);
        } else if (v->tinfo == VT_rarray) {
            fprintf(fp, "    out%d_ = (%s*) NULL;\n",
                    v->output_label, v->basetype);
        } else if (v->tinfo == VT_string) {
            fprintf(fp, "    out%d_ = (char*) mxMalloc(", v->output_label);
            mex_alloc_size(fp, v->qual->args);
            fprintf(fp, "*sizeof(char));\n");
        }
        }
        if (v->devicespec == 'g') {
            // need to allocate
            Expr* e = v->qual->args;
            int ndims = 0;
            if (e && e->next && !e->next->next) {
                ndims = 2;
            } else {
                ndims = 1;
            }
            const char* mtype = complex_tinfo(v) ? "mxCOMPLEX" : "mxREAL";
            const char* mxclassid = basetype_to_mxclassid(v->basetype);
            if (ndims == 2) {
                fprintf(fp, "    gpu_outdims%d_[0] = dim%d_; gpu_outdims%d_[1] = dim%d_;\n", v->output_label, e->input_label, v->output_label, e->next->input_label);
            }
            if (ndims == 1) {
                fprintf(fp, "    gpu_outdims%d_[0] = dim%d_;\n", v->output_label, e->input_label);
            }
            fprintf(fp, "    mxGPUArray_out%d_ = mxGPUCreateGPUArray(%d, gpu_outdims%d_, %s, %s, MX_GPU_DO_NOT_INITIALIZE);\n", v->output_label, ndims, v->output_label, mxclassid, mtype);
            fprintf(fp, "    out%d_ = (%s *)mxGPUGetData(mxGPUArray_out%d_);\n\n", v->output_label, basetype_to_cucomplex(v->basetype), v->output_label);
        }
    }
    mex_alloc_output(fp, v->next, return_flag);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x50, %rsp
movb %dl, %al
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
andb $0x1, %al
movb %al, -0x11(%rbp)
cmpq $0x0, -0x10(%rbp)
jne 0xf933
jmp 0xfbfe
movq -0x10(%rbp), %rax
movsbl 0x8(%rax), %eax
cmpl $0x6f, %eax
jne 0xfbe5
movq -0x10(%rbp), %rax
movsbl 0x9(%rax), %eax
cmpl $0x67, %eax
je 0xfa89
testb $0x1, -0x11(%rbp)
jne 0xf9a6
movq -0x10(%rbp), %rax
movl 0x20(%rax), %edi
callq 0xcc90
testb $0x1, %al
jne 0xf96d
jmp 0xf9a6
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x8290
testb $0x1, %al
jne 0xf980
jmp 0xf9a6
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
leaq 0xcc94(%rip), %rsi      # 0x1c62e
movb $0x0, %al
callq 0x33a0
jmp 0xfa87
movq -0x10(%rbp), %rax
movl 0x20(%rax), %edi
callq 0xcc60
testb $0x1, %al
jne 0xf9b8
jmp 0xfa0a
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
leaq 0xcc7c(%rip), %rsi      # 0x1c64e
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0xf140
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdx
leaq 0xcc6a(%rip), %rsi      # 0x1c66b
movb $0x0, %al
callq 0x33a0
jmp 0xfa85
movq -0x10(%rbp), %rax
cmpl $0x5, 0x20(%rax)
jne 0xfa37
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rcx
leaq 0xcc4c(%rip), %rsi      # 0x1c67a
movb $0x0, %al
callq 0x33a0
jmp 0xfa83
movq -0x10(%rbp), %rax
cmpl $0x9, 0x20(%rax)
jne 0xfa81
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
leaq 0xcc41(%rip), %rsi      # 0x1c694
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rsi
callq 0xf140
movq -0x8(%rbp), %rdi
leaq 0xc5bb(%rip), %rsi      # 0x1c035
movb $0x0, %al
callq 0x33a0
jmp 0xfa83
jmp 0xfa85
jmp 0xfa87
jmp 0xfa89
movq -0x10(%rbp), %rax
movsbl 0x9(%rax), %eax
cmpl $0x67, %eax
jne 0xfbe3
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
movl $0x0, -0x24(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0xfadb
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xfadb
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x10(%rax)
jne 0xfadb
movl $0x2, -0x24(%rbp)
jmp 0xfae2
movl $0x1, -0x24(%rbp)
movq -0x10(%rbp), %rdi
callq 0xce00
movb %al, %dl
leaq 0xcbc9(%rip), %rax      # 0x1c6bd
leaq 0xcbb8(%rip), %rcx      # 0x1c6b3
testb $0x1, %dl
cmovneq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xcaf0
movq %rax, -0x38(%rbp)
cmpl $0x2, -0x24(%rbp)
jne 0xfb4f
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x20(%rbp), %rax
movl (%rax), %ecx
movq -0x10(%rbp), %rax
movl 0x4(%rax), %r8d
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
movl (%rax), %r9d
leaq 0xcb7c(%rip), %rsi      # 0x1c6c4
movb $0x0, %al
callq 0x33a0
cmpl $0x1, -0x24(%rbp)
jne 0xfb74
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movq -0x20(%rbp), %rax
movl (%rax), %ecx
leaq 0xcb94(%rip), %rsi      # 0x1c701
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %edx
movl -0x24(%rbp), %ecx
movq -0x10(%rbp), %rax
movl 0x4(%rax), %r8d
movq -0x38(%rbp), %r9
movq -0x30(%rbp), %rax
leaq 0xcb89(%rip), %rsi      # 0x1c722
movq %rax, (%rsp)
movb $0x0, %al
callq 0x33a0
movq -0x8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movl %eax, -0x3c(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0xca70
movq -0x48(%rbp), %rdi
movl -0x3c(%rbp), %edx
movq %rax, %rcx
movq -0x10(%rbp), %rax
movl 0x4(%rax), %r8d
leaq 0xcbaa(%rip), %rsi      # 0x1c786
movb $0x0, %al
callq 0x33a0
jmp 0xfbe5
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rsi
movb -0x11(%rbp), %al
andb $0x1, %al
movzbl %al, %edx
callq 0xf910
addq $0x50, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)