// File: sighingnow[P]compile-pascal/pl0_x86.cpp
// Function: pl0_x86_gen_blocks(std::vector<BasicBlock, std::allocator<BasicBlock>>&, unsigned long)
static size_t pl0_x86_gen_blocks(std::vector<BasicBlock> & bbs, size_t bp = 0) {
    std::vector<std::string> buffer;
    pl0_x86_gen_header(bbs[bp++], buffer);
    runtime.dump();
    while (bp < bbs.size() && bbs[bp].no == 0) {
        bp = pl0_x86_gen_blocks(bbs, bp);
    }
    for (auto && s: buffer) {
        out.emit(s);
    }
    while (bp < bbs.size() && bbs[bp].no != 0) {
        pl0_x86_gen_body(bbs[bp]);
        if (bbs[bp++].is_end) {
            break; // the end block of a procedure or a function.
        }
    }
    return bp;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x28(%rbp), %rdi
movq %rdi, -0x80(%rbp)
callq 0xbda00
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq %rsi, %rax
incq %rax
movq %rax, -0x10(%rbp)
callq 0xceff0
movq -0x80(%rbp), %rsi
movq %rax, %rdi
callq 0xdffd0
jmp 0xdfde5
leaq 0x80a34(%rip), %rdi     # 0x160820
callq 0xea090
jmp 0xdfdf3
jmp 0xdfdf5
movq -0x10(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x8(%rbp), %rdi
callq 0xce1a0
movq -0x90(%rbp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0x81(%rbp)
jae 0xdfe39
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xceff0
cmpl $0x0, (%rax)
sete %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0xdfe45
jmp 0xdfe79
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xdfda0
movq %rax, -0x98(%rbp)
jmp 0xdfe5b
movq -0x98(%rbp), %rax
movq %rax, -0x10(%rbp)
jmp 0xdfdf5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
jmp 0xdffbc
leaq -0x28(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rdi
callq 0xc1fd0
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rdi
callq 0xc2000
movq %rax, -0x50(%rbp)
leaq -0x48(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0xc2030
testb $0x1, %al
jne 0xdfeae
jmp 0xdff0a
leaq -0x48(%rbp), %rdi
callq 0xc2070
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rsi
leaq -0x78(%rbp), %rdi
callq 0x5150
jmp 0xdfeca
leaq 0x80917(%rip), %rdi     # 0x1607e8
leaq -0x78(%rbp), %rsi
callq 0xdaf40
jmp 0xdfedc
leaq -0x78(%rbp), %rdi
callq 0x5200
leaq -0x48(%rbp), %rdi
callq 0xc2090
jmp 0xdfe9b
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x30(%rbp)
movl %eax, -0x34(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x5200
jmp 0xdffbc
jmp 0xdff0c
movq -0x10(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0x8(%rbp), %rdi
callq 0xce1a0
movq -0xa8(%rbp), %rcx
movq %rax, %rdx
xorl %eax, %eax
cmpq %rdx, %rcx
movb %al, -0x99(%rbp)
jae 0xdff50
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xceff0
cmpl $0x0, (%rax)
setne %al
movb %al, -0x99(%rbp)
movb -0x99(%rbp), %al
testb $0x1, %al
jne 0xdff5c
jmp 0xdff98
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0xceff0
movq %rax, %rdi
callq 0xe0a10
jmp 0xdff73
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq %rsi, %rax
addq $0x1, %rax
movq %rax, -0x10(%rbp)
callq 0xceff0
testb $0x1, 0x5(%rax)
je 0xdff93
jmp 0xdff98
jmp 0xdff0c
movq -0x10(%rbp), %rax
movq %rax, -0xb0(%rbp)
leaq -0x28(%rbp), %rdi
callq 0xbda20
movq -0xb0(%rbp), %rax
addq $0xb0, %rsp
popq %rbp
retq
leaq -0x28(%rbp), %rdi
callq 0xbda20
movq -0x30(%rbp), %rdi
callq 0x55b0
nop