// File: JameyWoo[P]csmile/assembly.cpp
// Function: genAssign(TreeNode*, std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>, std::less<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>> const, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>>>>, bool)
void genAssign(TreeNode* assign, map<string, string> var2stack, bool need) {
    // debug("assign " + assign->child[0]->name);
    string left_loc = var2stack[assign->child[0]->name];
    if (assign->child[1]->nodekind == "Const") {
        assout << "\tmovl\t$"
               << to_string(assign->child[1]->val)
               << ", " << left_loc << endl;
    } else if (assign->child[1]->nodekind == "Id") {
        // debug("assign->child[1]->name: " + assign->child[1]->name);
        string right_loc = var2stack[assign->child[1]->name];
        // 先将该值赋值给某个寄存器, 然后再将寄存器赋值给左值
        assout << "\tmovl\t" << right_loc << ", %edx" << endl
               << "\tmovl\t%edx, " << left_loc << endl;
    } else if (assign->child[1]->nodekind == "Assign") {
        genAssign(assign->child[1], var2stack, true);
        assout << "\tmovl\t%edx, " << left_loc << endl;
    } else if (assign->child[1]->nodekind == "PMOp" || assign->child[1]->nodekind == "MDOp") {
        // debug("assign->child[1]->nodekind: " + assign->child[1]->nodekind);
        // 计算(加减乘除)
        // debug("assign->child[1]->nodekind: " + assign->child[1]->nodekind);
        genCalc(assign->child[1], var2stack);
        assout << "\tmovl\t%edx, " << left_loc << endl;
    } else if (assign->child[1]->nodekind == "Input") {
        genInput(assign->child[1], left_loc);  // 第二个参数是赋值的地址
    } else if (assign->child[1]->nodekind == "Call") {
        // call 有一种是在赋值中的, 有一种是普通的没有被赋值的调用
        genCall(assign->child[1], var2stack);
        // 返回值
        assout << "\tmovl\t%eax, " << left_loc << endl;
    }
    if (need) {
        assout << "\tmovl\t" << left_loc << ", %edx" << endl;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x230, %rsp            # imm = 0x230
movq %rsi, -0x148(%rbp)
movq %rdi, %rcx
movq -0x148(%rbp), %rdi
movb %dl, %al
movq %rcx, -0x8(%rbp)
movq %rdi, -0x10(%rbp)
andb $0x1, %al
movb %al, -0x11(%rbp)
movq -0x8(%rbp), %rax
movq (%rax), %rsi
addq $0xc0, %rsi
callq 0xf2e0
movq %rax, %rsi
leaq -0x38(%rbp), %rdi
callq 0x3120
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x84dc(%rip), %rsi      # 0x211e9
callq 0x5e70
movb %al, -0x139(%rbp)
jmp 0x18d1a
movb -0x139(%rbp), %al
testb $0x1, %al
jne 0x18d29
jmp 0x18dfa
leaq 0x15f78(%rip), %rdi     # 0x2eca8
leaq 0x89e8(%rip), %rsi      # 0x2171f
callq 0x3270
movq %rax, -0x150(%rbp)
jmp 0x18d45
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movl 0xb8(%rax), %esi
leaq -0x68(%rbp), %rdi
callq 0xf460
jmp 0x18d5e
movq -0x150(%rbp), %rdi
leaq -0x68(%rbp), %rsi
callq 0x3240
movq %rax, -0x158(%rbp)
jmp 0x18d77
movq -0x158(%rbp), %rdi
leaq 0x8a12(%rip), %rsi      # 0x21797
callq 0x3270
movq %rax, -0x160(%rbp)
jmp 0x18d93
movq -0x160(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x168(%rbp)
jmp 0x18dac
movq -0x168(%rbp), %rdi
movq 0x151f6(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x18dc1
leaq -0x68(%rbp), %rdi
callq 0x34e8
jmp 0x192b2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
jmp 0x19332
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x68(%rbp), %rdi
callq 0x34e8
jmp 0x19332
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x839f(%rip), %rsi      # 0x211ac
callq 0x5e70
movb %al, -0x169(%rbp)
jmp 0x18e1a
movb -0x169(%rbp), %al
testb $0x1, %al
jne 0x18e29
jmp 0x18f4a
movq -0x148(%rbp), %rdi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rsi
addq $0xc0, %rsi
callq 0xf2e0
movq %rax, -0x178(%rbp)
jmp 0x18e4d
movq -0x178(%rbp), %rsi
leaq -0x88(%rbp), %rdi
callq 0x3120
jmp 0x18e62
leaq 0x15e3f(%rip), %rdi     # 0x2eca8
leaq 0x8826(%rip), %rsi      # 0x21696
callq 0x3270
movq %rax, -0x180(%rbp)
jmp 0x18e7e
movq -0x180(%rbp), %rdi
leaq -0x88(%rbp), %rsi
callq 0x3240
movq %rax, -0x188(%rbp)
jmp 0x18e9a
movq -0x188(%rbp), %rdi
leaq 0x8930(%rip), %rsi      # 0x217d8
callq 0x3270
movq %rax, -0x190(%rbp)
jmp 0x18eb6
movq -0x190(%rbp), %rdi
movq 0x150ec(%rip), %rsi     # 0x2dfb0
callq 0x32b0
movq %rax, -0x198(%rbp)
jmp 0x18ed2
movq -0x198(%rbp), %rdi
leaq 0x88a0(%rip), %rsi      # 0x21780
callq 0x3270
movq %rax, -0x1a0(%rbp)
jmp 0x18eee
movq -0x1a0(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x1a8(%rbp)
jmp 0x18f07
movq -0x1a8(%rbp), %rdi
movq 0x1509b(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x18f1c
leaq -0x88(%rbp), %rdi
callq 0x34e8
jmp 0x192b0
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x88(%rbp), %rdi
callq 0x34e8
jmp 0x19332
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x82d1(%rip), %rsi      # 0x2122e
callq 0x5e70
movb %al, -0x1a9(%rbp)
jmp 0x18f6a
movb -0x1a9(%rbp), %al
testb $0x1, %al
jne 0x18f79
jmp 0x1902f
movq -0x148(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x1b8(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0x1c040
jmp 0x18f9d
movq -0x1b8(%rbp), %rdi
leaq -0xb8(%rbp), %rsi
movl $0x1, %edx
callq 0x18cb0
jmp 0x18fb7
leaq -0xb8(%rbp), %rdi
callq 0xee40
leaq 0x15cde(%rip), %rdi     # 0x2eca8
leaq 0x87af(%rip), %rsi      # 0x21780
callq 0x3270
movq %rax, -0x1c0(%rbp)
jmp 0x18fdf
movq -0x1c0(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x1c8(%rbp)
jmp 0x18ff8
movq -0x1c8(%rbp), %rdi
movq 0x14faa(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x1900d
jmp 0x192ae
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0xb8(%rbp), %rdi
callq 0xee40
jmp 0x19332
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x81b2(%rip), %rsi      # 0x211f4
callq 0x5e70
movb %al, -0x1c9(%rbp)
jmp 0x1904f
movb -0x1c9(%rbp), %al
testb $0x1, %al
jne 0x1908a
jmp 0x1905b
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x8181(%rip), %rsi      # 0x211ef
callq 0x5e70
movb %al, -0x1ca(%rbp)
jmp 0x1907b
movb -0x1ca(%rbp), %al
testb $0x1, %al
jne 0x1908a
jmp 0x1913b
movq -0x148(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x1d8(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0x1c040
jmp 0x190ae
movq -0x1d8(%rbp), %rdi
leaq -0xe8(%rbp), %rsi
callq 0x1a8a0
jmp 0x190c3
leaq -0xe8(%rbp), %rdi
callq 0xee40
leaq 0x15bd2(%rip), %rdi     # 0x2eca8
leaq 0x86a3(%rip), %rsi      # 0x21780
callq 0x3270
movq %rax, -0x1e0(%rbp)
jmp 0x190eb
movq -0x1e0(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x1e8(%rbp)
jmp 0x19104
movq -0x1e8(%rbp), %rdi
movq 0x14e9e(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x19119
jmp 0x192ac
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0xe8(%rbp), %rdi
callq 0xee40
jmp 0x19332
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x80ab(%rip), %rsi      # 0x211f9
callq 0x5e70
movb %al, -0x1e9(%rbp)
jmp 0x1915b
movb -0x1e9(%rbp), %al
testb $0x1, %al
jne 0x19167
jmp 0x191cb
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x1f8(%rbp)
leaq -0x108(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3120
jmp 0x19188
movq -0x1f8(%rbp), %rdi
leaq -0x108(%rbp), %rsi
callq 0x18860
jmp 0x1919d
leaq -0x108(%rbp), %rdi
callq 0x34e8
jmp 0x192aa
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x108(%rbp), %rdi
callq 0x34e8
jmp 0x19332
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rdi
addq $0x30, %rdi
leaq 0x7ffc(%rip), %rsi      # 0x211da
callq 0x5e70
movb %al, -0x1f9(%rbp)
jmp 0x191eb
movb -0x1f9(%rbp), %al
testb $0x1, %al
jne 0x191fa
jmp 0x192a8
movq -0x148(%rbp), %rsi
movq -0x8(%rbp), %rax
movq 0x8(%rax), %rax
movq %rax, -0x208(%rbp)
leaq -0x138(%rbp), %rdi
callq 0x1c040
jmp 0x1921e
movq -0x208(%rbp), %rdi
leaq -0x138(%rbp), %rsi
callq 0x18230
jmp 0x19233
leaq -0x138(%rbp), %rdi
callq 0xee40
leaq 0x15a62(%rip), %rdi     # 0x2eca8
leaq 0x8540(%rip), %rsi      # 0x2178d
callq 0x3270
movq %rax, -0x210(%rbp)
jmp 0x1925b
movq -0x210(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x218(%rbp)
jmp 0x19274
movq -0x218(%rbp), %rdi
movq 0x14d2e(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x19289
jmp 0x192a8
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x40(%rbp)
movl %eax, -0x44(%rbp)
leaq -0x138(%rbp), %rdi
callq 0xee40
jmp 0x19332
jmp 0x192aa
jmp 0x192ac
jmp 0x192ae
jmp 0x192b0
jmp 0x192b2
testb $0x1, -0x11(%rbp)
je 0x19320
leaq 0x159e9(%rip), %rdi     # 0x2eca8
leaq 0x83d0(%rip), %rsi      # 0x21696
callq 0x3270
movq %rax, -0x220(%rbp)
jmp 0x192d4
movq -0x220(%rbp), %rdi
leaq -0x38(%rbp), %rsi
callq 0x3240
movq %rax, -0x228(%rbp)
jmp 0x192ed
movq -0x228(%rbp), %rdi
leaq 0x84dd(%rip), %rsi      # 0x217d8
callq 0x3270
movq %rax, -0x230(%rbp)
jmp 0x19309
movq -0x230(%rbp), %rdi
movq 0x14c99(%rip), %rsi     # 0x2dfb0
callq 0x32b0
jmp 0x1931e
jmp 0x19320
leaq -0x38(%rbp), %rdi
callq 0x34e8
addq $0x230, %rsp            # imm = 0x230
popq %rbp
retq
leaq -0x38(%rbp), %rdi
callq 0x34e8
movq -0x40(%rbp), %rdi
callq 0x3470
nopw %cs:(%rax,%rax)