// File: SunriseFox[P]very-simple-c-compiler/./src/asm.cpp
// Function: handleIf(StatementNode*)
void handleIf(StatementNode* node) {
    string LElse = getNextLabel();
    string LEnd = getNextLabel();
    string op = handleExprNode(node->child);

    string reg;

    if (getRegNum(op) == -1) { // 不是寄存器
        reg = getTmpReg(4);
        of << "\tmovl\t" << op << ", " << reg << "\n";
    } else {
        reg = op;
    }

    of << "\ttestl\t" << reg << ", " << reg << "\n";
    of << "\tje\t" << LElse << "\n";
    generateCode(node->child->sibling);
    of << "\tjmp\t" << LEnd << "\n";

    of << LElse << ":\n";
    generateCode(node->child->sibling ? node->child->sibling->sibling : nullptr);
    of << LEnd << ":\n";
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x140, %rsp            # imm = 0x140
movq %rdi, -0x8(%rbp)
leaq -0x28(%rbp), %rdi
callq 0x4db0
leaq -0x48(%rbp), %rdi
callq 0x4db0
jmp 0x7fd3
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rsi
leaq -0x78(%rbp), %rdi
callq 0x5fd0
jmp 0x7fe6
leaq -0x98(%rbp), %rdi
callq 0x3390
leaq -0x78(%rbp), %rdi
callq 0x4850
movl %eax, -0xbc(%rbp)
jmp 0x8003
movl -0xbc(%rbp), %eax
cmpl $-0x1, %eax
jne 0x8117
leaq -0xb8(%rbp), %rdi
movl $0x4, %esi
callq 0x4780
jmp 0x8025
leaq -0x98(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
movq %rsi, -0xd0(%rbp)
callq 0x3340
movq -0xd0(%rbp), %rdi
callq 0x3180
leaq 0x1929e(%rip), %rdi     # 0x212f0
leaq 0xf280(%rip), %rsi      # 0x172d9
callq 0x3240
movq %rax, -0xc8(%rbp)
jmp 0x8067
movq -0xc8(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x3230
movq %rax, -0xd8(%rbp)
jmp 0x8080
movq -0xd8(%rbp), %rdi
leaq 0xf309(%rip), %rsi      # 0x17397
callq 0x3240
movq %rax, -0xe0(%rbp)
jmp 0x809c
movq -0xe0(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3230
movq %rax, -0xe8(%rbp)
jmp 0x80b8
movq -0xe8(%rbp), %rdi
leaq 0xf41e(%rip), %rsi      # 0x174e4
callq 0x3240
jmp 0x80cd
jmp 0x812b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x832d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x8324
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x98(%rbp), %rdi
callq 0x3180
leaq -0x78(%rbp), %rdi
callq 0x3180
jmp 0x8324
leaq -0x98(%rbp), %rdi
leaq -0x78(%rbp), %rsi
callq 0x3040
jmp 0x8129
jmp 0x812b
leaq 0x191be(%rip), %rdi     # 0x212f0
leaq 0xf21e(%rip), %rsi      # 0x17357
callq 0x3240
movq %rax, -0xf0(%rbp)
jmp 0x8147
movq -0xf0(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3230
movq %rax, -0xf8(%rbp)
jmp 0x8163
movq -0xf8(%rbp), %rdi
leaq 0xf226(%rip), %rsi      # 0x17397
callq 0x3240
movq %rax, -0x100(%rbp)
jmp 0x817f
movq -0x100(%rbp), %rdi
leaq -0x98(%rbp), %rsi
callq 0x3230
movq %rax, -0x108(%rbp)
jmp 0x819b
movq -0x108(%rbp), %rdi
leaq 0xf33b(%rip), %rsi      # 0x174e4
callq 0x3240
jmp 0x81b0
leaq 0x19139(%rip), %rdi     # 0x212f0
leaq 0xf1b8(%rip), %rsi      # 0x17376
callq 0x3240
movq %rax, -0x110(%rbp)
jmp 0x81cc
movq -0x110(%rbp), %rdi
leaq -0x28(%rbp), %rsi
callq 0x3230
movq %rax, -0x118(%rbp)
jmp 0x81e5
movq -0x118(%rbp), %rdi
leaq 0xf2f1(%rip), %rsi      # 0x174e4
callq 0x3240
jmp 0x81fa
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rdi
callq 0x5350
jmp 0x820d
leaq 0x190dc(%rip), %rdi     # 0x212f0
leaq 0xf16b(%rip), %rsi      # 0x17386
callq 0x3240
movq %rax, -0x120(%rbp)
jmp 0x8229
movq -0x120(%rbp), %rdi
leaq -0x48(%rbp), %rsi
callq 0x3230
movq %rax, -0x128(%rbp)
jmp 0x8242
movq -0x128(%rbp), %rdi
leaq 0xf294(%rip), %rsi      # 0x174e4
callq 0x3240
jmp 0x8257
leaq 0x19092(%rip), %rdi     # 0x212f0
leaq -0x28(%rbp), %rsi
callq 0x3230
movq %rax, -0x130(%rbp)
jmp 0x8270
movq -0x130(%rbp), %rdi
leaq 0xf10e(%rip), %rsi      # 0x1738c
callq 0x3240
jmp 0x8285
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
cmpq $0x0, 0x20(%rax)
je 0x82ad
movq -0x8(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rax), %rax
movq 0x20(%rax), %rax
movq %rax, -0x138(%rbp)
jmp 0x82b8
xorl %eax, %eax
movq %rax, -0x138(%rbp)
jmp 0x82b8
movq -0x138(%rbp), %rdi
callq 0x5350
jmp 0x82c6
leaq 0x19023(%rip), %rdi     # 0x212f0
leaq -0x48(%rbp), %rsi
callq 0x3230
movq %rax, -0x140(%rbp)
jmp 0x82df
movq -0x140(%rbp), %rdi
leaq 0xf09f(%rip), %rsi      # 0x1738c
callq 0x3240
jmp 0x82f4
leaq -0x98(%rbp), %rdi
callq 0x3180
leaq -0x78(%rbp), %rdi
callq 0x3180
leaq -0x48(%rbp), %rdi
callq 0x3180
leaq -0x28(%rbp), %rdi
callq 0x3180
addq $0x140, %rsp            # imm = 0x140
popq %rbp
retq
leaq -0x48(%rbp), %rdi
callq 0x3180
leaq -0x28(%rbp), %rdi
callq 0x3180
movq -0x50(%rbp), %rdi
callq 0x3480
nop