// File: /workspace/github_c_makefile_star2_O2/pocari[P]compilerbook-9cc/parser.c
// Function: eval2
static long eval2(Node *node, Var **var) {
  #pragma clang diagnostic ignored "-Wswitch"
  switch (node->kind) {
    case ND_ADD:
      return eval(node->lhs) + eval(node->rhs);
    case ND_PTR_ADD:
      return eval2(node->lhs, var) + eval(node->rhs);
    case ND_PTR_SUB:
      return eval2(node->lhs, var) - eval(node->rhs);
    case ND_SUB:
      return eval(node->lhs) - eval(node->rhs);
    case ND_MUL:
      return eval(node->lhs) * eval(node->rhs);
    case ND_DIV:
      return eval(node->lhs) / eval(node->rhs);
    case ND_BIT_AND:
      return eval(node->lhs) & eval(node->rhs);
    case ND_BIT_OR:
      return eval(node->lhs) | eval(node->rhs);
    case ND_BIT_XOR:
      return eval(node->lhs) ^ eval(node->rhs);
    case ND_A_LSHIFT:
      return eval(node->lhs) << eval(node->rhs);
    case ND_A_RSHIFT:
      return eval(node->lhs) >> eval(node->rhs);
    case ND_EQL:
      return eval(node->lhs) == eval(node->rhs);
    case ND_NOT_EQL:
      return eval(node->lhs) != eval(node->rhs);
    case ND_LT:
      return eval(node->lhs) < eval(node->rhs);
    case ND_LTE:
      return eval(node->lhs) <= eval(node->rhs);
    case ND_TERNARY:
      return eval(node->cond) ? eval(node->then) : eval(node->els);
    case ND_COMMA:
      return eval(node->rhs);
    case ND_NOT:
      return !eval(node->lhs);
    case ND_BIT_NOT:
      return ~eval(node->lhs);
    case ND_AND:
      return eval(node->lhs) && eval(node->rhs);
    case ND_OR:
      return eval(node->lhs) || eval(node->rhs);
    case ND_MOD:
      return eval(node->lhs) % eval(node->rhs);
    case ND_NUM:
      return node->val;
    case ND_ADDR:
      // ing gvar1[] = {1, 2}
      // int *gvar2 = &gvar1
      // のようなケースの2行目の&gvar1の処理
      // この場合、単にgvarの先頭アドレスが設定される
      //
      // 変数をついでに探さないモード(!var)か
      // 変数もついでに探すモード(*var) で、対象のノードが変数でなければエラー
      if (!var || *var || node->lhs->kind != ND_VAR) {
        error_at(token->str, "invalid addr initializer");
      }
      // 初期化式の中の変数をキャプチャする
      *var = node->lhs->var;
      return 0;
    case ND_VAR:
      // ing gvar1[] = {1, 2}
      // int *gvar2 = gvar1
      // のようなケースの2行目のgvar1の処理
      if (!var || *var || node->var->type->kind != TY_ARRAY) {
        error_at(token->str, "invalid var initializer");
      }
      *var = node->var;
      return 0;
  }
  #pragma clang diagnostic ignored "-Wreturn-type"
  error("定数式の計算のみ可能です");
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movl (%rdi), %eax
decl %eax
cmpl $0x2f, %eax
ja 0x5a37
movq %rdi, %rbx
leaq 0x4e6c(%rip), %rcx      # 0xa594
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x18(%rbx), %rdi
callq 0x5708
jmp 0x599b
movq 0x20(%rbx), %rdi
jmp 0x5a11
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %r14
orq %r15, %r14
jmp 0x5a04
testq %rsi, %rsi
je 0x5783
cmpq $0x0, (%rsi)
jne 0x5783
movq 0x78(%rbx), %rax
movq (%rax), %rcx
cmpl $0x8, (%rcx)
je 0x5896
leaq 0x9cf6(%rip), %rax      # 0xf480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x511e(%rip), %rsi      # 0xa8b6
jmp 0x5a30
movq 0x18(%rbx), %rdi
callq 0x5708
testq %rax, %rax
je 0x57fa
pushq $0x1
popq %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r14
notq %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %r14
andq %r15, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
testq %rax, %rax
je 0x5899
movq 0x20(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
testq %rax, %rax
jmp 0x5869
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
cmpq %rax, %r15
setle %r14b
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r14
movq 0x20(%rbx), %rdi
callq 0x5708
movl %eax, %ecx
shlq %cl, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
cmpq %rax, %r15
setne %r14b
jmp 0x5a04
testq %rsi, %rsi
je 0x5a1b
cmpq $0x0, (%rsi)
jne 0x5a1b
movq 0x18(%rbx), %rax
cmpl $0x17, (%rax)
jne 0x5a1b
movq 0x78(%rax), %rax
movq %rax, (%rsi)
xorl %r14d, %r14d
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r14
movq 0x20(%rbx), %rdi
callq 0x5708
movl %eax, %ecx
sarq %cl, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
cmpq %rax, %r15
jmp 0x59e3
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %r14
imulq %r15, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %r14
xorq %r15, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r14
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %rcx
movq %r14, %rax
cqto
idivq %rcx
movq %rax, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
jmp 0x5981
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
cmpq %rax, %r15
setl %r14b
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x570c
movq %rax, %r14
movq 0x20(%rbx), %rdi
callq 0x5708
subq %rax, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x570c
movq %rax, %r15
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %r14
addq %r15, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
movq %rax, %r14
movq 0x20(%rbx), %rdi
callq 0x5708
movq %rax, %rcx
movq %r14, %rax
cqto
idivq %rcx
movq %rdx, %r14
jmp 0x5a04
movq 0x18(%rbx), %rdi
callq 0x5708
xorl %r14d, %r14d
testq %rax, %rax
sete %r14b
jmp 0x5a04
movq 0x38(%rbx), %rdi
callq 0x5708
testq %rax, %rax
je 0x5a0d
movq 0x40(%rbx), %rdi
jmp 0x5a11
movq 0x80(%rbx), %r14
movq %r14, %rax
popq %rbx
popq %r14
popq %r15
retq
movq 0x48(%rbx), %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x5708
leaq 0x9a5e(%rip), %rax      # 0xf480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x4e6d(%rip), %rsi      # 0xa89d
xorl %eax, %eax
callq 0x46f0
leaq 0x4e90(%rip), %rdi      # 0xa8ce
xorl %eax, %eax
callq 0x485f