// File: /workspace/github_c_makefile_star2_O1/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 %r12
pushq %rbx
pushq %rax
movq %rsi, %r15
movq %rdi, %r14
xorl %ebx, %ebx
leaq 0x6844(%rip), %r12      # 0xc594
movl (%r14), %eax
decl %eax
cmpl $0x2f, %eax
ja 0x608f
movslq (%r12,%rax,4), %rax
addq %r12, %rax
jmpq *%rax
movq 0x20(%r14), %r14
xorl %r15d, %r15d
jmp 0x5d50
movq 0x38(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
testq %rax, %rax
je 0x5d89
movq 0x40(%r14), %r14
xorl %r15d, %r15d
jmp 0x5d50
movq 0x48(%r14), %r14
xorl %r15d, %r15d
jmp 0x5d50
movq 0x18(%r14), %rdi
xorl %r15d, %r15d
xorl %esi, %esi
callq 0x5d39
movq 0x20(%r14), %r14
addq %rax, %rbx
jmp 0x5d50
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movl $0x1, %r15d
testq %rax, %rax
jne 0x6019
jmp 0x5e80
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %rcx
movq %r15, %rax
cqto
idivq %rcx
addq %rdx, %rbx
jmp 0x6080
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
xorl %ecx, %ecx
cmpq %rax, %r15
setle %cl
jmp 0x5ff3
movq 0x18(%r14), %rdi
movq %r15, %rsi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
addq %r15, %rax
jmp 0x607d
testq %r15, %r15
je 0x609d
cmpq $0x0, (%r15)
jne 0x609d
movq 0x18(%r14), %rax
cmpl $0x17, (%rax)
jne 0x609d
movq 0x18(%r14), %rax
movq 0x78(%rax), %rax
jmp 0x5fc1
movq 0x18(%r14), %rdi
xorl %r15d, %r15d
xorl %esi, %esi
callq 0x5d39
testq %rax, %rax
je 0x6019
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
cmpq $0x1, %rax
sbbq $-0x1, %rbx
jmp 0x6080
movq 0x18(%r14), %rdi
xorl %esi, %esi
jmp 0x5ecd
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
xorl %ecx, %ecx
cmpq %rax, %r15
setl %cl
jmp 0x5ff3
movq 0x18(%r14), %rdi
movq %r15, %rsi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
subq %rax, %r15
jmp 0x6019
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %rcx
movq %r15, %rax
cqto
idivq %rcx
jmp 0x607d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
imulq %r15, %rax
jmp 0x607d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
xorq %r15, %rax
jmp 0x607d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movl %eax, %ecx
sarq %cl, %r15
jmp 0x6019
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
xorl %ecx, %ecx
cmpq %rax, %r15
sete %cl
jmp 0x5ff3
testq %r15, %r15
je 0x60b4
cmpq $0x0, (%r15)
jne 0x60b4
movq 0x78(%r14), %rax
movq (%rax), %rax
cmpl $0x8, (%rax)
jne 0x60b4
movq 0x78(%r14), %rax
movq %rax, (%r15)
xorl %r15d, %r15d
jmp 0x6019
movq 0x80(%r14), %r15
jmp 0x6019
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
xorl %ecx, %ecx
cmpq %rax, %r15
setne %cl
addq %rcx, %rbx
jmp 0x6080
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movl %eax, %ecx
shlq %cl, %r15
addq %r15, %rbx
jmp 0x6080
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
cmpq $0x1, %rax
adcq $0x0, %rbx
jmp 0x6080
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
orq %r15, %rax
jmp 0x607d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
notq %rax
jmp 0x607d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5d39
andq %r15, %rax
addq %rax, %rbx
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x67f0(%rip), %rdi      # 0xc886
xorl %eax, %eax
callq 0x4a3b
leaq 0xa3dc(%rip), %rax      # 0x10480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x67a3(%rip), %rsi      # 0xc855
jmp 0x60c9
leaq 0xa3c5(%rip), %rax      # 0x10480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x67a5(%rip), %rsi      # 0xc86e
xorl %eax, %eax
callq 0x487c