// File: devaigergely81[P]flex-bison-example/code_generator_implementation.cc
// Function: operator_code(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>>)
std::string operator_code(std::string op) {
    std::stringstream ss;
    if(op == "+") {
        ss << "add eax,ecx" << std::endl;
    } else if(op == "-") {
        ss << "sub eax,ecx" << std::endl;
    } else if(op == "*") {
        ss << "xor edx,edx" << std::endl;
        ss << "mul ecx" << std::endl;
    } else if(op == "/") {
        ss << "xor edx,edx" << std::endl;
        ss << "div ecx" << std::endl;   
    } else if(op == "%") {
        ss << "xor edx,edx" << std::endl;
        ss << "div ecx" << std::endl;
        ss << "mov eax,edx" << std::endl;
    } else if(op == "<") {
        ss << "cmp eax,ecx" << std::endl;
        ss << "mov al,0" << std::endl;
        ss << "mov cx,1" << std::endl;
        ss << "cmovb ax,cx" << std::endl;
    } else if(op == "<=") {
        ss << "cmp eax,ecx" << std::endl;
        ss << "mov al,0" << std::endl;
        ss << "mov cx,1" << std::endl;
        ss << "cmovbe ax,cx" << std::endl;
    } else if(op == ">") {
        ss << "cmp eax,ecx" << std::endl;
        ss << "mov al,0" << std::endl;
        ss << "mov cx,1" << std::endl;
        ss << "cmova ax,cx" << std::endl;
    } else if(op == ">=") {
        ss << "cmp eax,ecx" << std::endl;
        ss << "mov al,0" << std::endl;
        ss << "mov cx,1" << std::endl;
        ss << "cmovae ax,cx" << std::endl;
    } else if(op == "and") {
        ss << "cmp al,1" << std::endl;
        ss << "cmove ax,cx" << std::endl;
    } else if(op == "or") {
        ss << "cmp al,0" << std::endl;
        ss << "cmove ax,cx" << std::endl;
    } else {
        error(-1, std::string("Bug: Unsupported binary operator: ") + op);
    }
    return ss.str();
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x350, %rsp            # imm = 0x350
movq %rsi, -0x1f8(%rbp)
movq %rdi, -0x208(%rbp)
movq %rdi, %rax
movq %rax, -0x200(%rbp)
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
leaq -0x198(%rbp), %rdi
callq 0x4200
movq -0x1f8(%rbp), %rdi
leaq 0x5ee0(%rip), %rsi      # 0x170c5
callq 0x7440
movb %al, -0x1ea(%rbp)
jmp 0x111f2
movb -0x1ea(%rbp), %al
testb $0x1, %al
jne 0x111fe
jmp 0x1124b
leaq -0x188(%rbp), %rdi
leaq 0x61f8(%rip), %rsi      # 0x17404
callq 0x4290
movq %rax, -0x210(%rbp)
jmp 0x1121a
movq -0x210(%rbp), %rdi
movq 0xed90(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1122f
jmp 0x11a66
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1a0(%rbp)
movl %eax, -0x1a4(%rbp)
jmp 0x11a97
movq -0x1f8(%rbp), %rdi
leaq 0x5e6e(%rip), %rsi      # 0x170c7
callq 0x7440
movb %al, -0x211(%rbp)
jmp 0x11266
movb -0x211(%rbp), %al
testb $0x1, %al
jne 0x11272
jmp 0x112a8
leaq -0x188(%rbp), %rdi
leaq 0x6190(%rip), %rsi      # 0x17410
callq 0x4290
movq %rax, -0x220(%rbp)
jmp 0x1128e
movq -0x220(%rbp), %rdi
movq 0xed1c(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x112a3
jmp 0x11a64
movq -0x1f8(%rbp), %rdi
leaq 0x5e13(%rip), %rsi      # 0x170c9
callq 0x7440
movb %al, -0x221(%rbp)
jmp 0x112c3
movb -0x221(%rbp), %al
testb $0x1, %al
jne 0x112cf
jmp 0x11336
leaq -0x188(%rbp), %rdi
leaq 0x613f(%rip), %rsi      # 0x1741c
callq 0x4290
movq %rax, -0x230(%rbp)
jmp 0x112eb
movq -0x230(%rbp), %rdi
movq 0xecbf(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11300
leaq -0x188(%rbp), %rdi
leaq 0x611a(%rip), %rsi      # 0x17428
callq 0x4290
movq %rax, -0x238(%rbp)
jmp 0x1131c
movq -0x238(%rbp), %rdi
movq 0xec8e(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11331
jmp 0x11a62
movq -0x1f8(%rbp), %rdi
leaq 0x5d87(%rip), %rsi      # 0x170cb
callq 0x7440
movb %al, -0x239(%rbp)
jmp 0x11351
movb -0x239(%rbp), %al
testb $0x1, %al
jne 0x1135d
jmp 0x113c4
leaq -0x188(%rbp), %rdi
leaq 0x60b1(%rip), %rsi      # 0x1741c
callq 0x4290
movq %rax, -0x248(%rbp)
jmp 0x11379
movq -0x248(%rbp), %rdi
movq 0xec31(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1138e
leaq -0x188(%rbp), %rdi
leaq 0x6094(%rip), %rsi      # 0x17430
callq 0x4290
movq %rax, -0x250(%rbp)
jmp 0x113aa
movq -0x250(%rbp), %rdi
movq 0xec00(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x113bf
jmp 0x11a60
movq -0x1f8(%rbp), %rdi
leaq 0x5cfb(%rip), %rsi      # 0x170cd
callq 0x7440
movb %al, -0x251(%rbp)
jmp 0x113df
movb -0x251(%rbp), %al
testb $0x1, %al
jne 0x113ee
jmp 0x11486
leaq -0x188(%rbp), %rdi
leaq 0x6020(%rip), %rsi      # 0x1741c
callq 0x4290
movq %rax, -0x260(%rbp)
jmp 0x1140a
movq -0x260(%rbp), %rdi
movq 0xeba0(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1141f
leaq -0x188(%rbp), %rdi
leaq 0x6003(%rip), %rsi      # 0x17430
callq 0x4290
movq %rax, -0x268(%rbp)
jmp 0x1143b
movq -0x268(%rbp), %rdi
movq 0xeb6f(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11450
leaq -0x188(%rbp), %rdi
leaq 0x5fda(%rip), %rsi      # 0x17438
callq 0x4290
movq %rax, -0x270(%rbp)
jmp 0x1146c
movq -0x270(%rbp), %rdi
movq 0xeb3e(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11481
jmp 0x11a5e
movq -0x1f8(%rbp), %rdi
leaq 0x5c3b(%rip), %rsi      # 0x170cf
callq 0x7440
movb %al, -0x271(%rbp)
jmp 0x114a1
movb -0x271(%rbp), %al
testb $0x1, %al
jne 0x114b0
jmp 0x11579
leaq -0x188(%rbp), %rdi
leaq 0x5f86(%rip), %rsi      # 0x17444
callq 0x4290
movq %rax, -0x280(%rbp)
jmp 0x114cc
movq -0x280(%rbp), %rdi
movq 0xeade(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x114e1
leaq -0x188(%rbp), %rdi
leaq 0x5f61(%rip), %rsi      # 0x17450
callq 0x4290
movq %rax, -0x288(%rbp)
jmp 0x114fd
movq -0x288(%rbp), %rdi
movq 0xeaad(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11512
leaq -0x188(%rbp), %rdi
leaq 0x5f39(%rip), %rsi      # 0x17459
callq 0x4290
movq %rax, -0x290(%rbp)
jmp 0x1152e
movq -0x290(%rbp), %rdi
movq 0xea7c(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11543
leaq -0x188(%rbp), %rdi
leaq 0x5f11(%rip), %rsi      # 0x17462
callq 0x4290
movq %rax, -0x298(%rbp)
jmp 0x1155f
movq -0x298(%rbp), %rdi
movq 0xea4b(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11574
jmp 0x11a5c
movq -0x1f8(%rbp), %rdi
leaq 0x5b4c(%rip), %rsi      # 0x170d3
callq 0x7440
movb %al, -0x299(%rbp)
jmp 0x11594
movb -0x299(%rbp), %al
testb $0x1, %al
jne 0x115a3
jmp 0x1166c
leaq -0x188(%rbp), %rdi
leaq 0x5e93(%rip), %rsi      # 0x17444
callq 0x4290
movq %rax, -0x2a8(%rbp)
jmp 0x115bf
movq -0x2a8(%rbp), %rdi
movq 0xe9eb(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x115d4
leaq -0x188(%rbp), %rdi
leaq 0x5e6e(%rip), %rsi      # 0x17450
callq 0x4290
movq %rax, -0x2b0(%rbp)
jmp 0x115f0
movq -0x2b0(%rbp), %rdi
movq 0xe9ba(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11605
leaq -0x188(%rbp), %rdi
leaq 0x5e46(%rip), %rsi      # 0x17459
callq 0x4290
movq %rax, -0x2b8(%rbp)
jmp 0x11621
movq -0x2b8(%rbp), %rdi
movq 0xe989(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11636
leaq -0x188(%rbp), %rdi
leaq 0x5e2a(%rip), %rsi      # 0x1746e
callq 0x4290
movq %rax, -0x2c0(%rbp)
jmp 0x11652
movq -0x2c0(%rbp), %rdi
movq 0xe958(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11667
jmp 0x11a5a
movq -0x1f8(%rbp), %rdi
leaq 0x5a57(%rip), %rsi      # 0x170d1
callq 0x7440
movb %al, -0x2c1(%rbp)
jmp 0x11687
movb -0x2c1(%rbp), %al
testb $0x1, %al
jne 0x11696
jmp 0x1175f
leaq -0x188(%rbp), %rdi
leaq 0x5da0(%rip), %rsi      # 0x17444
callq 0x4290
movq %rax, -0x2d0(%rbp)
jmp 0x116b2
movq -0x2d0(%rbp), %rdi
movq 0xe8f8(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x116c7
leaq -0x188(%rbp), %rdi
leaq 0x5d7b(%rip), %rsi      # 0x17450
callq 0x4290
movq %rax, -0x2d8(%rbp)
jmp 0x116e3
movq -0x2d8(%rbp), %rdi
movq 0xe8c7(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x116f8
leaq -0x188(%rbp), %rdi
leaq 0x5d53(%rip), %rsi      # 0x17459
callq 0x4290
movq %rax, -0x2e0(%rbp)
jmp 0x11714
movq -0x2e0(%rbp), %rdi
movq 0xe896(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11729
leaq -0x188(%rbp), %rdi
leaq 0x5d44(%rip), %rsi      # 0x1747b
callq 0x4290
movq %rax, -0x2e8(%rbp)
jmp 0x11745
movq -0x2e8(%rbp), %rdi
movq 0xe865(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1175a
jmp 0x11a58
movq -0x1f8(%rbp), %rdi
leaq 0x5969(%rip), %rsi      # 0x170d6
callq 0x7440
movb %al, -0x2e9(%rbp)
jmp 0x1177a
movb -0x2e9(%rbp), %al
testb $0x1, %al
jne 0x11789
jmp 0x11852
leaq -0x188(%rbp), %rdi
leaq 0x5cad(%rip), %rsi      # 0x17444
callq 0x4290
movq %rax, -0x2f8(%rbp)
jmp 0x117a5
movq -0x2f8(%rbp), %rdi
movq 0xe805(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x117ba
leaq -0x188(%rbp), %rdi
leaq 0x5c88(%rip), %rsi      # 0x17450
callq 0x4290
movq %rax, -0x300(%rbp)
jmp 0x117d6
movq -0x300(%rbp), %rdi
movq 0xe7d4(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x117eb
leaq -0x188(%rbp), %rdi
leaq 0x5c60(%rip), %rsi      # 0x17459
callq 0x4290
movq %rax, -0x308(%rbp)
jmp 0x11807
movq -0x308(%rbp), %rdi
movq 0xe7a3(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1181c
leaq -0x188(%rbp), %rdi
leaq 0x5c5d(%rip), %rsi      # 0x17487
callq 0x4290
movq %rax, -0x310(%rbp)
jmp 0x11838
movq -0x310(%rbp), %rdi
movq 0xe772(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x1184d
jmp 0x11a56
movq -0x1f8(%rbp), %rdi
leaq 0x5879(%rip), %rsi      # 0x170d9
callq 0x7440
movb %al, -0x311(%rbp)
jmp 0x1186d
movb -0x311(%rbp), %al
testb $0x1, %al
jne 0x11879
jmp 0x118e0
leaq -0x188(%rbp), %rdi
leaq 0x5c0d(%rip), %rsi      # 0x17494
callq 0x4290
movq %rax, -0x320(%rbp)
jmp 0x11895
movq -0x320(%rbp), %rdi
movq 0xe715(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x118aa
leaq -0x188(%rbp), %rdi
leaq 0x5be5(%rip), %rsi      # 0x1749d
callq 0x4290
movq %rax, -0x328(%rbp)
jmp 0x118c6
movq -0x328(%rbp), %rdi
movq 0xe6e4(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x118db
jmp 0x11a54
movq -0x1f8(%rbp), %rdi
leaq 0x57fd(%rip), %rsi      # 0x170eb
callq 0x7440
movb %al, -0x329(%rbp)
jmp 0x118fb
movb -0x329(%rbp), %al
testb $0x1, %al
jne 0x11907
jmp 0x1196e
leaq -0x188(%rbp), %rdi
leaq 0x5b94(%rip), %rsi      # 0x174a9
callq 0x4290
movq %rax, -0x338(%rbp)
jmp 0x11923
movq -0x338(%rbp), %rdi
movq 0xe687(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11938
leaq -0x188(%rbp), %rdi
leaq 0x5b57(%rip), %rsi      # 0x1749d
callq 0x4290
movq %rax, -0x340(%rbp)
jmp 0x11954
movq -0x340(%rbp), %rdi
movq 0xe656(%rip), %rsi      # 0x1ffb8
callq 0x42d0
jmp 0x11969
jmp 0x11a52
leaq -0x1e9(%rbp), %rdi
movq %rdi, -0x348(%rbp)
callq 0x4480
movq -0x348(%rbp), %rdx
leaq 0x5b23(%rip), %rsi      # 0x174b2
leaq -0x1e8(%rbp), %rdi
callq 0x7390
jmp 0x1199d
movq -0x1f8(%rbp), %rdx
leaq -0x1c8(%rbp), %rdi
leaq -0x1e8(%rbp), %rsi
callq 0xf030
jmp 0x119b9
movl $0xffffffff, %edi       # imm = 0xFFFFFFFF
leaq -0x1c8(%rbp), %rsi
callq 0xd3d0
jmp 0x119cc
leaq -0x1c8(%rbp), %rdi
callq 0x41c0
leaq -0x1e8(%rbp), %rdi
callq 0x41c0
leaq -0x1e9(%rbp), %rdi
callq 0x42f0
jmp 0x11a52
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1a0(%rbp)
movl %eax, -0x1a4(%rbp)
jmp 0x11a44
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1a0(%rbp)
movl %eax, -0x1a4(%rbp)
jmp 0x11a38
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x1a0(%rbp)
movl %eax, -0x1a4(%rbp)
leaq -0x1c8(%rbp), %rdi
callq 0x41c0
leaq -0x1e8(%rbp), %rdi
callq 0x41c0
leaq -0x1e9(%rbp), %rdi
callq 0x42f0
jmp 0x11a97
jmp 0x11a54
jmp 0x11a56
jmp 0x11a58
jmp 0x11a5a
jmp 0x11a5c
jmp 0x11a5e
jmp 0x11a60
jmp 0x11a62
jmp 0x11a64
jmp 0x11a66
movq -0x208(%rbp), %rdi
leaq -0x198(%rbp), %rsi
callq 0x4280
jmp 0x11a7b
leaq -0x198(%rbp), %rdi
callq 0x4220
movq -0x200(%rbp), %rax
addq $0x350, %rsp            # imm = 0x350
popq %rbp
retq
leaq -0x198(%rbp), %rdi
callq 0x4220
movq -0x1a0(%rbp), %rdi
callq 0x4470
nop