// File: /workspace/github_c_makefile_star2_O1/takoeight0821[P]hoc_nyan/src/emit.c
// Function: emit_x86
void emit_x86(Program* prog) {
  puts(".intel_syntax noprefix");

  puts(".data");
  for (GVar* gvar = prog->globals; gvar != NULL; gvar = gvar->next) {
    if (gvar->init != NULL && !gvar->is_extern) {
      printf("%s:\n", gvar->name);
      emit_const(gvar->type, gvar->init);
    } else if (gvar->inits != NULL && !gvar->is_extern) {
      printf("%s:\n", gvar->name);
      for (size_t i = 0; i < gvar->inits->length; i++) {
        emit_const(gvar->type->ptr_to, gvar->inits->ptr[i]);
      }
    }
  }

  puts(".bss");
  for (GVar* gvar = prog->globals; gvar != NULL; gvar = gvar->next) {
    if (gvar->init == NULL && gvar->inits == NULL && !gvar->is_extern) {
      printf("%s:\n", gvar->name);
      emit(".zero %zu", size_of(gvar->type));
    }
  }

  puts(".text");
  for (size_t i = 0; i < prog->funcs->length; i++) {
    emit_function(prog->funcs->ptr[i]);
  }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
leaq 0xa743(%rip), %rdi      # 0xe148
callq 0x2050
leaq 0xb3aa(%rip), %rdi      # 0xedbb
callq 0x2050
movq %rbx, (%rsp)
movq 0x8(%rbx), %rbx
testq %rbx, %rbx
je 0x3aaa
leaq 0xa731(%rip), %r14      # 0xe15f
cmpq $0x0, 0x18(%rbx)
je 0x3a3b
cmpb $0x0, 0x28(%rbx)
je 0x3a87
cmpq $0x0, 0x20(%rbx)
je 0x3aa2
cmpb $0x0, 0x28(%rbx)
jne 0x3aa2
movq 0x8(%rbx), %rsi
movq %r14, %rdi
xorl %eax, %eax
callq 0x20a0
movq 0x20(%rbx), %rax
cmpq $0x0, 0x10(%rax)
je 0x3aa2
xorl %r15d, %r15d
movq 0x10(%rbx), %rcx
movq 0x18(%rcx), %rdi
movq (%rax), %rax
movq (%rax,%r15,8), %rsi
callq 0x3dc3
incq %r15
movq 0x20(%rbx), %rax
cmpq 0x10(%rax), %r15
jb 0x3a64
jmp 0x3aa2
movq 0x8(%rbx), %rsi
movq %r14, %rdi
xorl %eax, %eax
callq 0x20a0
movq 0x10(%rbx), %rdi
movq 0x18(%rbx), %rsi
callq 0x3dc3
movq (%rbx), %rbx
testq %rbx, %rbx
jne 0x3a2e
leaq 0xb318(%rip), %rdi      # 0xedc9
callq 0x2050
movq (%rsp), %rax
movq 0x8(%rax), %rbx
testq %rbx, %rbx
je 0x3b11
leaq 0xa695(%rip), %r14      # 0xe15f
leaq 0xa693(%rip), %r15      # 0xe164
cmpq $0x0, 0x18(%rbx)
jne 0x3b09
cmpq $0x0, 0x20(%rbx)
jne 0x3b09
cmpb $0x0, 0x28(%rbx)
jne 0x3b09
movq 0x8(%rbx), %rsi
movq %r14, %rdi
xorl %eax, %eax
callq 0x20a0
movq 0x10(%rbx), %rdi
callq 0x9c8c
movq %r15, %rdi
movq %rax, %rsi
xorl %eax, %eax
callq 0x3ebd
movq (%rbx), %rbx
testq %rbx, %rbx
jne 0x3ad1
leaq 0xb2c7(%rip), %rdi      # 0xeddf
callq 0x2050
movq (%rsp), %rax
movq (%rax), %rax
cmpq $0x0, 0x10(%rax)
je 0x3db4
leaq 0xa629(%rip), %r14      # 0xe15f
xorl %ebx, %ebx
movq (%rax), %rax
movq (%rax,%rbx,8), %r12
leaq 0xa6a3(%rip), %rdi      # 0xe1e9
xorl %eax, %eax
callq 0x3f68
cmpq $0x0, 0x10(%r12)
je 0x3d84
movl 0xf5b1(%rip), %edx      # 0x13110
leal 0x1(%rdx), %eax
movl %eax, 0xf5a8(%rip)      # 0x13110
leaq 0xa6e0(%rip), %rdi      # 0xe24f
leaq 0xa699(%rip), %rsi      # 0xe20f
xorl %eax, %eax
callq 0xd7f2
movq %rax, 0xf584(%rip)      # 0x13108
cmpb $0x0, 0x28(%r12)
jne 0x3b9e
movq (%r12), %rsi
leaq 0xa67c(%rip), %rdi      # 0xe213
xorl %eax, %eax
callq 0x20a0
movq (%r12), %rsi
movq %r14, %rdi
xorl %eax, %eax
callq 0x20a0
leaq 0xa66c(%rip), %rdi      # 0xe21f
xorl %eax, %eax
callq 0x3ebd
leaq 0xa667(%rip), %rdi      # 0xe228
xorl %eax, %eax
callq 0x3ebd
cmpb $0x1, 0x29(%r12)
jne 0x3cb9
movq 0x18(%r12), %rax
movl 0x10(%rax), %eax
movl %eax, 0xf532(%rip)      # 0x13114
leaq 0xa66d(%rip), %rdi      # 0xe256
movl $0xb0, %esi
xorl %eax, %eax
callq 0x3ebd
leaq 0xa666(%rip), %rdi      # 0xe262
xorl %eax, %eax
callq 0x3ebd
leaq 0xa667(%rip), %rdi      # 0xe271
xorl %eax, %eax
callq 0x3ebd
leaq 0xa66c(%rip), %rdi      # 0xe284
xorl %eax, %eax
callq 0x3ebd
leaq 0xa672(%rip), %rdi      # 0xe298
xorl %eax, %eax
callq 0x3ebd
leaq 0xa678(%rip), %rdi      # 0xe2ac
xorl %eax, %eax
callq 0x3ebd
leaq 0xa67d(%rip), %rdi      # 0xe2bf
xorl %eax, %eax
callq 0x3ebd
leaq 0xa682(%rip), %rdi      # 0xe2d2
xorl %eax, %eax
callq 0x3ebd
leaq 0xa68c(%rip), %rdi      # 0xe2ea
xorl %eax, %eax
callq 0x3ebd
leaq 0xa696(%rip), %rdi      # 0xe302
xorl %eax, %eax
callq 0x3ebd
leaq 0xa6a0(%rip), %rdi      # 0xe31a
xorl %eax, %eax
callq 0x3ebd
leaq 0xa6aa(%rip), %rdi      # 0xe332
xorl %eax, %eax
callq 0x3ebd
leaq 0xa6b5(%rip), %rdi      # 0xe34b
xorl %eax, %eax
callq 0x3ebd
leaq 0xa6c0(%rip), %rdi      # 0xe364
xorl %eax, %eax
callq 0x3ebd
leaq 0xa6cb(%rip), %rdi      # 0xe37d
xorl %eax, %eax
callq 0x3ebd
movq 0x20(%r12), %rsi
leaq 0xa570(%rip), %rdi      # 0xe235
xorl %eax, %eax
callq 0x3ebd
movq 0x18(%r12), %rax
cmpq $0x0, 0x10(%rax)
je 0x3d44
leaq 0xa451(%rip), %r15      # 0xe130
xorl %r14d, %r14d
movq (%rax), %rax
movq (%rax,%r14,8), %r13
movq %r13, %rdi
callq 0x4017
movl (%r15), %ebp
movq 0x10(%r13), %rdi
callq 0x9c8c
leaq 0xecdc(%rip), %rcx      # 0x129e0
cmpq $0x4, %rax
je 0x3d11
leaq 0xec2f(%rip), %rcx      # 0x12940
cmpq $0x1, %rax
leaq 0xec74(%rip), %rax      # 0x12990
cmoveq %rax, %rcx
movq (%rcx,%rbp,8), %rsi
leaq 0xa6ac(%rip), %rdi      # 0xe3d7
xorl %eax, %eax
callq 0x3ebd
incq %r14
movq 0x18(%r12), %rax
addq $0x4, %r15
cmpq 0x10(%rax), %r14
jb 0x3ce2
movq 0x10(%r12), %rdi
callq 0x4067
movq 0xf3b3(%rip), %rsi      # 0x13108
leaq 0xa403(%rip), %r14      # 0xe15f
movq %r14, %rdi
xorl %eax, %eax
callq 0x20a0
leaq 0xa4d5(%rip), %rdi      # 0xe242
xorl %eax, %eax
callq 0x3ebd
leaq 0xa4cd(%rip), %rdi      # 0xe248
xorl %eax, %eax
callq 0x3ebd
jmp 0x3d92
leaq 0xa46d(%rip), %rdi      # 0xe1f8
xorl %eax, %eax
callq 0x3f68
leaq 0xa469(%rip), %rdi      # 0xe202
xorl %eax, %eax
callq 0x3f68
incq %rbx
movq (%rsp), %rax
movq (%rax), %rax
cmpq 0x10(%rax), %rbx
jb 0x3b38
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq