// File: /workspace/github_cpp_makefile_star2_O2/Eronana[P]strawberry/src/ast_codegen.cpp
// Function: AST_BinaryOperationExpression::codeGen(Symbol*)
DEF_AST_METHOD(BinaryOperationExpression,AST_CODEGEN)
{
    auto optype=GET_LITERAL(optr).type;
    int label;
    if(optype==TOKEN_LOGIC_AND)
    {
        label=nextLabel();
        PRINTF("dup\n");
        PRINTF("istrue\n");
        PRINTF("jmp label_%d\n",label);
        PRINTF("pop\n");
    }
    else if(optype==TOKEN_LOGIC_OR)
    {
        label=nextLabel();
        PRINTF("dup\n");
        PRINTF("isfalse\n");
        PRINTF("jmp label_%d\n",label);
        PRINTF("pop\n");
    }
    bool isIdentifier=is_identifier(expr);
    if(isIdentifier)loadVariant(symbol,expr);
    else CODEGEN(expr);
    switch(optype)
    {
        case TOKEN_MUL:
            PRINTF("mul\n");
            break;
        case TOKEN_DIV:
            PRINTF("div\n");
            break;
        case TOKEN_MOD:
            PRINTF("mod\n");
            break;
        case TOKEN_ADD:
            PRINTF("add\n");
            break;
        case TOKEN_SUB:
            PRINTF("sub\n");
            break;
        case TOKEN_BITWISE_AND:
            PRINTF("band\n");
            break;
        case TOKEN_BITWISE_XOR:
            PRINTF("xor\n");
            break;
        case TOKEN_BITWISE_OR:
            PRINTF("bor\n");
            break;
        case TOKEN_LEFT_SHIFT:
            PRINTF("shl\n");
            break;
        case TOKEN_RIGHT_SHIFT:
            PRINTF("shr\n");
            break;
        case TOKEN_LESS:
            PRINTF("less\n");
            break;
        case TOKEN_GREATER:
            PRINTF("gt\n");
            break;
        case TOKEN_LESS_EQUAL:
            PRINTF("le\n");
            break;
        case TOKEN_GREATER_EQUAL:
            PRINTF("ge\n");
            break;
        case TOKEN_EQUAL:
            PRINTF("eq\n");
            break;
        case TOKEN_INEQUAL:
            PRINTF("ieq\n");
            break;
        case TOKEN_LOGIC_AND:
        case TOKEN_LOGIC_OR:
            PRINTF("label_%d:\n",label);
            break;
        default:
            break;
    }
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %r14
movq %rdi, %r15
movq 0x10(%rdi), %rax
movl 0x8(%rax), %r13d
cmpl $0x14, %r13d
je 0x1ab2e
cmpl $0x17, %r13d
jne 0x1abb5
callq 0xc83c
incl 0x1504a(%rip)           # 0x2fb40
movl %eax, %ebx
leaq 0x14d19(%rip), %rbp     # 0x2f818
movq (%rbp), %rcx
leaq 0x3abc(%rip), %rdi      # 0x1e5c6
pushq $0x4
popq %rsi
pushq $0x1
popq %r12
movq %r12, %rdx
callq 0x64c0
incl 0x15021(%rip)           # 0x2fb40
movq (%rbp), %rcx
leaq 0x3b23(%rip), %rdi      # 0x1e64d
pushq $0x7
jmp 0x1ab6f
callq 0xc83c
incl 0x15007(%rip)           # 0x2fb40
movl %eax, %ebx
leaq 0x14cd6(%rip), %rbp     # 0x2f818
movq (%rbp), %rcx
leaq 0x3a79(%rip), %rdi      # 0x1e5c6
pushq $0x4
popq %rsi
pushq $0x1
popq %r12
movq %r12, %rdx
callq 0x64c0
incl 0x14fde(%rip)           # 0x2fb40
movq (%rbp), %rcx
leaq 0x3af6(%rip), %rdi      # 0x1e663
pushq $0x8
popq %rsi
movq %r12, %rdx
callq 0x64c0
incl 0x14fc2(%rip)           # 0x2fb40
leaq 0x14c93(%rip), %r12     # 0x2f818
movq (%r12), %rdi
leaq 0x3ac5(%rip), %rsi      # 0x1e655
movl %ebx, %edx
xorl %eax, %eax
callq 0x6390
incl 0x14fa1(%rip)           # 0x2fb40
movq (%r12), %rcx
leaq 0x3a0d(%rip), %rdi      # 0x1e5b7
pushq $0x4
popq %rsi
pushq $0x1
popq %rdx
callq 0x64c0
addq $0x8, %r15
movq %r15, %rdi
callq 0x1a0ca
testb %al, %al
je 0x1abd2
movq %r14, %rdi
movq %r15, %rsi
callq 0x1bf8a
jmp 0x1abde
movq (%r15), %rdi
movq (%rdi), %rax
movq %r14, %rsi
callq *0x18(%rax)
addl $-0x4, %r13d
cmpl $0x24, %r13d
ja 0x1ad0a
leaq 0x3891(%rip), %rax      # 0x1e484
movslq (%rax,%r13,4), %rcx
addq %rax, %rcx
jmpq *%rcx
incl 0x14f3e(%rip)           # 0x2fb40
leaq 0x14c0f(%rip), %rax     # 0x2f818
movq (%rax), %rdi
leaq 0x3aa3(%rip), %rsi      # 0x1e6b6
movl %ebx, %edx
xorl %eax, %eax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x6390
incl 0x14f10(%rip)           # 0x2fb40
leaq 0x14be1(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3a64(%rip), %rdi      # 0x1e6a5
jmp 0x1adc8
incl 0x14ef4(%rip)           # 0x2fb40
leaq 0x14bc5(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3a54(%rip), %rdi      # 0x1e6b1
jmp 0x1ad94
incl 0x14ed8(%rip)           # 0x2fb40
leaq 0x14ba9(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x39fd(%rip), %rdi      # 0x1e676
jmp 0x1ad94
incl 0x14ebc(%rip)           # 0x2fb40
leaq 0x14b8d(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3a05(%rip), %rdi      # 0x1e69a
jmp 0x1ad94
incl 0x14ea0(%rip)           # 0x2fb40
leaq 0x14b71(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x39cf(%rip), %rdi      # 0x1e680
jmp 0x1ad94
incl 0x14e84(%rip)           # 0x2fb40
leaq 0x14b55(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x39e5(%rip), %rdi      # 0x1e6b2
jmp 0x1adc8
incl 0x14e68(%rip)           # 0x2fb40
leaq 0x14b39(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3988(%rip), %rdi      # 0x1e671
jmp 0x1ad94
incl 0x14e4c(%rip)           # 0x2fb40
leaq 0x14b1d(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3976(%rip), %rdi      # 0x1e67b
jmp 0x1ad94
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
incl 0x14e21(%rip)           # 0x2fb40
leaq 0x14af2(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x393c(%rip), %rdi      # 0x1e66c
jmp 0x1ad94
incl 0x14e08(%rip)           # 0x2fb40
leaq 0x14ad9(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x3947(%rip), %rdi      # 0x1e690
jmp 0x1ad94
incl 0x14def(%rip)           # 0x2fb40
leaq 0x14ac0(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x394b(%rip), %rdi      # 0x1e6ad
jmp 0x1adc8
incl 0x14dd6(%rip)           # 0x2fb40
leaq 0x14aa7(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x391a(%rip), %rdi      # 0x1e695
jmp 0x1ad94
incl 0x14dbd(%rip)           # 0x2fb40
leaq 0x14a8e(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x38f7(%rip), %rdi      # 0x1e68b
pushq $0x4
jmp 0x1ade5
incl 0x14da2(%rip)           # 0x2fb40
leaq 0x14a73(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x38d6(%rip), %rdi      # 0x1e685
jmp 0x1ade3
incl 0x14d89(%rip)           # 0x2fb40
leaq 0x14a5a(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x38e1(%rip), %rdi      # 0x1e6a9
pushq $0x3
jmp 0x1ade5
incl 0x14d6e(%rip)           # 0x2fb40
leaq 0x14a3f(%rip), %rax     # 0x2f818
movq (%rax), %rcx
leaq 0x38bc(%rip), %rdi      # 0x1e69f
pushq $0x5
popq %rsi
pushq $0x1
popq %rdx
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x64c0