// File: fondoger[P]C0-Compiler/src/mips.cpp
// Function: gen_FUNC()
static void gen_FUNC()
{
    // mid-code format: FUNC, int|char|void, id
    assert((*m).op == FUNC);

    // generate label for function
    // (*m).b if the function name
    MIPS(T << (*m).b << ":"); 

    buildSymbolTable();
    assert((*m).op == FUNC);
    m++;

    indent();
    // allocate memory from stack
    MIPS(T << "addiu" << HT << "$sp, $sp, " << -cur_func_size);
    MIPS(T << "sw" << HT << "$ra, "<< (cur_func_size - 4) << "($sp)");

    while ((*m).op != END) {
        switch ((*m).op) {
            case ADD:
            case SUB: 
            case MUL:
            case DIV:   gen_ADD_SUB_MUL_DIV(*m); break;
            case WARRAY:
            case RARRAY:gen_RARRAY_WARRAY(*m); break;
            case PUSH:  gen_PUSH(*m); break;
            case CALL:  gen_CALL(*m); break;
            case WRITE: gen_WRITE(*m); break;
            case READ:  gen_READ(*m); break;
            case ASSIGN:gen_ASSIGN(*m); break;
            case GETRET:gen_GETRET(*m); break;
            case GOTO:  gen_GOTO(*m); break;
            case LABEL: gen_LABEL(*m); break;
            case RET:   gen_RET(*m); break;
            case COMPARE: gen_COMPARE(*m); break;
            case VAR:   break;
            case PARA:  break;
            case TEMP:  break;
            default:    MIPS(T << "unhandled:" << op2str[(*m).op]); break;
        }
        m++;
    }
    gen_END();

    unindent();
    m++;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
leaq 0x20b19(%rip), %rdi     # 0x4a7d8
callq 0x22e40
cmpl $0x5, (%rax)
jne 0x29ccb
jmp 0x29cea
leaq 0xc2ae(%rip), %rdi      # 0x35f80
leaq 0xc2b7(%rip), %rsi      # 0x35f90
movl $0xf4, %edx
leaq 0xc339(%rip), %rcx      # 0x3601e
callq 0x3230
leaq 0x20ae7(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rsi
addq $0x28, %rsi
leaq 0x2092c(%rip), %rdi     # 0x4a630
addq $0x10, %rdi
callq 0x32c0
movq %rax, %rdi
leaq 0xb503(%rip), %rsi      # 0x3521a
callq 0x3300
movq %rax, %rdi
callq 0x29270
callq 0x2a010
leaq 0x20aa8(%rip), %rdi     # 0x4a7d8
callq 0x22e40
cmpl $0x5, (%rax)
jne 0x29d3c
jmp 0x29d5b
leaq 0xc23d(%rip), %rdi      # 0x35f80
leaq 0xc246(%rip), %rsi      # 0x35f90
movl $0xfb, %edx
leaq 0xc2c8(%rip), %rcx      # 0x3601e
callq 0x3230
leaq 0x20a76(%rip), %rdi     # 0x4a7d8
xorl %esi, %esi
callq 0x2d2e0
movq %rax, -0x8(%rbp)
callq 0x29930
leaq 0x208b7(%rip), %rdi     # 0x4a630
addq $0x10, %rdi
leaq 0xc2aa(%rip), %rsi      # 0x3602e
callq 0x3300
movq %rax, %rdi
leaq 0xc261(%rip), %rsi      # 0x35ff4
callq 0x3300
movq %rax, %rdi
leaq 0xc292(%rip), %rsi      # 0x36034
callq 0x3300
movq %rax, %rdi
xorl %esi, %esi
subl 0x20a82(%rip), %esi     # 0x4a834
callq 0x3550
movq %rax, %rdi
callq 0x29270
leaq 0x2086a(%rip), %rdi     # 0x4a630
addq $0x10, %rdi
leaq 0xc1e4(%rip), %rsi      # 0x35fb5
callq 0x3300
movq %rax, %rdi
leaq 0xc214(%rip), %rsi      # 0x35ff4
callq 0x3300
movq %rax, %rdi
leaq 0xc250(%rip), %rsi      # 0x3603f
callq 0x3300
movq %rax, %rdi
movl 0x20a37(%rip), %esi     # 0x4a834
subl $0x4, %esi
callq 0x3550
movq %rax, %rdi
leaq 0xc236(%rip), %rsi      # 0x36045
callq 0x3300
movq %rax, %rdi
callq 0x29270
leaq 0x209b5(%rip), %rdi     # 0x4a7d8
callq 0x22e40
cmpl $0x12, (%rax)
je 0x29fe9
leaq 0x209a0(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movl (%rax), %eax
movq %rax, -0x20(%rbp)
subq $0x17, %rax
ja 0x29f8a
movq -0x20(%rbp), %rax
leaq 0xc0bc(%rip), %rcx      # 0x35f14
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
leaq 0x20970(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2a390
jmp 0x29fd2
leaq 0x20957(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2a910
jmp 0x29fd2
leaq 0x2093e(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b020
jmp 0x29fd2
leaq 0x20925(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b140
jmp 0x29fd2
leaq 0x2090c(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b1a0
jmp 0x29fd2
leaq 0x208f3(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b4a0
jmp 0x29fd2
leaq 0x208da(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b660
jmp 0x29fd2
leaq 0x208c1(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b780
jmp 0x29fd2
leaq 0x208a8(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b830
jmp 0x29fd2
leaq 0x2088f(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b880
jmp 0x29fd2
leaq 0x20879(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b8d0
jmp 0x29fd2
leaq 0x20863(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq %rax, %rdi
callq 0x2b990
jmp 0x29fd2
jmp 0x29fd2
jmp 0x29fd2
jmp 0x29fd2
leaq 0x2069f(%rip), %rdi     # 0x4a630
addq $0x10, %rdi
leaq 0xc0af(%rip), %rsi      # 0x3604b
callq 0x3300
movq %rax, -0x28(%rbp)
leaq 0x2082c(%rip), %rdi     # 0x4a7d8
callq 0x22e40
movq -0x28(%rbp), %rdi
movl (%rax), %eax
leaq 0x20332(%rip), %rsi     # 0x4a2f0
shlq $0x5, %rax
addq %rax, %rsi
callq 0x32c0
movq %rax, %rdi
callq 0x29270
leaq 0x207ff(%rip), %rdi     # 0x4a7d8
xorl %esi, %esi
callq 0x2d2e0
movq %rax, -0x10(%rbp)
jmp 0x29e1c
callq 0x2cea0
callq 0x29bc0
leaq 0x207de(%rip), %rdi     # 0x4a7d8
xorl %esi, %esi
callq 0x2d2e0
movq %rax, -0x18(%rbp)
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax,%rax)