// File: /workspace/github_c_makefile_star2_O0/takoeight0821[P]hoc_nyan/src/gen_x86.c
// Function: gen_x86
void gen_x86(IProgram* prog) {
  for (GVar* gvar = prog->globals; gvar != NULL; gvar = gvar->next) {
    if (gvar->is_extern) {
      printf("extern %s\n", gvar->name);
    }
  }

  puts("section .data");
  for (GVar* gvar = prog->globals; gvar != NULL; gvar = gvar->next) {
    if (gvar->init && !gvar->is_extern) {
      printf("%s:\n", gvar->name);
      emit_const(gvar->type, gvar->init);
    } else if (gvar->inits && !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("section .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("resb %zu", size_of(gvar->type));
    }
  }

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

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x10(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0x778e
movq -0x10(%rbp), %rax
testb $0x1, 0x28(%rax)
je 0x777f
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xb640(%rip), %rdi      # 0x12db8
movb $0x0, %al
callq 0x2090
jmp 0x7781
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x10(%rbp)
jmp 0x7758
leaq 0xb62e(%rip), %rdi      # 0x12dc3
callq 0x2040
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x18(%rbp)
cmpq $0x0, -0x18(%rbp)
je 0x7880
movq -0x18(%rbp), %rax
cmpq $0x0, 0x18(%rax)
je 0x77f3
movq -0x18(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x77f3
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xa95e(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x18(%rbp), %rax
movq 0x18(%rax), %rsi
callq 0x7960
jmp 0x786e
movq -0x18(%rbp), %rax
cmpq $0x0, 0x20(%rax)
je 0x786c
movq -0x18(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x786c
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xa91c(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq $0x0, -0x20(%rbp)
movq -0x20(%rbp), %rax
movq -0x18(%rbp), %rcx
movq 0x20(%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x786a
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rax
movq 0x20(%rax), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rsi
callq 0x7960
movq -0x20(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x20(%rbp)
jmp 0x7826
jmp 0x786c
jmp 0x786e
jmp 0x7870
movq -0x18(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
jmp 0x77a6
leaq 0xb54a(%rip), %rdi      # 0x12dd1
callq 0x2040
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x28(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x7902
movq -0x28(%rbp), %rax
cmpq $0x0, 0x18(%rax)
jne 0x78f3
movq -0x28(%rbp), %rax
cmpq $0x0, 0x20(%rax)
jne 0x78f3
movq -0x28(%rbp), %rax
testb $0x1, 0x28(%rax)
jne 0x78f3
movq -0x28(%rbp), %rax
movq 0x8(%rax), %rsi
leaq 0xa865(%rip), %rdi      # 0x12133
movb $0x0, %al
callq 0x2090
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rdi
callq 0x9d60
movq %rax, %rsi
leaq 0xb4f2(%rip), %rdi      # 0x12dde
movb $0x0, %al
callq 0x7ae0
jmp 0x78f5
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x28(%rbp)
jmp 0x7898
leaq 0xb4de(%rip), %rdi      # 0x12de7
callq 0x2040
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
movq -0x8(%rbp), %rcx
movq (%rcx), %rcx
cmpq 0x10(%rcx), %rax
jae 0x794c
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x7ba0
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
jmp 0x7916
addq $0x30, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)