// File: /workspace/github_c_makefile_star2_O0/sisshiki1969[P]monocc/src/codegen.c
// Function: gen_call
void gen_call(Node *node) {
  // function call
  // kind: ND_CALL
  // lhs: callee (ND_IDENT)
  // nodes: vector of arguments
  // token: Token *token
  // type: return type of callee
  // TODO: Currently, only ND_IDENT is allowed as a callee.
  int len = vec_len(node->nodes);
  Node **args = node->nodes->data;
  for (int i = len - 1; i >= 0; i--) {
    gen(args[i]);
  }
  for (int i = 0; i < len; i++) {
    fprintf(output, "\tpop  %s\n", registers[0][i]);
  }
  Token *name;
  if (node->lhs->kind == ND_IDENT) {
    name = node->lhs->token;
    if (cmp_token_str(name, "__builtin_va_start")) {
      builtin_va_start(node);
      return;
    }
  } else {
    error_at_node(node->lhs, "Currently, callee must be function designator.");
  }

  char *label1 = new_label();
  char *label2 = new_label();
  fprintf(output, "\tmov  rax, rsp\n");
  fprintf(output, "\tand  rax, 15\n");
  fprintf(output, "\tjnz  %s\n", label1);
  fprintf(output, "\tmov  rax, 0\n");
  fprintf(output, "\tcall %.*s\n", name->len, name->str);
  emit_jmp(label2);

  emit_label(label1);
  fprintf(output, "\tsub  rsp, 8\n");
  fprintf(output, "\tmov  rax, 0\n");
  fprintf(output, "\tcall %.*s\n", name->len, name->str);
  fprintf(output, "\tadd  rsp, 8\n");

  emit_label(label2);
  fprintf(output, "\tpush rax\n");
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rdi
callq 0x4000
movl %eax, -0xc(%rbp)
movq -0x8(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x18(%rbp)
movl -0xc(%rbp), %eax
subl $0x1, %eax
movl %eax, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jl 0x2b06
movq -0x18(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movq (%rax,%rcx,8), %rdi
callq 0x1b50
movl -0x1c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x2ae4
movl $0x0, -0x20(%rbp)
movl -0x20(%rbp), %eax
cmpl -0xc(%rbp), %eax
jge 0x2b47
leaq 0x126f4(%rip), %rax     # 0x15210
movq (%rax), %rdi
movslq -0x20(%rbp), %rcx
leaq 0x125e6(%rip), %rax     # 0x15110
movq (%rax,%rcx,8), %rdx
leaq 0xc9ec(%rip), %rsi      # 0xf521
movb $0x0, %al
callq 0x10f0
movl -0x20(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rbp)
jmp 0x2b0d
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
cmpl $0x0, (%rax)
jne 0x2b8a
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq 0x50(%rax), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rdi
leaq 0xc9bc(%rip), %rsi      # 0xf52b
callq 0x7a50
testb $0x1, %al
jne 0x2b7a
jmp 0x2b88
movq -0x8(%rbp), %rdi
callq 0x2a00
jmp 0x2cdf
jmp 0x2ba0
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
leaq 0xc9a5(%rip), %rsi      # 0xf53e
movb $0x0, %al
callq 0x6040
callq 0x1330
movq %rax, -0x30(%rbp)
callq 0x1330
movq %rax, -0x38(%rbp)
leaq 0x12657(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc9aa(%rip), %rsi      # 0xf56d
movb $0x0, %al
callq 0x10f0
leaq 0x1263f(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc9a2(%rip), %rsi      # 0xf57d
movb $0x0, %al
callq 0x10f0
leaq 0x12627(%rip), %rax     # 0x15210
movq (%rax), %rdi
movq -0x30(%rbp), %rdx
leaq 0xc995(%rip), %rsi      # 0xf58c
movb $0x0, %al
callq 0x10f0
leaq 0x1260b(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc987(%rip), %rsi      # 0xf596
movb $0x0, %al
callq 0x10f0
leaq 0x125f3(%rip), %rax     # 0x15210
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movl 0x28(%rax), %edx
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
leaq 0xc96e(%rip), %rsi      # 0xf5a4
movb $0x0, %al
callq 0x10f0
movq -0x38(%rbp), %rdi
callq 0x13c0
movq -0x30(%rbp), %rdi
callq 0x1390
leaq 0x125ba(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc950(%rip), %rsi      # 0xf5b0
movb $0x0, %al
callq 0x10f0
leaq 0x125a2(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc91e(%rip), %rsi      # 0xf596
movb $0x0, %al
callq 0x10f0
leaq 0x1258a(%rip), %rax     # 0x15210
movq (%rax), %rdi
movq -0x28(%rbp), %rax
movl 0x28(%rax), %edx
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rcx
leaq 0xc905(%rip), %rsi      # 0xf5a4
movb $0x0, %al
callq 0x10f0
leaq 0x12563(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc907(%rip), %rsi      # 0xf5be
movb $0x0, %al
callq 0x10f0
movq -0x38(%rbp), %rdi
callq 0x1390
leaq 0x12542(%rip), %rax     # 0x15210
movq (%rax), %rdi
leaq 0xc651(%rip), %rsi      # 0xf329
movb $0x0, %al
callq 0x10f0
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)