// File: fondoger[P]C0-Compiler/src/grammar.cpp
// Function: pDoWhileStatement()
static void pDoWhileStatement()
{
    std::string begin_label = genLabel();

    assert(g_sym == DOSY);
    readSymbol();
    genMidCode(LABEL, begin_label, NONE, NONE);
    pStatement();
    test3(Symset({WHILESY}));
    readSymbol();
    test3(Symset({LPARENT}));
    readSymbol();
    pCondition();
    // BNZ: branch if satisfy
    genMidCode(BNZ, begin_label, NONE, NONE);
    test3(Symset({RPARENT}));
    readSymbol();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x150, %rsp            # imm = 0x150
leaq -0x20(%rbp), %rdi
callq 0x272a0
leaq 0x2ec25(%rip), %rax     # 0x4b6b0
cmpl $0x7, (%rax)
jne 0x1ca92
jmp 0x1cab1
leaq 0x18d29(%rip), %rdi     # 0x357c2
leaq 0x18988(%rip), %rsi     # 0x35428
movl $0x157, %edx            # imm = 0x157
leaq 0x18d24(%rip), %rcx     # 0x357d0
callq 0x3230
callq 0x2e050
jmp 0x1cab8
movl $0x13, -0x30(%rbp)
leaq 0x2a53a(%rip), %rcx     # 0x47000
leaq -0x30(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movq %rcx, %rdx
callq 0x26340
jmp 0x1cad8
callq 0x1c2d0
jmp 0x1cadf
jmp 0x1cae1
movl $0x8, -0x4c(%rbp)
leaq -0x4c(%rbp), %rax
movq %rax, -0x48(%rbp)
movq $0x1, -0x40(%rbp)
movq -0x48(%rbp), %rsi
movq -0x40(%rbp), %rdx
leaq -0x38(%rbp), %rdi
callq 0x227f0
jmp 0x1cb0b
movl $0x22, -0x70(%rbp)
movl $0x26, -0x6c(%rbp)
leaq -0x70(%rbp), %rax
movq %rax, -0x68(%rbp)
movq $0x2, -0x60(%rbp)
movq -0x68(%rbp), %rsi
movq -0x60(%rbp), %rdx
leaq -0x58(%rbp), %rdi
callq 0x227f0
jmp 0x1cb3c
movq -0x38(%rbp), %rdi
movq -0x58(%rbp), %rsi
callq 0x18170
jmp 0x1cb4b
movl $0x8, -0x8c(%rbp)
leaq -0x8c(%rbp), %rax
movq %rax, -0x88(%rbp)
movq $0x1, -0x80(%rbp)
movq -0x88(%rbp), %rsi
movq -0x80(%rbp), %rdx
leaq -0x78(%rbp), %rdi
callq 0x227f0
jmp 0x1cb81
leaq 0x2eb28(%rip), %rax     # 0x4b6b0
movl (%rax), %esi
leaq -0x78(%rbp), %rdi
callq 0x18b40
xorb $-0x1, %al
testb $0x1, %al
jne 0x1cb9b
jmp 0x1cbcb
callq 0x2e050
jmp 0x1cba2
movl $0x1, -0x90(%rbp)
jmp 0x1ce42
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x28(%rbp)
movl %eax, -0x2c(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x35e8
jmp 0x1ce54
jmp 0x1cbcd
jmp 0x1cbcf
callq 0x2e050
jmp 0x1cbd6
jmp 0x1cbd8
movl $0x1d, -0xac(%rbp)
leaq -0xac(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq $0x1, -0xa0(%rbp)
movq -0xa8(%rbp), %rsi
movq -0xa0(%rbp), %rdx
leaq -0x98(%rbp), %rdi
callq 0x227f0
jmp 0x1cc17
movl $0x22, -0xd0(%rbp)
movl $0x26, -0xcc(%rbp)
leaq -0xd0(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq $0x2, -0xc0(%rbp)
movq -0xc8(%rbp), %rsi
movq -0xc0(%rbp), %rdx
leaq -0xb8(%rbp), %rdi
callq 0x227f0
jmp 0x1cc60
movq -0x98(%rbp), %rdi
movq -0xb8(%rbp), %rsi
callq 0x18170
jmp 0x1cc75
movl $0x1d, -0xec(%rbp)
leaq -0xec(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq $0x1, -0xe0(%rbp)
movq -0xe8(%rbp), %rsi
movq -0xe0(%rbp), %rdx
leaq -0xd8(%rbp), %rdi
callq 0x227f0
jmp 0x1ccb4
leaq 0x2e9f5(%rip), %rax     # 0x4b6b0
movl (%rax), %esi
leaq -0xd8(%rbp), %rdi
callq 0x18b40
xorb $-0x1, %al
testb $0x1, %al
jne 0x1ccd1
jmp 0x1cce7
callq 0x2e050
jmp 0x1ccd8
movl $0x1, -0x90(%rbp)
jmp 0x1ce42
jmp 0x1cce9
jmp 0x1cceb
callq 0x2e050
jmp 0x1ccf2
callq 0x1f380
jmp 0x1ccf9
movl $0x16, -0xf0(%rbp)
leaq 0x2a2f6(%rip), %rcx     # 0x47000
leaq -0xf0(%rbp), %rdi
leaq -0x20(%rbp), %rsi
movq %rcx, %rdx
callq 0x26340
jmp 0x1cd1f
jmp 0x1cd21
movl $0x1e, -0x10c(%rbp)
leaq -0x10c(%rbp), %rax
movq %rax, -0x108(%rbp)
movq $0x1, -0x100(%rbp)
movq -0x108(%rbp), %rsi
movq -0x100(%rbp), %rdx
leaq -0xf8(%rbp), %rdi
callq 0x227f0
jmp 0x1cd60
movl $0x22, -0x130(%rbp)
movl $0x26, -0x12c(%rbp)
leaq -0x130(%rbp), %rax
movq %rax, -0x128(%rbp)
movq $0x2, -0x120(%rbp)
movq -0x128(%rbp), %rsi
movq -0x120(%rbp), %rdx
leaq -0x118(%rbp), %rdi
callq 0x227f0
jmp 0x1cda9
movq -0xf8(%rbp), %rdi
movq -0x118(%rbp), %rsi
callq 0x18170
jmp 0x1cdbe
movl $0x1e, -0x14c(%rbp)
leaq -0x14c(%rbp), %rax
movq %rax, -0x148(%rbp)
movq $0x1, -0x140(%rbp)
movq -0x148(%rbp), %rsi
movq -0x140(%rbp), %rdx
leaq -0x138(%rbp), %rdi
callq 0x227f0
jmp 0x1cdfd
leaq 0x2e8ac(%rip), %rax     # 0x4b6b0
movl (%rax), %esi
leaq -0x138(%rbp), %rdi
callq 0x18b40
xorb $-0x1, %al
testb $0x1, %al
jne 0x1ce1a
jmp 0x1ce2d
callq 0x2e050
jmp 0x1ce21
movl $0x1, -0x90(%rbp)
jmp 0x1ce42
jmp 0x1ce2f
jmp 0x1ce31
callq 0x2e050
jmp 0x1ce38
movl $0x0, -0x90(%rbp)
leaq -0x20(%rbp), %rdi
callq 0x35e8
addq $0x150, %rsp            # imm = 0x150
popq %rbp
retq
movq -0x28(%rbp), %rdi
callq 0x3560
nopl (%rax)