// File: /workspace/github_c_makefile_star2_O3/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 0x6159
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 0x6110
movq %rax, %r14
movq %rbx, 0x20(%rsp)
xorl %eax, %eax
callq 0x307c
movq %rax, 0x18(%rbp)
movq %rax, 0xd153(%rip)      # 0x13120
movl 0xd155(%rip), %edx      # 0x13128
leaq 0x8c00(%rip), %rdi      # 0xebda
leaq 0x8bf3(%rip), %rsi      # 0xebd4
xorl %eax, %eax
callq 0xd86a
incl 0xd13a(%rip)            # 0x13128
movq %rax, 0x20(%rbp)
movq %rax, %rdi
callq 0x616d
movq 0x18(%r15), %rax
cmpq $0x0, 0x10(%rax)
je 0x60fd
xorl %ebx, %ebx
movq (%rax), %rax
movq (%rax,%rbx,8), %r13
movq %r13, %rdi
callq 0x9d62
movq %rax, %rdi
callq 0x9bf4
movq %rax, %r12
movl $0x12, %edi
callq 0x8c14
movl %r12d, 0x4(%rax)
movq 0xd0f6(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30ae
movl $0x1, %edi
movl $0x20, %esi
callq 0x20f0
movq %rax, %r12
movl 0xd0da(%rip), %eax      # 0x13138
leal 0x1(%rax), %ecx
movl %ecx, 0xd0d1(%rip)      # 0x13138
movl %eax, 0x4(%r12)
movq $0x8, 0x8(%r12)
movl 0x48(%r13), %r13d
movl $0x11, %edi
callq 0x8c14
movq %r12, 0x10(%rax)
movl %r13d, 0x4(%rax)
movq 0xd09e(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30ae
movq 0x18(%r15), %rax
movq (%rax), %rax
movq (%rax,%rbx,8), %rdi
callq 0x9d62
movq %rax, %rdi
callq 0x9bf4
movq %rax, %r13
movl $0x14, %edi
callq 0x8c14
movq %r12, 0x18(%rax)
movl %ebx, 0x4(%rax)
movq %r13, 0x8(%rax)
movq 0xd05b(%rip), %rcx      # 0x13130
movq 0x8(%rcx), %rdi
movq %rax, %rsi
callq 0x30ae
movq %r14, %rdi
movq %r12, %rsi
callq 0x30ae
incq %rbx
movq 0x18(%r15), %rax
cmpq %rbx, 0x10(%rax)
ja 0x600b
movq 0x10(%r15), %rdi
callq 0x61b2
movq 0x10(%rsp), %r12
movq 0x20(%rsp), %rbx
movq (%r15), %rsi
movq %r12, %rdi
callq 0x5e78
testq %rax, %rax
je 0x6139
movq 0x20(%rbp), %rcx
movq %rcx, 0x20(%rax)
movups (%rbp), %xmm0
movups 0x10(%rbp), %xmm1
movups %xmm1, 0x10(%rax)
movups %xmm0, (%rax)
jmp 0x6144
movq %r12, %rdi
movq %rbp, %rsi
callq 0x30ae
incq %rbx
movq 0x18(%rsp), %rax
movq (%rax), %rax
cmpq %rbx, 0x10(%rax)
ja 0x5f6f
movq 0x8(%rsp), %rax
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq