// File: /workspace/github_c_makefile_star2_O1/mahrr[P]raven/src/compiler.c
// Function: if_
static void if_(Parser *parser) {
    // If Control Flow:
    //
    // Condition
    // OP_JMP_POP_FALSE    -------.
    //                            |
    // Then Block                 |
    // OP_JMP              -----------.
    //                            |   |
    // Else Block | Nil    <-------   |
    // ....                <-----------

    Debug_Log(parser);

    expression(parser); // Condition
    consume(parser, TOKEN_DO, "expect 'do' after if condition");

    int then_jump = emit_jump(parser, OP_JMP_POP_FALSE);  // ---. false
    if_block(parser);                                     //    |
                                                          //    |
    int else_jump = emit_jump(parser, OP_JMP);            // ---|--. true
                                                          //    |  |
    patch_jump(parser, then_jump);                        // <---  |
                                                          //       |
    if (parser->previous.type == TOKEN_ELSE) {            //       |
        block(parser);                                    //       |
    } else {                                              //       |
        emit_byte(parser, OP_PUSH_NIL);                   //       |
    }                                                     //       |
                                                          //       |
    patch_jump(parser, else_jump);                        // <------

    Debug_Exit(parser);
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rdi, %rbx
movl $0x1, %esi
callq 0x6ab6
leaq 0x18(%rbx), %r14
cmpl $0x22, 0x18(%rbx)
jne 0x6f15
movq 0x10(%r14), %rax
movq %rax, 0x40(%rbx)
movups (%r14), %xmm0
movups %xmm0, 0x30(%rbx)
movq %rsp, %r15
movq (%rbx), %rsi
movq %r15, %rdi
callq 0x97fb
movq 0x10(%rsp), %rax
movq %rax, 0x10(%r14)
movups (%rsp), %xmm0
movups %xmm0, (%r14)
cmpl $0x35, 0x18(%rbx)
je 0x6ef1
jmp 0x6f27
leaq 0x4a83(%rip), %rdx      # 0xb99f
movq %rbx, %rdi
movq %r14, %rsi
callq 0x64ec
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0x21, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0xff, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0xff, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rcx
movslq 0x20(%rcx), %r12
addq $-0x2, %r12
incl 0x221c(%rax)
movl (%r14), %eax
cmpl $0x3, %eax
je 0x6fe1
cmpl $0x23, %eax
je 0x6fa4
cmpl $0x36, %eax
je 0x6fa4
movq %rbx, %rdi
callq 0x5eca
jmp 0x6f88
cmpl $0x23, (%r14)
jne 0x7018
movq 0x10(%r14), %rax
movq %rax, 0x40(%rbx)
movups (%r14), %xmm0
movups %xmm0, 0x30(%rbx)
movq %rsp, %r15
movq (%rbx), %rsi
movq %r15, %rdi
callq 0x97fb
movq 0x10(%rsp), %rax
movq %rax, 0x10(%r14)
movups (%rsp), %xmm0
movups %xmm0, (%r14)
cmpl $0x35, 0x18(%rbx)
je 0x6fbd
jmp 0x702a
movq 0x10(%r14), %rax
movq %rax, 0x40(%rbx)
movups (%r14), %xmm0
movups %xmm0, 0x30(%rbx)
movq %rsp, %r15
movq (%rbx), %rsi
movq %r15, %rdi
callq 0x97fb
movq 0x10(%rsp), %rax
movq %rax, 0x10(%r14)
movups (%rsp), %xmm0
movups %xmm0, (%r14)
cmpl $0x35, 0x18(%rbx)
je 0x6ff4
jmp 0x702a
leaq 0x499f(%rip), %rdx      # 0xb9be
movq %rbx, %rdi
movq %r14, %rsi
callq 0x64ec
movq %rbx, %rdi
movl $0x1, %esi
callq 0x8879
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0x1e, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0xff, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0xff, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %r15
movslq 0x20(%r15), %rdx
movq %rdx, %rbp
addq $-0x2, %rbp
movq %r12, %rax
subl %eax, %edx
cmpl $0x10002, %edx          # imm = 0x10002
jl 0x70ba
movq %rdx, %r13
leaq 0x48cd(%rip), %rdx      # 0xb979
movq %rbx, %rdi
movq %r14, %rsi
callq 0x64ec
movq %r13, %rdx
addl $-0x2, %edx
movq 0x28(%r15), %rax
movq %r12, %rcx
movb %dh, (%rax,%rcx)
movq 0x28(%r15), %rax
movb %dl, 0x1(%rax,%r12)
cmpl $0x3, 0x30(%rbx)
jne 0x70e0
movq %rbx, %rdi
callq 0x7b92
jmp 0x70f9
movq 0x8(%rbx), %rax
movq 0x8(%rax), %rdi
addq $0x20, %rdi
movl 0x44(%rbx), %edx
movl $0x2, %esi
callq 0x4d19
movq 0x8(%rbx), %rax
movq 0x8(%rax), %r15
movl 0x20(%r15), %ecx
subl %ebp, %ecx
cmpl $0x10002, %ecx          # imm = 0x10002
jl 0x7125
leaq 0x4863(%rip), %rdx      # 0xb979
movq %rbx, %rdi
movq %r14, %rsi
movl %ecx, %ebx
callq 0x64ec
movl %ebx, %ecx
addl $-0x2, %ecx
movq 0x28(%r15), %rax
movb %ch, (%rax,%rbp)
movq 0x28(%r15), %rax
movb %cl, 0x1(%rax,%rbp)
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq