// File: tsoding[P]wcc/src/./wcc_wat_compiler.cpp
// Function: Wat_Compiler::compile_expression(Expression*)
S_Expr *Wat_Compiler::compile_expression(Expression *expression)
{
    switch (expression->kind) {
    case Expression_Kind::Type_Cast:
        return compile_type_cast(expression->type_cast);
    case Expression_Kind::Number_Literal:
        return compile_number_literal(expression->number_literal);
    case Expression_Kind::Bool_Literal:
        return compile_bool_literal(expression->bool_literal);
    case Expression_Kind::Variable:
        return compile_variable(expression->variable);
    case Expression_Kind::Plus:
        return compile_plus(expression->binary_op);
    case Expression_Kind::Multiply:
        return compile_multiply(expression->binary_op);
    case Expression_Kind::Greater:
        return compile_greater(expression->binary_op);
    case Expression_Kind::Rem:
        return compile_rem(expression->binary_op);
    case Expression_Kind::Minus:
        return compile_minus(expression->binary_op);
    case Expression_Kind::And:
        return compile_and(expression->binary_op);
    case Expression_Kind::Less_Equals:
        return compile_less_equals(expression->binary_op);
    case Expression_Kind::Equals:
        return compile_equals(expression->binary_op);
    }

    assert(0 && "Memory corruption?");
    return nullptr;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x18(%rbp), %rax
movl (%rax), %eax
movq %rax, -0xd0(%rbp)
subq $0xb, %rax
ja 0x737d
movq -0xd0(%rbp), %rax
leaq 0x72c5(%rip), %rcx      # 0xe3d8
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x28(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x20(%rbp)
movl -0x28(%rbp), %esi
movq -0x20(%rbp), %rdx
callq 0x8280
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rsi
callq 0x6d10
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movb 0x10(%rax), %al
movb %al, -0x31(%rbp)
movzbl -0x31(%rbp), %esi
callq 0x6d80
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x48(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x48(%rbp), %rsi
movq -0x40(%rbp), %rdx
callq 0x6e50
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x58(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x58(%rbp), %rsi
movq -0x50(%rbp), %rdx
callq 0x7790
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x68(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x68(%rbp), %rsi
movq -0x60(%rbp), %rdx
callq 0x75a0
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x78(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x78(%rbp), %rsi
movq -0x70(%rbp), %rdx
callq 0x7e60
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x88(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x80(%rbp)
movq -0x88(%rbp), %rsi
movq -0x80(%rbp), %rdx
callq 0x6ee0
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0x98(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x90(%rbp)
movq -0x98(%rbp), %rsi
movq -0x90(%rbp), %rdx
callq 0x73b0
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0xa8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0xa0(%rbp)
movq -0xa8(%rbp), %rsi
movq -0xa0(%rbp), %rdx
callq 0x80d0
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0xb8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0xb0(%rbp)
movq -0xb8(%rbp), %rsi
movq -0xb0(%rbp), %rdx
callq 0x7980
movq %rax, -0x8(%rbp)
jmp 0x739c
movq -0xd8(%rbp), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rcx
movq %rcx, -0xc8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0xc0(%rbp)
movq -0xc8(%rbp), %rsi
movq -0xc0(%rbp), %rdx
callq 0x7bf0
movq %rax, -0x8(%rbp)
jmp 0x739c
leaq 0x7d9b(%rip), %rdi      # 0xf11f
leaq 0x7b2d(%rip), %rsi      # 0xeeb8
movl $0x1b3, %edx            # imm = 0x1B3
leaq 0x8888(%rip), %rcx      # 0xfc1f
callq 0x10c0
movq -0x8(%rbp), %rax
addq $0xe0, %rsp
popq %rbp
retq
nopl (%rax)