// File: besm6[P]pascal-re/pascompl.cc
// Function: typeCheck::typeCheck(Types*, Types*)
typeCheck::typeCheck(TypesPtr type1, TypesPtr type2)
{
    super.push_back(this);
    rangeMismatch = false;
    if (type1->k == kindRange) {
        typ120z = type1->cast<RangeT>().base;
    } else {
        typ120z = type1;
    }
    if (not checkTypes or (type1 == type2)) {
L1:     ret = true;
    } else {
        kind1 = type1->k;
        kind2 = type2->k;
        if (kind1 == kind2) {
            switch (kind1) {
            case kindReal:
                /* empty */ break;
            case kindScalar: {
                /*(chain)*/
                if (type1->cast<ScalarT>().numen == type2->cast<ScalarT>().numen) {
                    enums1 = type1->cast<ScalarT>().enums;
                    enums2 = type2->cast<ScalarT>().enums;
                    while ((enums1 != NULL) and (enums2 != NULL)) {
                        if (enums1->id != enums2->id)
                            break; // exit chain;
                        enums1 = enums1->list();
                        enums2 = enums2->list();
                    };
                    if ((enums1 == NULL) and (enums2 == NULL))
                        goto L1;
                }
            } break;
            case kindRange: {
                RangeT & r1 = type1->cast<RangeT>();
                RangeT & r2 = type2->cast<RangeT>();
                baseMatch = (r1.base == r2.base);
                typ120z = r1.base;
                rangeMismatch = (r1.left != r2.left) or (r1.right != r2.right);
                ret = baseMatch;
                return;
            } break;
            case kindPtr: {
                if ((type1 == pointerType) or (type2 == pointerType))
                    goto L1;
                basetyp1 = type1->cast<PtrT>().pbase;
                basetyp2 = type2->cast<PtrT>().pbase;
                if (chain != NULL) {
                    link = chain;
                    while (link != NULL) {
                        if (((link->type1 == basetyp1) and
                             (link->type2 == basetyp2)) or
                            ((link->type2 == basetyp1) and
                             (link->type1 == basetyp2)))
                            goto L1;
                        link = link->next;
                    }
                    allocWithTypeCheck();
                } else {
                    setup(type1);
                    allocWithTypeCheck();
                    chain = NULL;
                    rollup(type1);
                    return;
                }
            }; break;
            case kindSet:
                goto L1;
            case kindArray: {
                ArrayT & a1 = type1->cast<ArrayT>();
                ArrayT & a2 = type2->cast<ArrayT>();
                span1 = a1.range->right - a1.range->left;
                span2 = a2.range->right - a2.range->left;
                if (typeCheck(a1.base, a2.base) and
                    (span1 == span2) and
                    (a1.pck == a2.pck) and
                    not rangeMismatch) {
                    if (a1.pck) {
                        if (a1.pcksize == a2.pcksize)
                            goto L1;
                    } else
                        goto L1;
                }
            } break;
            case kindFile: {
                if (typeCheck(type1->cast<FileT>().fbase, type2->cast<FileT>().fbase))
                    goto L1;
            } break;
            case kindRecord: {
                if (checkRecord(type1->cast<RecordT>().fields, type2->cast<RecordT>().fields))
                    goto L1;
            } break;
            case kindCases:
                break; // not checked
            } /* case */
        } else {
            if (kind1 == kindRange) {
                    rangeMismatch = true;
                    typ120z = type2;
                    if (type1->cast<RangeT>().base == type2)
                        goto L1;
                } else if ((kind2 == kindRange) and
                           (type1 == type2->cast<RangeT>().base))
                goto L1;
        }
        ret = false;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq %rax, -0x20(%rbp)
leaq 0xcd7b3(%rip), %rdi     # 0xd8a60
leaq -0x20(%rbp), %rsi
callq 0x1e9e0
movb $0x0, 0x74d7b(%rip)     # 0x80038
movq -0x10(%rbp), %rax
cmpl $0x2, 0x10(%rax)
jne 0xb2dd
movq -0x10(%rbp), %rdi
callq 0x1ea10
movq 0x18(%rax), %rax
movq %rax, 0x74d9d(%rip)     # 0x80078
jmp 0xb2e8
movq -0x10(%rbp), %rax
movq %rax, 0x74d90(%rip)     # 0x80078
testb $0x1, 0x74d43(%rip)     # 0x80032
je 0xb2fb
movq -0x10(%rbp), %rax
cmpq -0x18(%rbp), %rax
jne 0xb30c
jmp 0xb2fd
movq -0xe8(%rbp), %rax
movb $0x1, (%rax)
jmp 0xb90c
movq -0xe8(%rbp), %rcx
movq -0x10(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, 0x4(%rcx)
movq -0x18(%rbp), %rax
movl 0x10(%rax), %eax
movl %eax, 0x8(%rcx)
movl 0x4(%rcx), %eax
cmpl 0x8(%rcx), %eax
jne 0xb88f
movq -0xe8(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0xf0(%rbp)
subq $0x8, %rax
ja 0xb88d
movq -0xf0(%rbp), %rax
leaq 0x26188(%rip), %rcx     # 0x314e4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
jmp 0xb88d
movq -0x10(%rbp), %rdi
callq 0x1ea60
movq 0x20(%rax), %rax
movq %rax, -0xf8(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1ea60
movq %rax, %rcx
movq -0xf8(%rbp), %rax
cmpq 0x20(%rcx), %rax
jne 0xb484
movq -0x10(%rbp), %rdi
callq 0x1ea60
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq 0x18(%rcx), %rcx
movq %rcx, 0x28(%rax)
movq -0x18(%rbp), %rdi
callq 0x1ea60
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq 0x18(%rcx), %rcx
movq %rcx, 0x30(%rax)
movq -0xe8(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, 0x28(%rcx)
movb %al, -0xf9(%rbp)
je 0xb3fc
movq -0xe8(%rbp), %rax
cmpq $0x0, 0x30(%rax)
setne %al
movb %al, -0xf9(%rbp)
movb -0xf9(%rbp), %al
testb $0x1, %al
jne 0xb408
jmp 0xb461
movq -0xe8(%rbp), %rcx
movq 0x28(%rcx), %rax
movq (%rax), %rax
movq 0x30(%rcx), %rcx
cmpq (%rcx), %rax
je 0xb421
jmp 0xb461
movq -0xe8(%rbp), %rax
movq 0x28(%rax), %rdi
callq 0x1e970
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq (%rcx), %rcx
movq %rcx, 0x28(%rax)
movq 0x30(%rax), %rdi
callq 0x1e970
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq (%rcx), %rcx
movq %rcx, 0x30(%rax)
jmp 0xb3d1
movq -0xe8(%rbp), %rax
cmpq $0x0, 0x28(%rax)
jne 0xb482
movq -0xe8(%rbp), %rax
cmpq $0x0, 0x30(%rax)
jne 0xb482
jmp 0xb2fd
jmp 0xb484
jmp 0xb88d
movq -0x10(%rbp), %rdi
callq 0x1ea10
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1ea10
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq %rcx, -0x30(%rbp)
movq -0x28(%rbp), %rcx
movq 0x18(%rcx), %rcx
movq -0x30(%rbp), %rdx
cmpq 0x18(%rdx), %rcx
sete %cl
andb $0x1, %cl
movb %cl, 0x1(%rax)
movq -0x28(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, 0x74ba3(%rip)     # 0x80078
movq -0x28(%rbp), %rax
movq 0x28(%rax), %rcx
movq -0x30(%rbp), %rdx
movb $0x1, %al
cmpq 0x28(%rdx), %rcx
movb %al, -0xfa(%rbp)
jne 0xb508
movq -0x28(%rbp), %rax
movq 0x30(%rax), %rax
movq -0x30(%rbp), %rcx
cmpq 0x30(%rcx), %rax
setne %al
movb %al, -0xfa(%rbp)
movq -0xe8(%rbp), %rax
movb -0xfa(%rbp), %cl
andb $0x1, %cl
movb %cl, 0x74b1a(%rip)      # 0x80038
movb 0x1(%rax), %cl
andb $0x1, %cl
movb %cl, (%rax)
jmp 0xb90c
movq -0x10(%rbp), %rax
cmpq 0x74b52(%rip), %rax     # 0x80088
je 0xb545
movq -0x18(%rbp), %rax
cmpq 0x74b45(%rip), %rax     # 0x80088
jne 0xb54a
jmp 0xb2fd
movq -0x10(%rbp), %rdi
callq 0x1eab0
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq 0x18(%rcx), %rcx
movq %rcx, 0x18(%rax)
movq -0x18(%rbp), %rdi
callq 0x1eab0
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq 0x18(%rcx), %rcx
movq %rcx, 0x20(%rax)
cmpq $0x0, 0x74b58(%rip)     # 0x800e0
je 0xb629
movq -0xe8(%rbp), %rax
movq 0x74b44(%rip), %rcx     # 0x800e0
movq %rcx, 0x10(%rax)
movq -0xe8(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xb61b
movq -0xe8(%rbp), %rcx
movq 0x10(%rcx), %rax
movq 0x8(%rax), %rax
cmpq 0x18(%rcx), %rax
jne 0xb5d8
movq -0xe8(%rbp), %rcx
movq 0x10(%rcx), %rax
movq 0x10(%rax), %rax
cmpq 0x20(%rcx), %rax
je 0xb602
movq -0xe8(%rbp), %rcx
movq 0x10(%rcx), %rax
movq 0x10(%rax), %rax
cmpq 0x18(%rcx), %rax
jne 0xb607
movq -0xe8(%rbp), %rcx
movq 0x10(%rcx), %rax
movq 0x8(%rax), %rax
cmpq 0x20(%rcx), %rax
jne 0xb607
jmp 0xb2fd
movq -0xe8(%rbp), %rax
movq 0x10(%rax), %rcx
movq (%rcx), %rcx
movq %rcx, 0x10(%rax)
jmp 0xb5a0
movq -0xe8(%rbp), %rdi
callq 0x1eb00
jmp 0xb657
leaq -0x10(%rbp), %rdi
callq 0x1ebb0
movq -0xe8(%rbp), %rdi
callq 0x1eb00
movq $0x0, 0x74a97(%rip) # 0x800e0
movq -0x10(%rbp), %rdi
callq 0x4d30
jmp 0xb90c
jmp 0xb88d
jmp 0xb2fd
movq -0x10(%rbp), %rdi
callq 0x1e210
movq %rax, -0x38(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1e210
movq %rax, %rcx
movq -0xe8(%rbp), %rax
movq %rcx, -0x40(%rbp)
movq -0x38(%rbp), %rcx
movq 0x20(%rcx), %rcx
movq 0x28(%rcx), %rdx
movq 0x30(%rcx), %rcx
subq %rdx, %rcx
movq %rcx, 0x38(%rax)
movq -0x40(%rbp), %rcx
movq 0x20(%rcx), %rcx
movq 0x28(%rcx), %rdx
movq 0x30(%rcx), %rcx
subq %rdx, %rcx
movq %rcx, 0x40(%rax)
movq -0x38(%rbp), %rax
movq 0x18(%rax), %rsi
movq -0x40(%rbp), %rax
movq 0x18(%rax), %rdx
leaq -0x88(%rbp), %rdi
movq %rdi, -0x108(%rbp)
callq 0xb280
movq -0x108(%rbp), %rdi
callq 0x1e950
movb %al, -0xfb(%rbp)
jmp 0xb6ea
movb -0xfb(%rbp), %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x109(%rbp)
jne 0xb6ff
jmp 0xb74a
movq -0xe8(%rbp), %rdx
movq 0x38(%rdx), %rcx
xorl %eax, %eax
cmpq 0x40(%rdx), %rcx
movb %al, -0x109(%rbp)
jne 0xb74a
movq -0x38(%rbp), %rax
movb 0x28(%rax), %al
andb $0x1, %al
movzbl %al, %ecx
movq -0x40(%rbp), %rax
movb 0x28(%rax), %al
andb $0x1, %al
movzbl %al, %edx
xorl %eax, %eax
cmpl %edx, %ecx
movb %al, -0x109(%rbp)
jne 0xb74a
movb 0x748f6(%rip), %al      # 0x80038
xorb $-0x1, %al
movb %al, -0x109(%rbp)
movb -0x109(%rbp), %al
movb %al, -0x10a(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x1e9c0
movb -0x10a(%rbp), %al
testb $0x1, %al
jne 0xb76e
jmp 0xb7bb
movq -0x38(%rbp), %rax
testb $0x1, 0x28(%rax)
je 0xb7b4
movq -0x38(%rbp), %rax
movq 0x38(%rax), %rax
movq -0x40(%rbp), %rcx
cmpq 0x38(%rcx), %rax
jne 0xb7b2
jmp 0xb2fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x1e9c0
jmp 0xb915
jmp 0xb7b9
jmp 0xb2fd
jmp 0xb7bb
jmp 0xb88d
movq -0x10(%rbp), %rdi
callq 0x1ebe0
movq 0x18(%rax), %rax
movq %rax, -0x120(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1ebe0
movq -0x120(%rbp), %rsi
movq 0x18(%rax), %rdx
leaq -0xe0(%rbp), %rdi
movq %rdi, -0x118(%rbp)
callq 0xb280
movq -0x118(%rbp), %rdi
callq 0x1e950
movb %al, -0x10b(%rbp)
jmp 0xb80f
leaq -0xe0(%rbp), %rdi
callq 0x1e9c0
movb -0x10b(%rbp), %al
testb $0x1, %al
jne 0xb827
jmp 0xb84f
jmp 0xb2fd
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x90(%rbp)
movl %eax, -0x94(%rbp)
leaq -0xe0(%rbp), %rdi
callq 0x1e9c0
jmp 0xb915
jmp 0xb88d
movq -0x10(%rbp), %rdi
callq 0x1e840
movq 0x20(%rax), %rax
movq %rax, -0x128(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1e840
movq -0x128(%rbp), %rdi
movq 0x20(%rax), %rsi
callq 0xb150
testb $0x1, %al
jne 0xb884
jmp 0xb889
jmp 0xb2fd
jmp 0xb88d
jmp 0xb88d
jmp 0xb902
movq -0xe8(%rbp), %rax
cmpl $0x2, 0x4(%rax)
jne 0xb8c8
movb $0x1, 0x74795(%rip)     # 0x80038
movq -0x18(%rbp), %rax
movq %rax, 0x747ca(%rip)     # 0x80078
movq -0x10(%rbp), %rdi
callq 0x1ea10
movq 0x18(%rax), %rax
cmpq -0x18(%rbp), %rax
jne 0xb8c6
jmp 0xb2fd
jmp 0xb900
movq -0xe8(%rbp), %rax
cmpl $0x2, 0x8(%rax)
jne 0xb8fe
movq -0x10(%rbp), %rax
movq %rax, -0x130(%rbp)
movq -0x18(%rbp), %rdi
callq 0x1ea10
movq %rax, %rcx
movq -0x130(%rbp), %rax
cmpq 0x18(%rcx), %rax
jne 0xb8fe
jmp 0xb2fd
jmp 0xb900
jmp 0xb902
movq -0xe8(%rbp), %rax
movb $0x0, (%rax)
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
movq -0x90(%rbp), %rdi
callq 0x44c0
nopw %cs:(%rax,%rax)