// File: /workspace/github_c_makefile_star2_O1/pocari[P]compilerbook-9cc/parser.c
// Function: assign
static Node *assign() {
  Node *node = ternary();
  Token *tk;

  // chibicc だと "=" 以外の +=, -=... 計の演算子は別途 ND_ADD_EQ のような専用のNode種別をつくって処理している
  // https://github.com/rui314/chibicc/commit/05e907d2b8a94103d60148ce90e27ca191ad5446
  // 難しかったので、簡単そうな i += x を構文木上 i = i + x に読み替える方式にしてみる。
  // ただそのせいで、左辺のnodeが複数のnodeで共有されてしまってfree_nodesのときに複数回freeしてしまってエラーになったので、
  // chibccに合わせて今回からastのfreeはやめる
  if (tk = consume("=")) {
    return new_bin_node(ND_ASSIGN, node, assign(), tk);
  } else if (tk = consume("+=")) {
    Node *n = new_add_node(node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("-=")) {
    Node *n = new_sub_node(node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("*=")) {
    Node *n = new_bin_node(ND_MUL, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("/=")) {
    Node *n = new_bin_node(ND_DIV, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("<<=")) {
    Node *n = new_bin_node(ND_A_LSHIFT, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume(">>=")) {
    Node *n = new_bin_node(ND_A_RSHIFT, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("|=")) {
    Node *n = new_bin_node(ND_BIT_OR, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("&=")) {
    Node *n = new_bin_node(ND_BIT_AND, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  } else if (tk = consume("^=")) {
    Node *n = new_bin_node(ND_BIT_XOR, node, assign(), tk);
    return new_bin_node(ND_ASSIGN, node, n, tk);
  }
  return node;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
callq 0x60d0
movq %rax, %rbx
leaq 0x4a3d(%rip), %rdi      # 0xc8b9
callq 0x5244
testb %al, %al
je 0x7e99
leaq 0x85f4(%rip), %rax      # 0x10480
movq (%rax), %r12
movq 0x8(%r12), %rcx
movq %rcx, (%rax)
jmp 0x7e9c
xorl %r12d, %r12d
testq %r12, %r12
je 0x7edd
callq 0x7e65
movq %rax, %r14
movl $0x1, %edi
movl $0xc8, %esi
callq 0x2100
movq %rax, %r15
movl $0x16, (%rax)
movq %r12, 0x8(%rax)
movq %rbx, 0x18(%rax)
movq %r14, 0x20(%rax)
movq %rax, %rdi
callq 0xa308
movq %r15, %rbx
jmp 0x7f8d
leaq 0x4a8b(%rip), %rdi      # 0xc96f
callq 0x5244
testb %al, %al
je 0x7f00
leaq 0x858c(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x7f03
xorl %r14d, %r14d
testq %r14, %r14
je 0x7f1d
callq 0x7e65
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x6787
jmp 0x7f5b
leaq 0x4a4e(%rip), %rdi      # 0xc972
callq 0x5244
testb %al, %al
je 0x7f40
leaq 0x854c(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x7f43
xorl %r14d, %r14d
testq %r14, %r14
je 0x7f9c
callq 0x7e65
movq %rbx, %rdi
movq %rax, %rsi
movq %r14, %rdx
callq 0x685d
movq %rax, %r15
movl $0x1, %edi
movl $0xc8, %esi
callq 0x2100
movq %rax, %r12
movl $0x16, (%rax)
movq %r14, 0x8(%rax)
movq %rbx, 0x18(%rax)
movq %r15, 0x20(%rax)
movq %rax, %rdi
callq 0xa308
movq %r12, %rbx
movq %rbx, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x49d2(%rip), %rdi      # 0xc975
callq 0x5244
testb %al, %al
je 0x7fc0
leaq 0x84cd(%rip), %rax      # 0x10480
movq (%rax), %r12
movq 0x8(%r12), %rcx
movq %rcx, (%rax)
jmp 0x7fc3
xorl %r12d, %r12d
testq %r12, %r12
je 0x8030
callq 0x7e65
movq %rax, %r14
movl $0x1, %edi
movl $0xc8, %esi
callq 0x2100
movq %rax, %r15
movl $0x6, (%rax)
movq %r12, 0x8(%rax)
movq %rbx, 0x18(%rax)
movq %r14, 0x20(%rax)
movq %rax, %rdi
callq 0xa308
movl $0x1, %edi
movl $0xc8, %esi
callq 0x2100
movq %rax, %r14
movl $0x16, (%rax)
movq %r12, 0x8(%rax)
movq %rbx, 0x18(%rax)
movq %r15, 0x20(%rax)
movq %rax, %rdi
callq 0xa308
movq %r14, %rbx
jmp 0x7f8d
leaq 0x4941(%rip), %rdi      # 0xc978
callq 0x5244
testb %al, %al
je 0x8053
leaq 0x8439(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x8056
xorl %r14d, %r14d
testq %r14, %r14
je 0x806a
callq 0x7e65
movl $0x7, %edi
jmp 0x8185
leaq 0x490a(%rip), %rdi      # 0xc97b
callq 0x5244
testb %al, %al
je 0x808d
leaq 0x83ff(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x8090
xorl %r14d, %r14d
testq %r14, %r14
je 0x80a4
callq 0x7e65
movl $0xf, %edi
jmp 0x8185
leaq 0x48d4(%rip), %rdi      # 0xc97f
callq 0x5244
testb %al, %al
je 0x80c7
leaq 0x83c5(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x80ca
xorl %r14d, %r14d
testq %r14, %r14
je 0x80de
callq 0x7e65
movl $0x10, %edi
jmp 0x8185
leaq 0x489e(%rip), %rdi      # 0xc983
callq 0x5244
testb %al, %al
je 0x8101
leaq 0x838b(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x8104
xorl %r14d, %r14d
testq %r14, %r14
je 0x8115
callq 0x7e65
movl $0xd, %edi
jmp 0x8185
leaq 0x486a(%rip), %rdi      # 0xc986
callq 0x5244
testb %al, %al
je 0x8138
leaq 0x8354(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x813b
xorl %r14d, %r14d
testq %r14, %r14
je 0x814c
callq 0x7e65
movl $0xe, %edi
jmp 0x8185
leaq 0x4836(%rip), %rdi      # 0xc989
callq 0x5244
testb %al, %al
je 0x816f
leaq 0x831d(%rip), %rax      # 0x10480
movq (%rax), %r14
movq 0x8(%r14), %rcx
movq %rcx, (%rax)
jmp 0x8172
xorl %r14d, %r14d
testq %r14, %r14
je 0x7f8d
callq 0x7e65
movl $0x11, %edi
movq %rbx, %rsi
movq %rax, %rdx
movq %r14, %rcx
callq 0x61c8
movl $0x16, %edi
movq %rbx, %rsi
movq %rax, %rdx
movq %r14, %rcx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
jmp 0x61c8