// File: /workspace/github_c_makefile_star2_O3/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 %r13
pushq %r12
pushq %rbx
movq %rsi, %r15
movq %rdi, %r14
xorl %r12d, %r12d
leaq 0x6927(%rip), %r13      # 0xc594
xorl %ebx, %ebx
movl (%r14), %eax
decl %eax
cmpl $0x2f, %eax
ja 0x5fae
movslq (%r13,%rax,4), %rax
addq %r13, %rax
jmpq *%rax
movl $0x20, %eax
jmp 0x5ca9
movq 0x38(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorl %ecx, %ecx
testq %rax, %rax
sete %cl
leaq 0x40(,%rcx,8), %rax
movq (%r14,%rax), %r14
xorl %r15d, %r15d
jmp 0x5c6f
movq 0x18(%r14), %rdi
xorl %r15d, %r15d
xorl %esi, %esi
callq 0x5c54
movq 0x20(%r14), %r14
addq %rax, %rbx
jmp 0x5c6f
movq 0x18(%r14), %rdi
movq %r15, %rsi
callq 0x5c54
movq 0x20(%r14), %r14
addq %r12, %rbx
addq %rax, %rbx
xorl %r15d, %r15d
movq %rbx, %r12
jmp 0x5c6d
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorq %r15, %rax
jmp 0x5f76
testq %r15, %r15
je 0x5fbc
cmpq $0x0, (%r15)
jne 0x5fbc
movq 0x18(%r14), %rax
cmpl $0x17, (%rax)
jne 0x5fbc
movq 0x78(%rax), %rax
jmp 0x5f95
movq 0x18(%r14), %rdi
xorl %r15d, %r15d
xorl %esi, %esi
callq 0x5c54
testq %rax, %rax
jne 0x5d89
jmp 0x5f9b
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorl %ecx, %ecx
cmpq %rax, %r15
setl %cl
jmp 0x5f39
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movl $0x1, %r15d
testq %rax, %rax
jne 0x5f9b
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
cmpq $0x1, %rax
sbbq $-0x1, %rbx
addq %r12, %rbx
jmp 0x5fa1
movq 0x18(%r14), %rdi
movq %r15, %rsi
jmp 0x5dd9
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorl %ecx, %ecx
cmpq %rax, %r15
setle %cl
jmp 0x5f39
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
addq %rbx, %r15
subq %rax, %r15
addq %r12, %r15
movq %r15, %rbx
jmp 0x5fa1
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
imulq %r15, %rax
jmp 0x5f76
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %rcx
movq %r15, %rax
cqto
idivq %rcx
addq %r12, %rbx
addq %rdx, %rbx
jmp 0x5fa1
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %rcx
movq %r15, %rax
cqto
idivq %rcx
jmp 0x5f76
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorl %ecx, %ecx
cmpq %rax, %r15
sete %cl
jmp 0x5f39
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movl %eax, %ecx
sarq %cl, %r15
jmp 0x5f9b
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movl %eax, %ecx
shlq %cl, %r15
jmp 0x5f9b
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
cmpq $0x1, %rax
adcq %r12, %rbx
jmp 0x5fa1
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
orq %r15, %rax
jmp 0x5f76
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
xorl %ecx, %ecx
cmpq %rax, %r15
setne %cl
addq %r12, %rbx
addq %rcx, %rbx
jmp 0x5fa1
movq 0x80(%r14), %r15
jmp 0x5f9b
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
notq %rax
jmp 0x5f76
movq 0x18(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
movq %rax, %r15
movq 0x20(%r14), %rdi
xorl %esi, %esi
callq 0x5c54
andq %r15, %rax
addq %r12, %rbx
addq %rax, %rbx
jmp 0x5fa1
testq %r15, %r15
je 0x5fd3
cmpq $0x0, (%r15)
jne 0x5fd3
movq 0x78(%r14), %rax
movq (%rax), %rcx
cmpl $0x8, (%rcx)
jne 0x5fd3
movq %rax, (%r15)
xorl %r15d, %r15d
addq %r12, %rbx
addq %r15, %rbx
movq %rbx, %rax
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
leaq 0x6919(%rip), %rdi      # 0xc8ce
xorl %eax, %eax
callq 0x4a3b
leaq 0xa4bd(%rip), %rax      # 0x10480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x68cc(%rip), %rsi      # 0xc89d
jmp 0x5fe8
leaq 0xa4a6(%rip), %rax      # 0x10480
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x68ce(%rip), %rsi      # 0xc8b6
xorl %eax, %eax
callq 0x487c