// File: SunriseFox[P]very-simple-c-compiler/./src/asm.cpp
// Function: handleFuncCall(TreeNode*)
void handleFuncCall(TreeNode* node) {
    vector<ExprNode*> children;
    ExprNode* child = static_cast<ExprNode*>(node->child);
    while (child) {
        children.push_back(child);
        child = static_cast<ExprNode*>(child->sibling);
    }
    string op;
    int argNums[]{5, 4, 3, 2, 6, 7};
    bool originalRegState[14];
    for (int i = 0; i < 14; i++) {
        originalRegState[i] = regUsed[i];
    }
    for (size_t i = 0; i < children.size(); i++) {
        if (i >= 6) {
            cerr << "ignoring " << i << "th args" << endl;
            continue;
        }
        op = handleExprNode(children[i]);
        if (regUsed[argNums[i]]) {
            of << "\tpushq\t" << op << ", " << get8RegName(argNums[i]) << "\n";
        }
        regUsed[argNums[i]] = true;
        if (op[0] == '$') {;
            of << "\tmovl\t" << op << ", " << get4RegName(argNums[i]) << "\n";
        } else if (children[i]->symbol->type == Symbol::VALUE_STRING) {
            of << "\tleaq\t" << op << ", "  << get8RegName(argNums[i]) << "\n";
        } else {
            of << "\tmovq\t" << op << ", "  << get8RegName(argNums[i]) << "\n";
        }
    }
    string funcName = static_cast<DeclarationNode*>(node)->symbol->value;
    cerr << "-- funccall" << funcName << endl;
    if (funcName == "scanf")
        funcName = "__isoc99_scanf@PLT";
    else if (funcName == "printf")
        funcName = "printf@PLT";
    of << "\tcall\t" << funcName << "\n";
    for (int i = 0; i < 14; i++) {
        regUsed[i] = originalRegState[i];
        if (regUsed[i]) {
            of << "\tpop\t" << op << get8RegName(argNums[i]) << "\n";
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x260, %rsp            # imm = 0x260
movq %rdi, -0x8(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x8ce0
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x5809
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x8d00
jmp 0x57ea
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x57d4
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x5fb1
leaq -0x58(%rbp), %rdi
callq 0x3390
movq 0x11937(%rip), %rax     # 0x17150
movq %rax, -0x70(%rbp)
movq 0x11934(%rip), %rax     # 0x17158
movq %rax, -0x68(%rbp)
movq 0x11931(%rip), %rax     # 0x17160
movq %rax, -0x60(%rbp)
movl $0x0, -0x84(%rbp)
cmpl $0xe, -0x84(%rbp)
jge 0x5876
movslq -0x84(%rbp), %rcx
leaq 0x1bc9c(%rip), %rax     # 0x214f0
movb (%rax,%rcx), %cl
movslq -0x84(%rbp), %rax
andb $0x1, %cl
movb %cl, -0x7e(%rbp,%rax)
movl -0x84(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x84(%rbp)
jmp 0x583d
movq $0x0, -0x90(%rbp)
movq -0x90(%rbp), %rax
movq %rax, -0x180(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x8d70
movq %rax, %rcx
movq -0x180(%rbp), %rax
cmpq %rcx, %rax
jae 0x5d27
cmpq $0x6, -0x90(%rbp)
jb 0x5934
movq 0x1b734(%rip), %rdi     # 0x20ff0
leaq 0x119fc(%rip), %rsi     # 0x172bf
callq 0x3240
movq %rax, -0x188(%rbp)
jmp 0x58d1
movq -0x188(%rbp), %rdi
movq -0x90(%rbp), %rsi
callq 0x30b0
movq %rax, -0x190(%rbp)
jmp 0x58ed
movq -0x190(%rbp), %rdi
leaq 0x119ce(%rip), %rsi     # 0x172c9
callq 0x3240
movq %rax, -0x198(%rbp)
jmp 0x5909
movq -0x198(%rbp), %rdi
movq 0x1b691(%rip), %rsi     # 0x20fa8
callq 0x3290
jmp 0x591e
jmp 0x5d10
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x5fa8
movq -0x90(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0x8d90
movq (%rax), %rsi
leaq -0xb0(%rbp), %rdi
callq 0x5fd0
jmp 0x5955
leaq -0x58(%rbp), %rdi
leaq -0xb0(%rbp), %rsi
callq 0x3340
leaq -0xb0(%rbp), %rdi
callq 0x3180
movq -0x90(%rbp), %rax
movslq -0x70(%rbp,%rax,4), %rcx
leaq 0x1bb6c(%rip), %rax     # 0x214f0
testb $0x1, (%rax,%rcx)
je 0x5a54
leaq 0x1b95b(%rip), %rdi     # 0x212f0
leaq 0x11935(%rip), %rsi     # 0x172d1
callq 0x3240
movq %rax, -0x1a0(%rbp)
jmp 0x59aa
movq -0x1a0(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3230
movq %rax, -0x1a8(%rbp)
jmp 0x59c3
movq -0x1a8(%rbp), %rdi
leaq 0x119c6(%rip), %rsi     # 0x17397
callq 0x3240
movq %rax, -0x1b0(%rbp)
jmp 0x59df
movq -0x90(%rbp), %rax
movl -0x70(%rbp,%rax,4), %esi
leaq -0xd0(%rbp), %rdi
callq 0x4290
jmp 0x59f8
movq -0x1b0(%rbp), %rdi
leaq -0xd0(%rbp), %rsi
callq 0x3230
movq %rax, -0x1b8(%rbp)
jmp 0x5a14
movq -0x1b8(%rbp), %rdi
leaq 0x11ac2(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5a29
leaq -0xd0(%rbp), %rdi
callq 0x3180
jmp 0x5a54
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xd0(%rbp), %rdi
callq 0x3180
jmp 0x5fa8
movq -0x90(%rbp), %rax
movslq -0x70(%rbp,%rax,4), %rax
leaq 0x1ba89(%rip), %rcx     # 0x214f0
movb $0x1, (%rax,%rcx)
xorl %eax, %eax
movl %eax, %esi
leaq -0x58(%rbp), %rdi
callq 0x3500
movq %rax, -0x1c0(%rbp)
jmp 0x5a81
movq -0x1c0(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x24, %eax
jne 0x5b5d
leaq 0x1b855(%rip), %rdi     # 0x212f0
leaq 0x11837(%rip), %rsi     # 0x172d9
callq 0x3240
movq %rax, -0x1c8(%rbp)
jmp 0x5ab0
movq -0x1c8(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3230
movq %rax, -0x1d0(%rbp)
jmp 0x5ac9
movq -0x1d0(%rbp), %rdi
leaq 0x118c0(%rip), %rsi     # 0x17397
callq 0x3240
movq %rax, -0x1d8(%rbp)
jmp 0x5ae5
movq -0x90(%rbp), %rax
movl -0x70(%rbp,%rax,4), %esi
leaq -0xf0(%rbp), %rdi
callq 0x3da0
jmp 0x5afe
movq -0x1d8(%rbp), %rdi
leaq -0xf0(%rbp), %rsi
callq 0x3230
movq %rax, -0x1e0(%rbp)
jmp 0x5b1a
movq -0x1e0(%rbp), %rdi
leaq 0x119bc(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5b2f
leaq -0xf0(%rbp), %rdi
callq 0x3180
jmp 0x5d0e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0xf0(%rbp), %rdi
callq 0x3180
jmp 0x5fa8
movq -0x90(%rbp), %rsi
leaq -0x20(%rbp), %rdi
callq 0x8d90
movq (%rax), %rax
movq 0x28(%rax), %rax
cmpl $0x4, (%rax)
jne 0x5c46
leaq 0x1b76c(%rip), %rdi     # 0x212f0
leaq 0x11755(%rip), %rsi     # 0x172e0
callq 0x3240
movq %rax, -0x1e8(%rbp)
jmp 0x5b99
movq -0x1e8(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3230
movq %rax, -0x1f0(%rbp)
jmp 0x5bb2
movq -0x1f0(%rbp), %rdi
leaq 0x117d7(%rip), %rsi     # 0x17397
callq 0x3240
movq %rax, -0x1f8(%rbp)
jmp 0x5bce
movq -0x90(%rbp), %rax
movl -0x70(%rbp,%rax,4), %esi
leaq -0x110(%rbp), %rdi
callq 0x4290
jmp 0x5be7
movq -0x1f8(%rbp), %rdi
leaq -0x110(%rbp), %rsi
callq 0x3230
movq %rax, -0x200(%rbp)
jmp 0x5c03
movq -0x200(%rbp), %rdi
leaq 0x118d3(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5c18
leaq -0x110(%rbp), %rdi
callq 0x3180
jmp 0x5d0c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x110(%rbp), %rdi
callq 0x3180
jmp 0x5fa8
leaq 0x1b6a3(%rip), %rdi     # 0x212f0
leaq 0x11693(%rip), %rsi     # 0x172e7
callq 0x3240
movq %rax, -0x208(%rbp)
jmp 0x5c62
movq -0x208(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3230
movq %rax, -0x210(%rbp)
jmp 0x5c7b
movq -0x210(%rbp), %rdi
leaq 0x1170e(%rip), %rsi     # 0x17397
callq 0x3240
movq %rax, -0x218(%rbp)
jmp 0x5c97
movq -0x90(%rbp), %rax
movl -0x70(%rbp,%rax,4), %esi
leaq -0x130(%rbp), %rdi
callq 0x4290
jmp 0x5cb0
movq -0x218(%rbp), %rdi
leaq -0x130(%rbp), %rsi
callq 0x3230
movq %rax, -0x220(%rbp)
jmp 0x5ccc
movq -0x220(%rbp), %rdi
leaq 0x1180a(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5ce1
leaq -0x130(%rbp), %rdi
callq 0x3180
jmp 0x5d0c
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x130(%rbp), %rdi
callq 0x3180
jmp 0x5fa8
jmp 0x5d0e
jmp 0x5d10
movq -0x90(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x90(%rbp)
jmp 0x5881
movq -0x8(%rbp), %rax
movq 0x28(%rax), %rsi
addq $0x8, %rsi
leaq -0x150(%rbp), %rdi
callq 0x3110
jmp 0x5d41
movq 0x1b2a8(%rip), %rdi     # 0x20ff0
leaq 0x1159f(%rip), %rsi     # 0x172ee
callq 0x3240
movq %rax, -0x228(%rbp)
jmp 0x5d5d
movq -0x228(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x3230
movq %rax, -0x230(%rbp)
jmp 0x5d79
movq -0x230(%rbp), %rdi
movq 0x1b221(%rip), %rsi     # 0x20fa8
callq 0x3290
jmp 0x5d8e
leaq 0x11565(%rip), %rsi     # 0x172fa
leaq -0x150(%rbp), %rdi
callq 0x8db0
movb %al, -0x231(%rbp)
jmp 0x5da9
movb -0x231(%rbp), %al
testb $0x1, %al
jne 0x5db5
jmp 0x5ddd
leaq 0x11544(%rip), %rsi     # 0x17300
leaq -0x150(%rbp), %rdi
callq 0x3380
jmp 0x5dca
jmp 0x5e1d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0x5f9c
leaq 0x1152f(%rip), %rsi     # 0x17313
leaq -0x150(%rbp), %rdi
callq 0x8db0
movb %al, -0x232(%rbp)
jmp 0x5df8
movb -0x232(%rbp), %al
testb $0x1, %al
jne 0x5e04
jmp 0x5e1b
leaq 0x1150f(%rip), %rsi     # 0x1731a
leaq -0x150(%rbp), %rdi
callq 0x3380
jmp 0x5e19
jmp 0x5e1b
jmp 0x5e1d
leaq 0x1b4cc(%rip), %rdi     # 0x212f0
leaq 0x114fa(%rip), %rsi     # 0x17325
callq 0x3240
movq %rax, -0x240(%rbp)
jmp 0x5e39
movq -0x240(%rbp), %rdi
leaq -0x150(%rbp), %rsi
callq 0x3230
movq %rax, -0x248(%rbp)
jmp 0x5e55
movq -0x248(%rbp), %rdi
leaq 0x11681(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5e6a
movl $0x0, -0x154(%rbp)
cmpl $0xe, -0x154(%rbp)
jge 0x5f75
movslq -0x154(%rbp), %rax
movb -0x7e(%rbp,%rax), %dl
movslq -0x154(%rbp), %rcx
andb $0x1, %dl
leaq 0x1b653(%rip), %rax     # 0x214f0
movb %dl, (%rax,%rcx)
movslq -0x154(%rbp), %rcx
leaq 0x1b642(%rip), %rax     # 0x214f0
testb $0x1, (%rax,%rcx)
je 0x5f5f
leaq 0x1b431(%rip), %rdi     # 0x212f0
leaq 0x11466(%rip), %rsi     # 0x1732c
callq 0x3240
movq %rax, -0x250(%rbp)
jmp 0x5ed4
movq -0x250(%rbp), %rdi
leaq -0x58(%rbp), %rsi
callq 0x3230
movq %rax, -0x258(%rbp)
jmp 0x5eed
movslq -0x154(%rbp), %rax
movl -0x70(%rbp,%rax,4), %esi
leaq -0x178(%rbp), %rdi
callq 0x4290
jmp 0x5f06
movq -0x258(%rbp), %rdi
leaq -0x178(%rbp), %rsi
callq 0x3230
movq %rax, -0x260(%rbp)
jmp 0x5f22
movq -0x260(%rbp), %rdi
leaq 0x115b4(%rip), %rsi     # 0x174e4
callq 0x3240
jmp 0x5f37
leaq -0x178(%rbp), %rdi
callq 0x3180
jmp 0x5f5f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x178(%rbp), %rdi
callq 0x3180
jmp 0x5f9c
jmp 0x5f61
movl -0x154(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x154(%rbp)
jmp 0x5e74
leaq -0x150(%rbp), %rdi
callq 0x3180
leaq -0x58(%rbp), %rdi
callq 0x3180
leaq -0x20(%rbp), %rdi
callq 0x8de0
addq $0x260, %rsp            # imm = 0x260
popq %rbp
retq
leaq -0x150(%rbp), %rdi
callq 0x3180
leaq -0x58(%rbp), %rdi
callq 0x3180
leaq -0x20(%rbp), %rdi
callq 0x8de0
movq -0x30(%rbp), %rdi
callq 0x3480
nopw %cs:(%rax,%rax)