// File: /workspace/github_cpp_makefile_star2_O3/besm6[P]pascal-re/pascompl.cc
// Function: formOperator::formOperator(OpGen)
formOperator::formOperator(OpGen op)
{ /* formOperator */
    super.push_back(this);
    l3bool13z = true;
    if ((errors and (op != SETREG)) or curExpr == NULL)
        return;
    if (op != LOOPCOND &&
        op != STRUCTASSN &&
        op != MKINT &&
        op != FILEINIT &&
        op!=PCKUNPCK)
        (void) genFullExpr(curExpr);
    switch (op) {
    case APPLYEXPR:
        genOneOp();
        break;
    case SETREG: {
        l3int3z = insnCount();
        l3var5z = new Expr;
        l3var5z->expr1 = expr63z;
        expr63z = l3var5z;
        l3var5z->op = NOOP;
        switch (insnList->st) {
        case st0: {
            if (l3int3z == 0)  {
                l3int2z = 14;
            } else {
                l3var10z.m = set148z * set147z;
                if (l3var10z.m != Bits()) {
                    l3int2z = minel(l3var10z.m);
                } else {
                    l3int2z = 14;
                }
                if (l3int3z != 1) {
                    (void) setAddrTo(l3int2z);
                    addToInsnList(KITA + l3int2z);
                    P5117(op37);
                } else if (l3int2z != 14) {
                    (void) setAddrTo(l3int2z);
                    genOneOp();
                }
                l3var11z.m = Bits(l3int2z) - Bits(14);
                regsUsed = regsUsed - l3var11z.m;
                set147z = set147z - l3var11z.m;
                set146z = set146z + l3var11z.m;
            }
            curVal.i = l3int2z;
            l3var5z->val = curVal;
        } break;
        case st1: {
            curVal.i = 14;
            l3var5z->val = curVal;
        } break;
        case st2:
            error(errVarTooComplex);
            break;
        } /* case */
        l3var5z->expr2 = curExpr;
    } break; /* SETREG */
    case gen0: {
        prepLoad();
        if (insnCount() > 1)
            P5117(op36);
    } break;
    case STORE: {
        prepStore();
        genOneOp();
    } break;
    case LOOPCOND: {
        curInsnTemplate = curVal.i;
        (void) formOperator(LOAD);
        curInsnTemplate = InsnTemp[XTA];
    } break;
    case ADDRTOR9: {
        if (insnList->st != st0)
            error(errVarTooComplex);
        setAddrTo(9);
        genOneOp();
    } break;
    case STRUCTASSN: {
        l3int1z = curVal.i;
        (void) genFullExpr(curExpr);
        prepLoad();
        if (insnList->regsused.has(9))
            error(errVarTooComplex);
        genOneOp();
        form1Insn(KATX+I9 + l3int1z);
    } break;
    case ADDRTOR12: {
        (void) setAddrTo(12);
        genOneOp();
    } break;
    case MKINT: {
        curVal.i = curVal.ii;
        form1Insn(KXTA+I8 + getFCSToffset());
    } break;
    case MKPUSH: {
        prepLoad();
        addxToInsnList(macro + mcPUSH);
        genOneOp();
    } break;
    case gen11: case gen12: {
        setAddrTo(11);
        if (op == gen12)
            addxToInsnList(macro + mcPUSH);
        genOneOp();
        regsUsed = regsUsed + Bits(12);
    } break;
    case FILEACCESS: {
        setAddrTo(12);
        genOneOp();
        formAndAlign(jumpTarget);
    } break;
    case FILEINIT:
        formFileInit();
        break;
    case LOAD: {
        prepLoad();
        genOneOp();
    } break;
    case CONDJUMP:
        l3bool9z = jumpTarget == 0;
        l3int3z = jumpTarget;
        if (insnList->ilm == ilCONST) {
            if (insnList->ilf5.ii) {
                jumpTarget = 0;
            } else {
                if (l3bool9z) {
                    formJump(jumpTarget);
                } else {
                    form1Insn(InsnTemp[UJ] + jumpTarget);
                }
            }
        } else {
            l3var8z.ii = (insnList->regsused.has(16));
            if ((insnList->ilm == il3) and
                (insnList->ilf5.i != 0)) {
                genOneOp();
                if (l3var8z.ii) {
                    if (l3bool9z)
                        formJump(l3int3z);
                    else
                        form1Insn(InsnTemp[UJ] + l3int3z);
                    P0715(0, jumpTarget);
                    jumpTarget = l3int3z;
                } else {
                    if (not l3bool9z) {
                        if (not putLeft)
                            padToLeft();
                        P0715(l3int3z, jumpTarget);
                    }
                }
            } else {
                if (insnList->ilm == il1) {
                    bool49z = false;
                    prepLoad();
                    bool49z = true;
                }
                genOneOp();
                if (l3var8z.ii)
                    nextInsn = InsnTemp[U1A];
                else
                    nextInsn = InsnTemp[UZA];
                if (l3bool9z) {
                    jumpType = nextInsn;
                    formJump(l3int3z);
                    jumpType = InsnTemp[UJ];
                    jumpTarget = l3int3z;
                } else {
                    form1Insn(nextInsn + l3int3z);
                }
            }
        }
        break; /* CONDJUMP */
    case PCKUNPCK: {
        l3var5z = curExpr;
        curExpr = curExpr->expr1;
        (void) formOperator(gen11);
        genFullExpr(l3var5z->expr2);
        if (insnList->regsused.has(11))
            error(44); /* errIncorrectUsageOfStandProcOrFunc */
        setAddrTo(12);
        genOneOp();
        arg1Type = l3var5z->expr2->typ;
        ArrayT & array = arg1Type->cast<ArrayT>();
        l3int3z = array.range->right - array.range->left + 1;
        form2Insn((KVTM+I14) + l3int3z,
                  (KVTM+I10+64) - array.pcksize);
        l3int3z = ord(l3var5z->typ);
        l3int1z = array.perWord;
        if (l3int3z == 72)          /* P/KC */
            l3int1z = 1 - l3int1z;
        form1Insn(getValueOrAllocSymtab(l3int1z) + (KVTM+I9));
        if (typeCheck(curExpr->typ, IntegerType)) {
            l3int1z = KXTA+ZERO;
        } else {
            l3int1z = InsnTemp[XTA];
        };
        form1Insn(l3int1z);
        formAndAlign(getHelperProc(l3int3z));
   } break;
   case LITINSN:
        if (insnList->ilm != ilCONST)
            error(errNoConstant);
        if (insnList->typ->size != 1)
            error(errConstOfOtherTypeNeeded);
        curVal = insnList->ilf5;
        break;
    } /* case */
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
subq $0x5a38, %rsp           # imm = 0x5A38
movl %esi, %ebp
movq %rdi, %rbx
movq %rsp, %rsi
movq %rdi, (%rsi)
leaq 0xb1091(%rip), %rdi     # 0xbd3b8
callq 0x1b59e
movb $0x1, 0x60(%rbx)
cmpl $0x4, %ebp
setne %al
andb 0x5863a(%rip), %al      # 0x64976
movq 0x5875d(%rip), %rsi     # 0x64aa0
testq %rsi, %rsi
sete %cl
orb %al, %cl
jne 0xc926
cmpl $0x10, %ebp
ja 0xc3cb
movl $0x14248, %eax          # imm = 0x14248
btl %ebp, %eax
jae 0xc3cb
cmpl $0x11, %ebp
ja 0xc926
movl %ebp, %eax
leaq 0x10396(%rip), %rcx     # 0x1c708
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0xf0(%rsp), %rdi
movl $0xb, %esi
callq 0x16dba
cmpl $0xc, %ebp
jne 0xc39c
movl $0x1000005, %edi        # imm = 0x1000005
callq 0x8954
leaq 0x24b8(%rsp), %rdi
callq 0x15d64
movabsq $0xfff7ffffffff, %rax   # imm = 0xFFF7FFFFFFFF
andq 0x58696(%rip), %rax     # 0x64a50
btsq $0x23, %rax
movq %rax, 0x5868a(%rip)     # 0x64a50
jmp 0xc926
leaq 0x240(%rsp), %rdi
callq 0xac8c
addq $-0x8, 0xb0ff8(%rip)    # 0xbd3d8
jmp 0xc360
movq 0x586b4(%rip), %rax     # 0x64aa0
movq %rax, 0x20(%rbx)
movq 0x10(%rax), %rax
movq %rax, 0x586a5(%rip)     # 0x64aa0
leaq 0x278(%rsp), %rdi
movl $0xb, %esi
callq 0xc308
addq $-0x8, 0xb0fab(%rip)    # 0xbd3c0
movq 0x20(%rbx), %rax
movq 0x18(%rax), %rsi
leaq 0x80(%rsp), %rdi
callq 0xac8c
addq $-0x8, 0xb0fa6(%rip)    # 0xbd3d8
movq 0x5866f(%rip), %rax     # 0x64aa8
testb $0x10, 0x1c(%rax)
je 0xc449
movl $0x2c, %edi
callq 0x58ff
leaq 0x48(%rsp), %rdi
movl $0xc, %esi
callq 0x16dba
leaq 0x348(%rsp), %rdi
callq 0x15d64
movq 0x20(%rbx), %rax
movq 0x18(%rax), %rax
movq (%rax), %r15
movq %r15, 0x58591(%rip)     # 0x64a08
cmpl $0x5, 0x10(%r15)
jne 0xcb41
movq 0x20(%r15), %rax
movq 0x30(%rax), %rdi
subq 0x28(%rax), %rdi
leaq 0x1(%rdi), %rax
movq %rax, 0x10(%rbx)
addq $0xea0001, %rdi         # imm = 0xEA0001
movl $0xaa0040, %r14d        # imm = 0xAA0040
subq 0x38(%r15), %r14
callq 0x59a2
movq %r14, %rdi
callq 0x59a2
movq 0x20(%rbx), %rax
movq (%rax), %rdi
callq 0x3e11
movq %rax, 0x10(%rbx)
movq 0x30(%r15), %rcx
movl $0x1, %edi
subq %rcx, %rdi
cmpq $0x48, %rax
cmovneq %rcx, %rdi
movq %rdi, (%rbx)
callq 0x617e
leaq 0x9a0000(%rax), %rdi
callq 0x59a2
movq 0x585ad(%rip), %rax     # 0x64aa0
movq (%rax), %rsi
movq 0x584eb(%rip), %rdx     # 0x649e8
movq %rsp, %r14
movq %r14, %rdi
callq 0x84c6
addq $-0x8, 0xb0e98(%rip)    # 0xbd3a8
cmpb $0x0, (%r14)
movl $0x108009, %edi         # imm = 0x108009
jne 0xc522
movq 0x5ce8e(%rip), %rdi     # 0x693b0
movq %rdi, (%rbx)
callq 0x59a2
movq 0x10(%rbx), %rbx
leaq 0x5e49b(%rip), %r14     # 0x6a9d0
movq (%r14,%rbx,8), %rdi
testq %rdi, %rdi
jne 0xc561
leaq 0x17e3b(%rip), %rax     # 0x24380
movq (%rax,%rbx,8), %rax
movq %rax, 0x584e0(%rip)     # 0x64a30
movl $0x8c0000, %edi         # imm = 0x8C0000
callq 0x5c15
movq %rax, %rdi
movq %rax, (%r14,%rbx,8)
addq $0xdc8000, %rdi         # imm = 0xDC8000
jmp 0xc8e7
callq 0xc052
jmp 0xc926
movq 0x5852a(%rip), %rax     # 0x64aa8
addq $0x8, %rax
movq $-0x1, %rcx
movq (%rax), %rax
incq %rcx
testq %rax, %rax
jne 0xc589
movq %rcx, 0x10(%rbx)
movl $0x20, %edi
callq 0x3d77
movq %rax, 0x20(%rbx)
movq 0x582ab(%rip), %rcx     # 0x64858
movq %rcx, 0x10(%rax)
movq 0x20(%rbx), %rax
movq %rax, 0x5829c(%rip)     # 0x64858
movl $0x2e, 0x8(%rax)
movq 0x584de(%rip), %rcx     # 0x64aa8
movl 0x40(%rcx), %ecx
cmpl $0x2, %ecx
je 0xc973
cmpl $0x1, %ecx
je 0xc94c
testl %ecx, %ecx
jne 0xcac5
movq 0x10(%rbx), %rax
testq %rax, %rax
je 0xca00
movabsq $-0x1000000000000, %rcx # imm = 0xFFFF000000000000
orq 0x58463(%rip), %rcx     # 0x64a68
andq 0x58454(%rip), %rcx     # 0x64a60
movabsq $0xffffffffffff, %r14   # imm = 0xFFFFFFFFFFFF
movq %rcx, 0x48(%rbx)
movq %rcx, %rdx
shlq $0x10, %rdx
je 0xca12
movabsq $0x7fffffffffff, %rdx   # imm = 0x7FFFFFFFFFFF
movq %rcx, %rsi
andq %rdx, %rsi
incq %rdx
bsrq %rsi, %rdi
notq %rdi
addq $0x30, %rdi
xorl %esi, %esi
testq %rdx, %rcx
cmoveq %rdi, %rsi
movq %rsi, 0x8(%rbx)
cmpq $0x1, %rax
jne 0xca3c
cmpq $0xe, %rsi
je 0xca64
leaq 0x1d0(%rsp), %rdi
callq 0x16dba
leaq 0x4cd8(%rsp), %rdi
callq 0x15d64
jmp 0xca64
movq 0x583a4(%rip), %rsi     # 0x64a30
leaq 0x5839d(%rip), %rdi     # 0x64a30
callq 0x3c48
callq 0x5ff3
leaq 0x808000(%rax), %rdi
jmp 0xc8ba
callq 0x899b
leaq 0x1758(%rsp), %rdi
jmp 0xc921
movq 0x58146(%rip), %rdi     # 0x64808
testq %rdi, %rdi
sete 0x40(%rbx)
movq %rdi, 0x10(%rbx)
movq 0x583d4(%rip), %rax     # 0x64aa8
cmpl $0x0, 0x20(%rax)
je 0xc934
leaq 0x10(%rbx), %r14
movl 0x18(%rax), %ecx
shrl $0x1f, %ecx
movq %rcx, 0x38(%rbx)
movl 0x20(%rax), %ecx
cmpl $0x1, %ecx
je 0xc982
cmpl $0x3, %ecx
jne 0xc995
movq 0x28(%rax), %rax
shlq $0x17, %rax
je 0xc995
leaq 0x10a8(%rsp), %rdi
callq 0x15d64
cmpq $0x0, 0x38(%rbx)
movb 0x40(%rbx), %al
je 0xcad9
testb %al, %al
je 0xcb15
movq %r14, %rdi
callq 0x5b33
jmp 0xcb24
movq 0x582ea(%rip), %rax     # 0x64a30
shlq $0x17, %rax
sarq $0x17, %rax
movq %rax, 0x5810b(%rip)     # 0x64860
leaq 0x2e0(%rsp), %rdi
movl $0x2, %esi
callq 0xc308
addq $-0x8, 0xb0c51(%rip)    # 0xbd3c0
movq 0x5cc3a(%rip), %rax     # 0x693b0
movq %rax, 0x580e3(%rip)     # 0x64860
jmp 0xc926
leaq 0x5388(%rsp), %rdi
jmp 0xc921
callq 0x899b
movq 0x5830d(%rip), %rax     # 0x64aa8
addq $0x8, %rax
movq $-0x1, %rcx
movq (%rax), %rax
incq %rcx
testq %rax, %rax
jne 0xc7a6
cmpq $0x2, %rcx
jb 0xc926
movl $0x1e, %edi
callq 0x91fa
jmp 0xc926
callq 0x8e91
leaq 0x4628(%rsp), %rdi
jmp 0xc921
movq 0x582c5(%rip), %rax     # 0x64aa8
cmpl $0x0, 0x20(%rax)
je 0xc7fa
movl $0x6, %edi
callq 0x58ff
movq 0x582ae(%rip), %rax     # 0x64aa8
movq 0x10(%rax), %rcx
cmpq $0x1, (%rcx)
je 0xc815
movl $0x7, %edi
callq 0x58ff
movq 0x58293(%rip), %rax     # 0x64aa8
movq 0x28(%rax), %rax
movq %rax, 0x58210(%rip)     # 0x64a30
jmp 0xc926
movq 0x5827c(%rip), %rax     # 0x64aa8
cmpl $0x0, 0x40(%rax)
je 0xc83c
movl $0x30, %edi
callq 0x58ff
leaq 0x198(%rsp), %rdi
movl $0x9, %esi
callq 0x16dba
leaq 0x3f78(%rsp), %rdi
jmp 0xc921
movq 0x581ce(%rip), %rax     # 0x64a30
shlq $0x17, %rax
sarq $0x17, %rax
movq %rax, (%rbx)
movq 0x5822c(%rip), %rsi     # 0x64aa0
leaq 0x160(%rsp), %rdi
callq 0xac8c
addq $-0x8, 0xb0b4f(%rip)    # 0xbd3d8
callq 0x899b
movq 0x58213(%rip), %rax     # 0x64aa8
testb $0x40, 0x1c(%rax)
je 0xc8a5
movl $0x30, %edi
callq 0x58ff
leaq 0x38c8(%rsp), %rdi
callq 0x15d64
movl $0x900000, %edi         # imm = 0x900000
addq (%rbx), %rdi
callq 0x59a2
jmp 0xc926
leaq 0xb8(%rsp), %rdi
movl $0xc, %esi
callq 0x16dba
leaq 0x1e08(%rsp), %rdi
callq 0x15d64
movq 0x57f21(%rip), %rdi     # 0x64808
callq 0x5bb2
jmp 0xc926
callq 0x899b
movl $0x1000005, %edi        # imm = 0x1000005
callq 0x8954
leaq 0x2b68(%rsp), %rdi
jmp 0xc921
leaq 0x128(%rsp), %rdi
movl $0xc, %esi
callq 0x16dba
leaq 0x3218(%rsp), %rdi
callq 0x15d64
addq $0x5a38, %rsp           # imm = 0x5A38
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
cmpq $0x0, 0x28(%rax)
je 0xc9ef
movq $0x0, 0x57ebe(%rip) # 0x64808
jmp 0xc926
movzwl 0x580e3(%rip), %ecx     # 0x64a36
shlq $0x30, %rcx
movabsq $0xd0000000000e, %rdx   # imm = 0xD0000000000E
orq %rcx, %rdx
movq %rdx, 0x580c5(%rip)     # 0x64a30
movq %rdx, (%rax)
jmp 0xcac5
movl $0x30, %edi
callq 0x58ff
jmp 0xcac5
movb $0x0, 0x57e71(%rip)     # 0x647fa
callq 0x899b
movb $0x1, 0x57e65(%rip)     # 0x647fa
leaq 0x9f8(%rsp), %rdi
callq 0x15d64
xorl %eax, %eax
cmpq $0x0, 0x38(%rbx)
setne %al
leaq 0x5c9bd(%rip), %rcx     # 0x69370
movq 0x158(%rcx,%rax,8), %rdi
movq %rdi, 0x18(%rbx)
cmpb $0x1, 0x40(%rbx)
jne 0xc9e7
movq %rdi, 0x57e34(%rip)     # 0x64800
movq %r14, %rdi
callq 0x5b33
movq 0x5cafd(%rip), %rax     # 0x694d8
movq %rax, 0x57e1e(%rip)     # 0x64800
jmp 0xcb32
addq (%r14), %rdi
jmp 0xc8ba
testq %rdi, %rdi
je 0xca2b
addq 0x5cadd(%rip), %rdi     # 0x694d8
jmp 0xc8ba
movq $0xe, 0x8(%rbx)
movl $0xe, %esi
jmp 0xcaab
movq $0xe, 0x8(%rbx)
cmpq $0x1, %rax
je 0xca64
leaq 0x8(%rbx), %r15
movl $0xe, %esi
jmp 0xca40
leaq 0x57dd6(%rip), %rdi     # 0x64808
callq 0x5b33
jmp 0xc926
leaq 0x8(%rbx), %r15
leaq 0x208(%rsp), %rdi
callq 0x16dba
movl $0x22000, %edi          # imm = 0x22000
addq (%r15), %rdi
callq 0x88f7
movl $0x1f, %edi
callq 0x91fa
movq 0x8(%rbx), %rsi
movb $0x2f, %cl
subb %sil, %cl
movl $0x1, %eax
shlq %cl, %rax
movabsq $0xfffdffffffff, %rcx   # imm = 0xFFFDFFFFFFFF
andq %rax, %rcx
movq %rcx, 0x50(%rbx)
movq %rcx, %rax
xorq %r14, %rax
andq %rax, 0x57fbd(%rip)     # 0x64a50
andq %rax, 0x57fc6(%rip)     # 0x64a60
andq 0x57fb7(%rip), %r14     # 0x64a58
orq %rcx, %r14
movq %r14, 0x57fad(%rip)     # 0x64a58
leaq 0x57f7e(%rip), %rdi     # 0x64a30
callq 0x3c48
movq 0x20(%rbx), %rax
movq 0x57f6e(%rip), %rcx     # 0x64a30
movq %rcx, (%rax)
movq 0x57fd4(%rip), %rax     # 0x64aa0
movq 0x20(%rbx), %rcx
movq %rax, 0x18(%rcx)
jmp 0xc926
testb %al, %al
jne 0xc926
cmpb $0x0, 0x57e8c(%rip)     # 0x64974
jne 0xcb01
movq 0x5c9b7(%rip), %rdi     # 0x694a8
callq 0x59a2
movq $0x0, 0x57e57(%rip) # 0x64958
movq (%r14), %rdi
movq 0x57cfd(%rip), %rsi     # 0x64808
callq 0x61d5
jmp 0xc926
movq (%r14), %rdi
addq 0x5c9b9(%rip), %rdi     # 0x694d8
callq 0x59a2
movq 0x57cdd(%rip), %rsi     # 0x64808
xorl %edi, %edi
callq 0x61d5
movq (%r14), %rax
movq %rax, 0x57ccc(%rip)     # 0x64808
jmp 0xc926
leaq 0x10dbd(%rip), %rdi     # 0x1d905
leaq 0x10b25(%rip), %rsi     # 0x1d674
leaq 0x10e89(%rip), %rcx     # 0x1d9df
movl $0x1f7, %edx            # imm = 0x1F7
callq 0x3170