// File: /workspace/github_c_makefile_star2_O1/takoeight0821[P]hoc_nyan/src/gen_ir.c
// Function: gen_ir
IProgram* gen_ir(Program* program) {
  IProgram* ip = calloc(1, sizeof(IProgram));
  ip->globals = program->globals;
  ip->ifuncs = new_vec();

  for (int i = 0; i < program->funcs->length; i++) {
    Function* func = program->funcs->ptr[i];
    IFunc* ifunc = emit_func(func);

    // プロトタイプ宣言を上書きする。
    // gen_x86ですべてのプロトタイプ宣言を外部関数だと解釈する
    IFunc* proto = is_defined_proto(ip->ifuncs, func->name);
    if (proto) {
      memcpy(proto, ifunc, sizeof(IFunc));
    } else {
      vec_push(ip->ifuncs, ifunc);
    }
  }

  return ip;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movq %rdi, %rbx
movl $0x1, %edi
movl $0x10, %esi
callq 0x20f0
movq %rax, %r14
movq 0x8(%rbx), %rax
movq %rax, 0x8(%r14)
xorl %eax, %eax
callq 0x307c
movq %rax, %r12
movq %r14, 0x8(%rsp)
movq %rax, (%r14)
movq %rbx, 0x18(%rsp)
movq (%rbx), %rax
cmpq $0x0, 0x10(%rax)
je 0x617c
xorl %ebx, %ebx
movq %r12, 0x10(%rsp)
movq (%rax), %rax
movq (%rax,%rbx,8), %r15
movl $0x1, %edi
movl $0x28, %esi
callq 0x20f0
movq %rax, %rbp
movq (%r15), %rax
movq %rax, (%rbp)
movb 0x28(%r15), %al
movb %al, 0x8(%rbp)
movb 0x29(%r15), %al
movb %al, 0x9(%rbp)
xorl %eax, %eax
callq 0x307c
movq %rax, 0x10(%rbp)
cmpq $0x0, 0x10(%r15)
je 0x6133
movq %rax, %r14
movq %rbx, 0x20(%rsp)
xorl %eax, %eax
callq 0x307c
movq %rax, 0x18(%rbp)
movq %rax, 0xd139(%rip)      # 0x13120
movl 0xd13b(%rip), %edx      # 0x13128
leaq 0x8be6(%rip), %rdi      # 0xebda
leaq 0x8bd9(%rip), %rsi      # 0xebd4
xorl %eax, %eax
callq 0xd7f2
incl 0xd120(%rip)            # 0x13128
movq %rax, 0x20(%rbp)
movq %rax, %rdi
callq 0x61af
movq 0x18(%r15), %rax
cmpq $0x0, 0x10(%rax)
je 0x6120
xorl %ebx, %ebx
movq (%rax), %rax
movq (%rax,%rbx,8), %r13
movq %r13, %rdi
callq 0x9e0f
movq %rax, %rdi
callq 0x9c8c
movq %rax, %r12
movl $0x12, %edi
callq 0x8cb0
movl %r12d, 0x4(%rax)
movq 0xd0dc(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30b6
movl $0x1, %edi
movl $0x20, %esi
callq 0x20f0
movq %rax, %r12
movl 0xd0c0(%rip), %eax      # 0x13138
leal 0x1(%rax), %ecx
movl %ecx, 0xd0b7(%rip)      # 0x13138
movl %eax, 0x4(%r12)
movq $0x8, 0x8(%r12)
movl 0x48(%r13), %r13d
movl $0x11, %edi
callq 0x8cb0
movq %r12, 0x10(%rax)
movl %r13d, 0x4(%rax)
movq 0xd084(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30b6
movq 0x18(%r15), %rax
movq (%rax), %rax
movq (%rax,%rbx,8), %rdi
callq 0x9e0f
movq %rax, %rdi
callq 0x9c8c
testq %r12, %r12
je 0x6190
movq %rax, %r13
movl $0x14, %edi
callq 0x8cb0
movq %r12, 0x18(%rax)
movl %ebx, 0x4(%rax)
movq %r13, 0x8(%rax)
movq 0xd038(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30b6
movq %r14, %rdi
movq %r12, %rsi
callq 0x30b6
incq %rbx
movq 0x18(%r15), %rax
cmpq %rbx, 0x10(%rax)
ja 0x6025
movq 0x10(%r15), %rdi
callq 0x61f4
movq 0x10(%rsp), %r12
movq 0x20(%rsp), %rbx
movq (%r15), %rsi
movq %r12, %rdi
callq 0x5e78
testq %rax, %rax
je 0x615c
movq 0x20(%rbp), %rcx
movq %rcx, 0x20(%rax)
movups (%rbp), %xmm0
movups 0x10(%rbp), %xmm1
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
jmp 0x6167
movq %r12, %rdi
movq %rbp, %rsi
callq 0x30b6
incq %rbx
movq 0x18(%rsp), %rax
movq (%rax), %rax
cmpq %rbx, 0x10(%rax)
ja 0x5f89
movq 0x8(%rsp), %rax
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
leaq 0x8a4a(%rip), %rdi      # 0xebe1
leaq 0x8a47(%rip), %rsi      # 0xebe5
leaq 0x8a4d(%rip), %rcx      # 0xebf2
movl $0x60, %edx
callq 0x20c0