// File: fondoger[P]C0-Compiler/src/grammar.cpp
// Function: pArrayRead(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>&, DataType&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const&, _TabEntry const&)
static void pArrayRead(std::string &res, DataType &res_dtype,
        const std::string &id, const TabEntry &entry)
{
    if (g_sym != LBRACK) {
        error(ERR_EXPECT_ARRAY_ELEMENT);
    }
    test3(Symset({LBRACK}));
    readSymbol();  // skip left bracket
    // handle index
    std::string index;    // index
    DataType index_dtype; // index's data type
    pExpression(index, index_dtype);
    if (index_dtype != DT_INT) {
        // array's index must be int type
        error(ERR_EXPECT_INT_ARRAY_INDEX);
    }
    // overflow check for const indexes
    int val;
    if (isConstValue(index, val) &&
        (val < 0 || val >= entry.value)) {
        error(ERR_ARRAY_INDEX_OVERFLOW);
    }
    res = genTempVar();
    res_dtype = entry.dtype;
    genMidCode(TEMP, (res_dtype == DT_INT ? "int": "char"), res, NONE);
    genMidCode(RARRAY, id, index, res);
    test3(Symset({RBRACK}));
    readSymbol();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x220, %rsp            # imm = 0x220
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
leaq 0x2ad6e(%rip), %rax     # 0x4b6b0
cmpl $0x1f, (%rax)
je 0x209c0
leaq -0x41(%rbp), %rdi
movq %rdi, -0x1e8(%rbp)
callq 0x3570
movq -0x1e8(%rbp), %rdx
leaq 0x14e03(%rip), %rsi     # 0x35768
leaq -0x40(%rbp), %rdi
callq 0x3440
jmp 0x20970
leaq -0x40(%rbp), %rdi
callq 0x18620
jmp 0x2097b
leaq -0x40(%rbp), %rdi
callq 0x35e8
leaq -0x41(%rbp), %rdi
callq 0x3370
jmp 0x209c0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x209b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x40(%rbp), %rdi
callq 0x35e8
leaq -0x41(%rbp), %rdi
callq 0x3370
jmp 0x20ebe
jmp 0x209c2
movl $0x1f, -0x74(%rbp)
leaq -0x74(%rbp), %rax
movq %rax, -0x70(%rbp)
movq $0x1, -0x68(%rbp)
movq -0x70(%rbp), %rsi
movq -0x68(%rbp), %rdx
leaq -0x60(%rbp), %rdi
callq 0x227f0
movl $0x22, -0x98(%rbp)
movl $0x26, -0x94(%rbp)
leaq -0x98(%rbp), %rax
movq %rax, -0x90(%rbp)
movq $0x2, -0x88(%rbp)
movq -0x90(%rbp), %rsi
movq -0x88(%rbp), %rdx
leaq -0x80(%rbp), %rdi
callq 0x227f0
movq -0x60(%rbp), %rdi
movq -0x80(%rbp), %rsi
callq 0x18170
movl $0x1f, -0xb4(%rbp)
leaq -0xb4(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq $0x1, -0xa8(%rbp)
movq -0xb0(%rbp), %rsi
movq -0xa8(%rbp), %rdx
leaq -0xa0(%rbp), %rdi
callq 0x227f0
leaq 0x2ac31(%rip), %rax     # 0x4b6b0
movl (%rax), %esi
leaq -0xa0(%rbp), %rdi
callq 0x18b40
xorb $-0x1, %al
testb $0x1, %al
jne 0x20a95
jmp 0x20a9f
callq 0x2e050
jmp 0x20ea9
jmp 0x20aa1
callq 0x2e050
leaq -0xd8(%rbp), %rdi
movq %rdi, -0x1f0(%rbp)
callq 0x3450
movq -0x1f0(%rbp), %rdi
leaq -0xdc(%rbp), %rsi
callq 0x1f630
jmp 0x20ace
cmpl $0x1, -0xdc(%rbp)
je 0x20b7a
leaq -0x101(%rbp), %rdi
movq %rdi, -0x1f8(%rbp)
callq 0x3570
movq -0x1f8(%rbp), %rdx
leaq 0x14c90(%rip), %rsi     # 0x3578c
leaq -0x100(%rbp), %rdi
callq 0x3440
jmp 0x20b0a
leaq -0x100(%rbp), %rdi
callq 0x18620
jmp 0x20b18
leaq -0x100(%rbp), %rdi
callq 0x35e8
leaq -0x101(%rbp), %rdi
callq 0x3370
jmp 0x20b7a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x20eb2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x20b69
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x100(%rbp), %rdi
callq 0x35e8
leaq -0x101(%rbp), %rdi
callq 0x3370
jmp 0x20eb2
leaq -0xd8(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x27780
movb %al, -0x1f9(%rbp)
jmp 0x20b95
movb -0x1f9(%rbp), %al
testb $0x1, %al
jne 0x20ba4
jmp 0x20c4e
cmpl $0x0, -0x108(%rbp)
jl 0x20bc0
movl -0x108(%rbp), %eax
movq -0x20(%rbp), %rcx
cmpl 0xc(%rcx), %eax
jl 0x20c4e
leaq -0x129(%rbp), %rdi
movq %rdi, -0x208(%rbp)
callq 0x3570
movq -0x208(%rbp), %rdx
leaq 0x14bcc(%rip), %rsi     # 0x357ad
leaq -0x128(%rbp), %rdi
callq 0x3440
jmp 0x20bef
leaq -0x128(%rbp), %rdi
callq 0x18620
jmp 0x20bfd
leaq -0x128(%rbp), %rdi
callq 0x35e8
leaq -0x129(%rbp), %rdi
callq 0x3370
jmp 0x20c4e
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x20c3d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x128(%rbp), %rdi
callq 0x35e8
leaq -0x129(%rbp), %rdi
callq 0x3370
jmp 0x20eb2
leaq -0x150(%rbp), %rdi
callq 0x271d0
jmp 0x20c5c
movq -0x8(%rbp), %rdi
leaq -0x150(%rbp), %rsi
movq %rsi, -0x220(%rbp)
callq 0x33d0
movq -0x220(%rbp), %rdi
callq 0x35e8
movq -0x20(%rbp), %rax
movl 0x8(%rax), %ecx
movq -0x10(%rbp), %rax
movl %ecx, (%rax)
movl $0x17, -0x154(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
subl $0x1, %eax
leaq 0x14b03(%rip), %rcx     # 0x357a9
leaq 0x14406(%rip), %rax     # 0x350b3
cmoveq %rcx, %rax
movq %rax, -0x218(%rbp)
leaq -0x179(%rbp), %rdi
movq %rdi, -0x210(%rbp)
callq 0x3570
movq -0x218(%rbp), %rsi
movq -0x210(%rbp), %rdx
leaq -0x178(%rbp), %rdi
callq 0x3440
jmp 0x20ce7
movq -0x8(%rbp), %rdx
leaq 0x2630e(%rip), %rcx     # 0x47000
leaq -0x154(%rbp), %rdi
leaq -0x178(%rbp), %rsi
callq 0x26340
jmp 0x20d07
leaq -0x178(%rbp), %rdi
callq 0x35e8
leaq -0x179(%rbp), %rdi
callq 0x3370
movl $0xe, -0x180(%rbp)
movq -0x18(%rbp), %rsi
movq -0x8(%rbp), %rcx
leaq -0x180(%rbp), %rdi
leaq -0xd8(%rbp), %rdx
callq 0x26340
jmp 0x20d46
jmp 0x20d48
movl $0x20, -0x19c(%rbp)
leaq -0x19c(%rbp), %rax
movq %rax, -0x198(%rbp)
movq $0x1, -0x190(%rbp)
movq -0x198(%rbp), %rsi
movq -0x190(%rbp), %rdx
leaq -0x188(%rbp), %rdi
callq 0x227f0
jmp 0x20d87
movl $0x22, -0x1c0(%rbp)
movl $0x26, -0x1bc(%rbp)
leaq -0x1c0(%rbp), %rax
movq %rax, -0x1b8(%rbp)
movq $0x2, -0x1b0(%rbp)
movq -0x1b8(%rbp), %rsi
movq -0x1b0(%rbp), %rdx
leaq -0x1a8(%rbp), %rdi
callq 0x227f0
jmp 0x20dd0
movq -0x188(%rbp), %rdi
movq -0x1a8(%rbp), %rsi
callq 0x18170
jmp 0x20de5
movl $0x20, -0x1dc(%rbp)
leaq -0x1dc(%rbp), %rax
movq %rax, -0x1d8(%rbp)
movq $0x1, -0x1d0(%rbp)
movq -0x1d8(%rbp), %rsi
movq -0x1d0(%rbp), %rdx
leaq -0x1c8(%rbp), %rdi
callq 0x227f0
jmp 0x20e24
leaq 0x2a885(%rip), %rax     # 0x4b6b0
movl (%rax), %esi
leaq -0x1c8(%rbp), %rdi
callq 0x18b40
xorb $-0x1, %al
testb $0x1, %al
jne 0x20e41
jmp 0x20e88
callq 0x2e050
jmp 0x20e48
movl $0x1, -0x1e0(%rbp)
jmp 0x20e9d
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
jmp 0x20e7a
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x50(%rbp)
movl %eax, -0x54(%rbp)
leaq -0x178(%rbp), %rdi
callq 0x35e8
leaq -0x179(%rbp), %rdi
callq 0x3370
jmp 0x20eb2
jmp 0x20e8a
jmp 0x20e8c
callq 0x2e050
jmp 0x20e93
movl $0x0, -0x1e0(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x35e8
addq $0x220, %rsp            # imm = 0x220
popq %rbp
retq
leaq -0xd8(%rbp), %rdi
callq 0x35e8
movq -0x50(%rbp), %rdi
callq 0x3560
nopw (%rax,%rax)