// File: /workspace/github_c_makefile_star2_O3/ejunjsh[P]mycc/gen.c
// Function: genAST
int genAST(struct ASTnode *n, int iflabel, int looptoplabel,
	   int loopendlabel, int parentASTop) {
  int leftreg = NOREG, rightreg = NOREG;

  // 空树，什么都不做
  if (n == NULL)
    return (NOREG);

  // 在输出中更新行号
  update_line(n);

  // 上面我们定义了一些语法树节点处理的函数，所以，如果遇到某些操作，就直接扔给相关函数处理即可
  switch (n->op) {
  case A_IF:
    return (genIF(n, looptoplabel, loopendlabel));
  case A_WHILE:
    return (genWHILE(n));
  case A_SWITCH:
    return (genSWITCH(n));
  case A_FUNCCALL:
    return (gen_funccall(n));
  case A_TERNARY:
    return (gen_ternary(n));
  case A_LOGOR:
    return (gen_logandor(n));
  case A_LOGAND:
    return (gen_logandor(n));
  case A_GLUE:
    // 执行每个子语句，然后释放所有寄存器
    if (n->left != NULL)
      genAST(n->left, iflabel, looptoplabel, loopendlabel, n->op);
    genfreeregs(NOREG);
    if (n->right != NULL)
      genAST(n->right, iflabel, looptoplabel, loopendlabel, n->op);
    genfreeregs(NOREG);
    return (NOREG);
  case A_FUNCTION:
    // 生成函数的前置汇编，然会再到子树的汇编
    cgfuncpreamble(n->sym);
    genAST(n->left, NOLABEL, NOLABEL, NOLABEL, n->op);
    cgfuncpostamble(n->sym);
    return (NOREG);
  }

  // 下面是通用语法树处理

  // 获得左树和右数的值
  if (n->left)
    leftreg = genAST(n->left, NOLABEL, NOLABEL, NOLABEL, n->op);
  if (n->right)
    rightreg = genAST(n->right, NOLABEL, NOLABEL, NOLABEL, n->op);

  switch (n->op) {
  case A_ADD:
    return (cgadd(leftreg, rightreg));
  case A_SUBTRACT:
    return (cgsub(leftreg, rightreg));
  case A_MULTIPLY:
    return (cgmul(leftreg, rightreg));
  case A_DIVIDE:
    return (cgdivmod(leftreg, rightreg, A_DIVIDE));
  case A_MOD:
    return (cgdivmod(leftreg, rightreg, A_MOD));
  case A_AND:
    return (cgand(leftreg, rightreg));
  case A_OR:
    return (cgor(leftreg, rightreg));
  case A_XOR:
    return (cgxor(leftreg, rightreg));
  case A_LSHIFT:
    return (cgshl(leftreg, rightreg));
  case A_RSHIFT:
    return (cgshr(leftreg, rightreg));
  case A_EQ:
  case A_NE:
  case A_LT:
  case A_GT:
  case A_LE:
  case A_GE:
    // 如果父节点是A_IF, A_WHILE 或者 A_TERNARY，
    // 生成比较和跳转的代码，否则比较寄存器，然后根据比较结果设置其中一个寄存器的值为1或0
    if (parentASTop == A_IF || parentASTop == A_WHILE || parentASTop == A_TERNARY)
      return (cgcompare_and_jump(n->op, leftreg, rightreg, iflabel, n->left->type));
    else
      return (cgcompare_and_set(n->op, leftreg, rightreg, n->left->type));
  case A_INTLIT:
    return (cgloadint(n->atu.a_intvalue, n->type));
  case A_STRLIT:
    return (cgloadglobstr(n->atu.a_intvalue));
  case A_IDENT:
    // 如果是右值或者是解引用，则加载值
    if (n->rvalue || parentASTop == A_DEREF) {
      return (cgloadvar(n->sym, n->op));
    } else
      return (NOREG);
  case A_ASPLUS:
  case A_ASMINUS:
  case A_ASSTAR:
  case A_ASSLASH:
  case A_ASMOD:
  case A_ASSIGN:

    // 对于'+='和相关操作，生成合适的汇编代码，同时获取结果寄存器
    // 然后令右节点等于左节点，这样就变成赋值操作了
    switch (n->op) {
    case A_ASPLUS:
      leftreg = cgadd(leftreg, rightreg);
      n->right = n->left;
      break;
    case A_ASMINUS:
      leftreg = cgsub(leftreg, rightreg);
      n->right = n->left;
      break;
    case A_ASSTAR:
      leftreg = cgmul(leftreg, rightreg);
      n->right = n->left;
      break;
    case A_ASSLASH:
      leftreg = cgdivmod(leftreg, rightreg, A_DIVIDE);
      n->right = n->left;
      break;
    case A_ASMOD:
      leftreg = cgdivmod(leftreg, rightreg, A_MOD);
      n->right = n->left;
      break;
    }

    // 赋值代码
    switch (n->right->op) {
    case A_IDENT:
      if (n->right->sym->class == C_GLOBAL ||
        n->right->sym->class == C_EXTERN ||
        n->right->sym->class == C_STATIC)
	      return (cgstorglob(leftreg, n->right->sym));
      else
	      return (cgstorlocal(leftreg, n->right->sym));
    case A_DEREF:
      return (cgstorderef(leftreg, rightreg, n->right->type));
    default:
      fatald("Can't A_ASSIGN in genAST(), op", n->op);
    }
  case A_WIDEN:
    // 加宽子节点的类型到父节点的类型
    return (cgwiden(leftreg, n->left->type, n->type));
  case A_RETURN:
    cgreturn(leftreg, Functionid);
    return (NOREG);
  case A_ADDR:
    // 如果有符号，直接获取它的地址，否则左寄存器已经有地址，因为这是个成员访问
    if (n->sym != NULL)
      return (cgaddress(n->sym));
    else
      return (leftreg);
  case A_DEREF:
    // 如果是右值，解引用来获得值
    // 否则直接返回，留给A_ASSIGN来处理
    if (n->rvalue)
      return (cgderef(leftreg, n->left->type));
    else
      return (leftreg);
  case A_SCALE:
    // 小优化：如果大小是2的幂次方，就使用位移来处理
    switch (n->atu.a_size) {
    case 2:
      return (cgshlconst(leftreg, 1));
    case 4:
      return (cgshlconst(leftreg, 2));
    case 8:
      return (cgshlconst(leftreg, 3));
    default:
      // 加载大小到寄存器，然后用左寄存器相乘
      rightreg = cgloadint(n->atu.a_size, P_INT);
      return (cgmul(leftreg, rightreg));
    }
  case A_POSTINC:
  case A_POSTDEC:
    // 例如：i++
    // 先返回i，再++
    return (cgloadvar(n->sym, n->op));
  case A_PREINC:
  case A_PREDEC:
    // 例如：++i
    // 先++，再返回i
    return (cgloadvar(n->left->sym, n->op));
  case A_NEGATE:
    return (cgnegate(leftreg));
  case A_INVERT:
    return (cginvert(leftreg));
  case A_LOGNOT:
    return (cglognot(leftreg));
  case A_TOBOOL:
    // 如果父节点是A_IF, A_WHILE，
    // 生成比较和跳转的代码，否则根据是零还是非零来设置寄存器的值为0或1
    return (cgboolean(leftreg, parentASTop, iflabel));
  case A_BREAK:
    cgjump(loopendlabel);
    return (NOREG);
  case A_CONTINUE:
    cgjump(looptoplabel);
    return (NOREG);
  case A_CAST:
    return (leftreg);		// 什么都不用做
  default:
    fatald("Unknown AST operator", n->op);
  }
  return (NOREG);	
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x28, %rsp
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
testq %rdi, %rdi
je 0x5c13
movl %r8d, %ebx
movl %ecx, %r15d
movl %edx, %r12d
movl %esi, %r13d
movq %rdi, %r14
movl 0x40(%rdi), %edi
testl %edi, %edi
je 0x5884
leaq 0x9aef(%rip), %rax      # 0xf368
cmpl %edi, (%rax)
je 0x5884
movl %edi, (%rax)
callq 0x3c75
movl 0x4(%r14), %r8d
cmpl $0x1c, %r8d
jle 0x58fc
leal -0x1d(%r8), %eax
cmpl $0x6, %eax
ja 0x592c
leaq 0x591a(%rip), %rcx      # 0xb1bc
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq 0x20(%r14), %rdi
testq %rdi, %rdi
je 0x58c8
movl %r13d, %esi
movl %r12d, %edx
movl %r15d, %ecx
movl $0x1d, %r8d
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movq 0x30(%r14), %rdi
testq %rdi, %rdi
je 0x58ed
movl 0x4(%r14), %r8d
movl %r13d, %esi
movl %r12d, %edx
movl %r15d, %ecx
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
jmp 0x5c0e
cmpl $0x7, %r8d
je 0x5c22
cmpl $0x8, %r8d
je 0x5916
cmpl $0x9, %r8d
jne 0x5a60
movq %r14, %rdi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x610b
cmpl $0x31, %r8d
jne 0x5a60
movslq (%r14), %rax
leaq 0x4(,%rax,4), %r15
movq %r15, %rdi
callq 0x2120
movq %rax, -0x48(%rbp)
movq %r15, %rdi
callq 0x2120
movq %rax, -0x40(%rbp)
movl 0x9791(%rip), %ebx      # 0xf0f0
leal 0x1(%rbx), %r15d
leal 0x2(%rbx), %eax
movl %eax, 0x9784(%rip)      # 0xf0f0
movq 0x20(%r14), %rdi
xorl %r13d, %r13d
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
xorl %r8d, %r8d
callq 0x583d
movl %eax, %r12d
movq %rbx, -0x50(%rbp)
movl %ebx, %edi
callq 0x371c
movl %r12d, -0x34(%rbp)
movl %r12d, %edi
callq 0x24dc
movq 0x30(%r14), %rbx
movl %r15d, -0x30(%rbp)
movl %r15d, -0x2c(%rbp)
testq %rbx, %rbx
je 0x5a36
xorl %r12d, %r12d
xorl %r13d, %r13d
movl -0x30(%rbp), %eax
movl %eax, -0x2c(%rbp)
movl 0x972d(%rip), %r15d     # 0xf0f0
leal 0x1(%r15), %eax
movl %eax, 0x9723(%rip)      # 0xf0f0
movq -0x40(%rbp), %rax
movl %r15d, (%rax,%r12)
movl (%rbx), %eax
movq -0x48(%rbp), %rcx
movl %eax, (%rcx,%r12)
movl %r15d, %edi
callq 0x295e
xorl %r14d, %r14d
cmpl $0x33, 0x4(%rbx)
setne %cl
movl -0x2c(%rbp), %eax
cmovel %r15d, %eax
movl %eax, -0x2c(%rbp)
movq 0x20(%rbx), %rdi
testq %rdi, %rdi
je 0x5a19
xorl %esi, %esi
xorl %edx, %edx
movl %ecx, %r15d
movl -0x30(%rbp), %ecx
xorl %r8d, %r8d
callq 0x583d
movl %r15d, %ecx
movb %cl, %r14b
addl %r14d, %r13d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movq 0x30(%rbx), %rbx
addq $0x4, %r12
testq %rbx, %rbx
jne 0x59bc
movl -0x30(%rbp), %ebx
movl %ebx, %edi
callq 0x371c
movl -0x34(%rbp), %edi
movl %r13d, %esi
movq -0x50(%rbp), %rdx
movq -0x40(%rbp), %rcx
movq -0x48(%rbp), %r8
movl -0x2c(%rbp), %r9d
callq 0x3aed
jmp 0x5b8d
movq 0x20(%r14), %rdi
testq %rdi, %rdi
je 0x5cc3
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movl %eax, -0x2c(%rbp)
movl 0x4(%r14), %r8d
jmp 0x5cca
movl 0x9665(%rip), %r15d     # 0xf0f0
leal 0x1(%r15), %ebx
leal 0x2(%r15), %eax
movl %eax, 0x9657(%rip)      # 0xf0f0
movl %r15d, %edi
callq 0x295e
movq 0x20(%r14), %rdi
movl 0x4(%r14), %r8d
movl %ebx, %esi
movl %r15d, %edx
movl %ebx, %ecx
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movq 0x30(%r14), %rdi
movl 0x4(%r14), %r8d
xorl %esi, %esi
movl %r15d, %edx
movl %ebx, %ecx
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movl %r15d, %edi
callq 0x371c
jmp 0x5b8d
movl 0x95ff(%rip), %r13d     # 0xf0f0
leal 0x1(%r13), %ebx
movl %ebx, 0x95f5(%rip)      # 0xf0f0
cmpq $0x0, 0x30(%r14)
je 0x5b0c
leal 0x2(%r13), %eax
movl %eax, 0x95e4(%rip)      # 0xf0f0
movq 0x20(%r14), %rdi
movl %r13d, %esi
xorl %edx, %edx
xorl %ecx, %ecx
movl $0x1e, %r8d
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movq 0x28(%r14), %rdi
movl 0x4(%r14), %r8d
xorl %esi, %esi
movl %r12d, %edx
movl %r15d, %ecx
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
cmpq $0x0, 0x30(%r14)
je 0x5b59
movl %ebx, %edi
callq 0x371c
movl %r13d, %edi
callq 0x295e
movq 0x30(%r14), %rdi
testq %rdi, %rdi
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
je 0x5c13
movl 0x4(%r14), %r8d
xorl %esi, %esi
xorl %edx, %edx
movl %r15d, %ecx
callq 0x583d
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
callq 0x24dc
movl %ebx, %edi
callq 0x295e
jmp 0x5c0e
movq 0x20(%r14), %r15
callq 0x25eb
xorl %ebx, %ebx
testq %r15, %r15
je 0x5bd0
movq 0x30(%r15), %rdi
movl 0x4(%r15), %r8d
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movl (%r15), %esi
movl %eax, %edi
callq 0x32b1
testl %ebx, %ebx
jne 0x5bca
movl (%r15), %ebx
movq 0x20(%r15), %r15
jmp 0x5ba1
movq 0x38(%r14), %rdi
movl %ebx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3215
movq 0x38(%r14), %rdi
callq 0x26ec
movq 0x20(%r14), %rdi
movl 0x4(%r14), %r8d
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movq 0x38(%r14), %rdi
callq 0x28f8
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
movl 0x94c7(%rip), %r15d     # 0xf0f0
leal 0x1(%r15), %ebx
leal 0x2(%r15), %eax
movl %eax, 0x94b9(%rip)      # 0xf0f0
movq 0x20(%r14), %rdi
movl %r15d, %esi
xorl %edx, %edx
xorl %ecx, %ecx
movl $0x7, %r8d
callq 0x583d
callq 0x2507
movl %eax, %r13d
movq 0x28(%r14), %rdi
movl 0x4(%r14), %r8d
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movl %eax, %r12d
movl %eax, %edi
movl %r13d, %esi
callq 0x3c40
movl %r12d, %edi
callq 0x257c
movl %ebx, %edi
callq 0x371c
movl %r15d, %edi
callq 0x295e
movq 0x30(%r14), %rdi
movl 0x4(%r14), %r8d
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movl %eax, %r14d
movl %eax, %edi
movl %r13d, %esi
callq 0x3c40
movl %r14d, %edi
callq 0x257c
movl %ebx, %edi
callq 0x295e
movl %r13d, %eax
jmp 0x5c13
movl $0xffffffff, -0x2c(%rbp) # imm = 0xFFFFFFFF
movq 0x30(%r14), %rdi
testq %rdi, %rdi
je 0x5ce6
xorl %esi, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x583d
movl %eax, %edx
movl 0x4(%r14), %r8d
jmp 0x5ceb
movl $0xffffffff, %edx       # imm = 0xFFFFFFFF
leal -0x1(%r8), %eax
cmpl $0x33, %eax
ja 0x609f
leaq 0x54d9(%rip), %rcx      # 0xb1d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
cmpl $0x1f, %ebx
ja 0x5d61
movl $0xc0000080, %eax       # imm = 0xC0000080
btl %ebx, %eax
jae 0x5d61
movq 0x20(%r14), %rax
movl 0x8(%rax), %eax
movl %r8d, %edi
movl -0x2c(%rbp), %esi
movl %r13d, %ecx
movl %eax, %r8d
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x373b
movq 0x20(%r14), %rax
movq 0x38(%rax), %rdi
jmp 0x5d4b
movq 0x38(%r14), %rdi
movl %r8d, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x29bb
movq 0x20(%r14), %rax
movl 0x8(%rax), %ecx
movl %r8d, %edi
movl -0x2c(%rbp), %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3620
movl %r15d, %edi
jmp 0x5e94
leaq 0x95e8(%rip), %rax      # 0xf378
movq (%rax), %rsi
movl -0x2c(%rbp), %edi
callq 0x3828
jmp 0x5c0e
movl -0x2c(%rbp), %edi
movl %ebx, %esi
movl %r13d, %edx
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x313d
movl -0x2c(%rbp), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3057
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2cf7
movl -0x2c(%rbp), %edi
movl %edx, %esi
movl $0x18, %edx
jmp 0x5ef1
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2e81
cmpl $0x24, %ebx
je 0x5e25
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
cmpl $0x0, 0x18(%r14)
je 0x5c13
movq 0x38(%r14), %rdi
movl $0x1c, %esi
jmp 0x5d4e
movl (%r14), %edi
movl 0x8(%r14), %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x297d
cmpl $0x0, 0x18(%r14)
je 0x5e71
movq 0x20(%r14), %rax
movl 0x8(%rax), %esi
movl -0x2c(%rbp), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x396c
movl -0x2c(%rbp), %eax
jmp 0x5c13
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2ec7
movl %r12d, %edi
callq 0x371c
jmp 0x5c0e
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2f0d
movq 0x38(%r14), %rdi
testq %rdi, %rdi
movl -0x2c(%rbp), %eax
je 0x5c13
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x38ec
movl -0x2c(%rbp), %edi
movl %edx, %ebx
movl %edx, %esi
movl $0x18, %edx
jmp 0x5f10
movl -0x2c(%rbp), %edi
movl %edx, %esi
movl $0x19, %edx
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2dc9
movl -0x2c(%rbp), %edi
movl %edx, %ebx
movl %edx, %esi
movl $0x19, %edx
callq 0x2dc9
jmp 0x5fbe
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2d3d
movl -0x2c(%rbp), %edi
movl %edx, %ebx
movl %edx, %esi
callq 0x2d83
jmp 0x5fbe
movl %edx, %ebx
movq 0x30(%r14), %rax
movl -0x2c(%rbp), %edi
jmp 0x5fc8
movl -0x2c(%rbp), %edi
movl %edx, %ebx
movl %edx, %esi
callq 0x2cf7
jmp 0x5fbe
movl (%r14), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2cb9
movl (%r14), %edi
cmpl $0x8, %edi
je 0x60cf
cmpl $0x4, %edi
movl -0x2c(%rbp), %ebx
je 0x60c6
cmpl $0x2, %edi
jne 0x60ea
movl %ebx, %edi
movl $0x1, %esi
jmp 0x60d7
movl -0x2c(%rbp), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x308f
movl -0x2c(%rbp), %edi
movl %edx, %ebx
movl %edx, %esi
callq 0x2d3d
movl %eax, %edi
movq 0x20(%r14), %rax
movq %rax, 0x30(%r14)
movl 0x4(%rax), %ecx
cmpl $0x24, %ecx
je 0x6006
cmpl $0x1c, %ecx
jne 0x601e
movq 0x38(%rax), %rsi
movl 0x24(%rsi), %eax
cmpl $0x5, %eax
ja 0x60b3
movl $0x32, %ecx
btl %eax, %ecx
jae 0x60b3
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3346
movl 0x8(%rax), %edx
movl %ebx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3a18
movl %edi, -0x2c(%rbp)
movl 0x4(%r14), %esi
leaq 0x527c(%rip), %rdi      # 0xb2a8
callq 0x6991
movq 0x20(%r14), %rax
movl 0x8(%rax), %esi
movl 0x8(%r14), %edx
movl -0x2c(%rbp), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3820
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2fb9
movl -0x2c(%rbp), %edi
movl %edx, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2f53
movl -0x2c(%rbp), %edi
movl %edx, %esi
jmp 0x60f8
movl -0x2c(%rbp), %edi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x301f
leaq 0x5221(%rip), %rdi      # 0xb2c7
movl %r8d, %esi
callq 0x6991
jmp 0x5c0e
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x284b
movl %ebx, %edi
movl $0x2, %esi
jmp 0x60d7
movl -0x2c(%rbp), %edi
movl $0x3, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x330c
movl $0x30, %esi
callq 0x297d
movl %ebx, %edi
movl %eax, %esi
addq $0x28, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x2d83