// File: /workspace/github_c_makefile_star2_O0/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 %rbp
movq %rsp, %rbp
subq $0xb0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movl (%rax), %eax
decl %eax
movl %eax, %ecx
movq %rcx, -0x20(%rbp)
subl $0x2f, %eax
ja 0x802b
movq -0x20(%rbp), %rax
leaq 0x8a5b(%rip), %rcx      # 0x10520
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x28(%rbp), %rax
addq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x7a90
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x30(%rbp), %rax
addq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x7a90
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x38(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x40(%rbp), %rax
subq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x48(%rbp), %rax
imulq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x50(%rbp), %rax
cqto
idivq %rcx
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x58(%rbp), %rax
andq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x60(%rbp), %rax
orq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x68(%rbp), %rax
xorq %rcx, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x70(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x70(%rbp), %rax
shlq %cl, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x78(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x78(%rbp), %rax
sarq %cl, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x80(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x80(%rbp), %rax
cmpq %rcx, %rax
sete %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x88(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x88(%rbp), %rax
cmpq %rcx, %rax
setne %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x90(%rbp), %rax
cmpq %rcx, %rax
setl %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0x98(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0x98(%rbp), %rax
cmpq %rcx, %rax
setle %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x38(%rax), %rdi
callq 0x7a70
cmpq $0x0, %rax
je 0x7e1b
movq -0x10(%rbp), %rax
movq 0x40(%rax), %rdi
callq 0x7a70
movq %rax, -0xa0(%rbp)
jmp 0x7e2f
movq -0x10(%rbp), %rax
movq 0x48(%rax), %rdi
callq 0x7a70
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
cmpq $0x0, %rax
setne %al
xorb $-0x1, %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
xorq $-0x1, %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
xorl %eax, %eax
cmpq $0x0, %rcx
movb %al, -0xa1(%rbp)
je 0x7ecd
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
cmpq $0x0, %rax
setne %al
movb %al, -0xa1(%rbp)
movb -0xa1(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movb $0x1, %al
cmpq $0x0, %rcx
movb %al, -0xa2(%rbp)
jne 0x7f1b
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
cmpq $0x0, %rax
setne %al
movb %al, -0xa2(%rbp)
movb -0xa2(%rbp), %al
andb $0x1, %al
movzbl %al, %eax
cltq
movq %rax, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdi
callq 0x7a70
movq %rax, -0xb0(%rbp)
movq -0x10(%rbp), %rax
movq 0x20(%rax), %rdi
callq 0x7a70
movq %rax, %rcx
movq -0xb0(%rbp), %rax
cqto
idivq %rcx
movq %rdx, -0x8(%rbp)
jmp 0x8039
movq -0x10(%rbp), %rax
movq 0x80(%rax), %rax
movq %rax, -0x8(%rbp)
jmp 0x8039
cmpq $0x0, -0x18(%rbp)
je 0x7f9c
movq -0x18(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x7f9c
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
cmpl $0x17, (%rax)
je 0x7fb8
leaq 0xd62d(%rip), %rax      # 0x155d0
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x8841(%rip), %rsi      # 0x107f2
movb $0x0, %al
callq 0x6370
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq 0x78(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq $0x0, -0x8(%rbp)
jmp 0x8039
cmpq $0x0, -0x18(%rbp)
je 0x7ff6
movq -0x18(%rbp), %rax
cmpq $0x0, (%rax)
jne 0x7ff6
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq (%rax), %rax
cmpl $0x8, (%rax)
je 0x8012
leaq 0xd5d3(%rip), %rax      # 0x155d0
movq (%rax), %rax
movq 0x18(%rax), %rdi
leaq 0x8800(%rip), %rsi      # 0x1080b
movb $0x0, %al
callq 0x6370
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rcx
movq -0x18(%rbp), %rax
movq %rcx, (%rax)
movq $0x0, -0x8(%rbp)
jmp 0x8039
leaq 0x87f1(%rip), %rdi      # 0x10823
movb $0x0, %al
callq 0x65d0
movq -0x8(%rbp), %rax
addq $0xb0, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)