// File: /workspace/github_c_makefile_star2_O0/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
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
leaq 0xf109(%rip), %rdi      # 0x1211c
callq 0x2040
leaq 0xfdac(%rip), %rdi      # 0x12dcb
callq 0x2040
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x310a
movq -0x10(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x307d
movq -0x10(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x307d
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xf0d4(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x31e0
jmp 0x30f8
movq -0x10(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0x30f6
movq -0x10(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x30f6
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xf092(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq $0x0, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq -0x10(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x30f4
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rax
movq -0x18(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x31e0
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
jmp 0x30b0
jmp 0x30f6
jmp 0x30f8
jmp 0x30fa
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x3030
leaq 0xfcc8(%rip), %rdi      # 0x12dd9
callq 0x2040
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x20(%rbp)
cmpq $0x0, -0x20(%rbp)
je 0x318c
movq -0x20(%rbp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x317d
movq -0x20(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x317d
movq -0x20(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x317d
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xefdb(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x9d60
movq %rax, %rsi
leaq 0xefc2(%rip), %rdi      # 0x12138
movb $0x0, %al
callq 0x3360
jmp 0x317f
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x20(%rbp)
jmp 0x3122
leaq 0xfc5c(%rip), %rdi      # 0x12def
callq 0x2040
movq $0x0, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x31d6
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x3420
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x31a0
addq $0x30, %rsp
popq %rbp
retq
nopl (%rax)