// File: zgimbutas[P]mwrap/src/mwrap-typecheck.cc
// Function: assign_scalar_tinfo(Var*, int, int, int, int, int, int)
int assign_scalar_tinfo(Var* v, int line,
                        int tags, int tagp, int tagr, int taga,
                        int tagar)
{
    // Numeric types
    if (!v->qual) {
        v->tinfo = tags;
    } else if (v->qual->qual == '*') {
        v->tinfo = tagp;
    } else if (v->qual->qual == '&') {
        v->tinfo = tagr;
    } else if (v->qual->qual == 'a') {
        v->tinfo = taga;
        if (v->qual->args && 
            v->qual->args->next && 
            v->qual->args->next->next) {
            fprintf(stderr, "Error (%d): ", line);
            fprintf(stderr, "Array %s should be 1D or 2D\n", v->name);
            return 1;
        }
    } else if (v->qual->qual == 'r') {
        v->tinfo = tagar;
        if (tagar == VT_unk) {
            fprintf(stderr, "Error (%d): ", line);
            fprintf(stderr, "Array ref %s must be to a real array\n", 
                    v->name);
            return 1;
        }
        if (v->qual->args && 
            v->qual->args->next && 
            v->qual->args->next->next) {
            fprintf(stderr, "Error (%d): ", line);
            fprintf(stderr, "Array %s should be 1D or 2D\n", v->name);
            return 1;
        }
    } else {
        assert(0);
    }

    return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movl 0x10(%rbp), %eax
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl %edx, -0x18(%rbp)
movl %ecx, -0x1c(%rbp)
movl %r8d, -0x20(%rbp)
movl %r9d, -0x24(%rbp)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x18(%rax)
jne 0xbaaa
movl -0x18(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x20(%rax)
jmp 0xbc9c
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movsbl (%rax), %eax
cmpl $0x2a, %eax
jne 0xbac9
movl -0x1c(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x20(%rax)
jmp 0xbc9a
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movsbl (%rax), %eax
cmpl $0x26, %eax
jne 0xbae8
movl -0x20(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x20(%rax)
jmp 0xbc98
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movsbl (%rax), %eax
cmpl $0x61, %eax
jne 0xbb8b
movl -0x24(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x20(%rax)
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x8(%rax)
je 0xbb86
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0xbb86
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0xbb86
movq 0x19492(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movl -0x14(%rbp), %edx
leaq 0x9070(%rip), %rsi      # 0x14bc3
movb $0x0, %al
callq 0x33a0
movq 0x19477(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
leaq 0x9129(%rip), %rsi      # 0x14c9c
movb $0x0, %al
callq 0x33a0
movl $0x1, -0x4(%rbp)
jmp 0xbca3
jmp 0xbc96
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movsbl (%rax), %eax
cmpl $0x72, %eax
jne 0xbc75
movl 0x10(%rbp), %ecx
movq -0x10(%rbp), %rax
movl %ecx, 0x20(%rax)
cmpl $0x0, 0x10(%rbp)
jne 0xbbf6
movq 0x19422(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movl -0x14(%rbp), %edx
leaq 0x9000(%rip), %rsi      # 0x14bc3
movb $0x0, %al
callq 0x33a0
movq 0x19407(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
leaq 0x90d6(%rip), %rsi      # 0x14cb9
movb $0x0, %al
callq 0x33a0
movl $0x1, -0x4(%rbp)
jmp 0xbca3
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x8(%rax)
je 0xbc73
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0xbc73
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
movq 0x10(%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0xbc73
movq 0x193a2(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movl -0x14(%rbp), %edx
leaq 0x8f80(%rip), %rsi      # 0x14bc3
movb $0x0, %al
callq 0x33a0
movq 0x19387(%rip), %rax     # 0x24fd8
movq (%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x28(%rax), %rdx
leaq 0x9039(%rip), %rsi      # 0x14c9c
movb $0x0, %al
callq 0x33a0
movl $0x1, -0x4(%rbp)
jmp 0xbca3
jmp 0xbc94
leaq 0x9311(%rip), %rdi      # 0x14f8d
leaq 0x905c(%rip), %rsi      # 0x14cdf
movl $0xb3, %edx
leaq 0x9063(%rip), %rcx      # 0x14cf2
callq 0x3160
jmp 0xbc96
jmp 0xbc98
jmp 0xbc9a
jmp 0xbc9c
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)