// File: tsoding[P]wcc/src/./wcc_parser.cpp
// Function: print1(_IO_FILE*, Expression)
void print1(FILE *stream, Expression expression)
{
    switch (expression.kind) {
    case Expression_Kind::Type_Cast:
        print(stream, "(cast ", expression.type_cast.type, " ", *expression.type_cast.expression, ")");
        break;
    case Expression_Kind::Number_Literal:
        print(stream, expression.number_literal.unwrap);
        break;
    case Expression_Kind::Bool_Literal:
        if (expression.bool_literal.unwrap) {
            print(stream, "true");
        } else {
            print(stream, "false");
        }
        break;
    case Expression_Kind::Variable:
        print(stream, expression.variable.name);
        break;
    case Expression_Kind::Plus:
        print(stream, "(+ ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Multiply:
        print(stream, "(* ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Minus:
        print(stream, "(- ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Rem:
        print(stream, "(% ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::And:
        print(stream, "(&& ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Greater:
        print(stream, "(> ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Less_Equals:
        print(stream, "(<= ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
        break;
    case Expression_Kind::Equals:
        print(stream, "(== ", *expression.binary_op.lhs, " ", *expression.binary_op.rhs, ")");
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x290, %rsp            # imm = 0x290
leaq 0x10(%rbp), %rax
movq %rax, -0x248(%rbp)
movq %rdi, -0x8(%rbp)
movl (%rax), %eax
movq %rax, -0x240(%rbp)
subq $0xb, %rax
ja 0x4d66
movq -0x240(%rbp), %rax
leaq 0x9cbd(%rip), %rcx      # 0xe278
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movl 0x10(%rax), %edx
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x28(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x20(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x18(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x10(%rbp)
leaq 0xa6cd(%rip), %rsi      # 0xecc9
leaq 0xa68a(%rip), %rcx      # 0xec8d
leaq -0x28(%rbp), %rax
leaq 0xa06b(%rip), %r8       # 0xe679
movq (%rax), %r9
movq %r9, (%rsp)
movq 0x8(%rax), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%rax), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x18(%rsp)
callq 0xa8b0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rsi
callq 0xa960
jmp 0x4d66
movq -0x248(%rbp), %rax
testb $0x1, 0x10(%rax)
je 0x4672
movq -0x8(%rbp), %rdi
leaq 0x9f89(%rip), %rsi      # 0xe5f4
callq 0xa050
jmp 0x4682
movq -0x8(%rbp), %rdi
leaq 0x9f7c(%rip), %rsi      # 0xe5f9
callq 0xa050
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq %rcx, -0x38(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x38(%rbp), %rsi
movq -0x30(%rbp), %rdx
callq 0xa990
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x58(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x50(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x48(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x40(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x78(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x70(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x68(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x60(%rbp)
leaq 0xa5c4(%rip), %rsi      # 0xecd0
leaq -0x58(%rbp), %r8
leaq 0xa576(%rip), %rdx      # 0xec8d
leaq -0x78(%rbp), %rax
leaq 0x9f57(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x98(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x90(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x88(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x80(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0xb8(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0xb0(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0xa8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0xa0(%rbp)
leaq 0xa4f6(%rip), %rsi      # 0xecd4
leaq -0x98(%rbp), %r8
leaq 0xa4a1(%rip), %rdx      # 0xec8d
leaq -0xb8(%rbp), %rax
leaq 0x9e7f(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0xd8(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0xd0(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0xc8(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0xc0(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0xf8(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0xf0(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0xe8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0xe0(%rbp)
leaq 0xa41f(%rip), %rsi      # 0xecd8
leaq -0xd8(%rbp), %r8
leaq 0xa3c6(%rip), %rdx      # 0xec8d
leaq -0xf8(%rbp), %rax
leaq 0x9da4(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x118(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x110(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x108(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x100(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x138(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x130(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x128(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x120(%rbp)
leaq 0xa348(%rip), %rsi      # 0xecdc
leaq -0x118(%rbp), %r8
leaq 0xa2eb(%rip), %rdx      # 0xec8d
leaq -0x138(%rbp), %rax
leaq 0x9cc9(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x158(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x150(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x148(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x140(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x178(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x170(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x168(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x160(%rbp)
leaq 0xa271(%rip), %rsi      # 0xece0
leaq -0x158(%rbp), %r8
leaq 0xa210(%rip), %rdx      # 0xec8d
leaq -0x178(%rbp), %rax
leaq 0x9bee(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x198(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x190(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x188(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x180(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x1b8(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x1b0(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x1a8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x1a0(%rbp)
leaq 0xa19b(%rip), %rsi      # 0xece5
leaq -0x198(%rbp), %r8
leaq 0xa135(%rip), %rdx      # 0xec8d
leaq -0x1b8(%rbp), %rax
leaq 0x9b13(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x1d8(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x1d0(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x1c8(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x1c0(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x1f8(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x1f0(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x1e8(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x1e0(%rbp)
leaq 0xa0c4(%rip), %rsi      # 0xece9
leaq -0x1d8(%rbp), %r8
leaq 0xa05a(%rip), %rdx      # 0xec8d
leaq -0x1f8(%rbp), %rax
leaq 0x9a38(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
jmp 0x4d66
movq -0x248(%rbp), %rax
movq -0x8(%rbp), %rdi
movq 0x10(%rax), %rcx
movq (%rcx), %rdx
movq %rdx, -0x218(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x210(%rbp)
movq 0x10(%rcx), %rdx
movq %rdx, -0x208(%rbp)
movq 0x18(%rcx), %rcx
movq %rcx, -0x200(%rbp)
movq 0x18(%rax), %rax
movq (%rax), %rcx
movq %rcx, -0x238(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x230(%rbp)
movq 0x10(%rax), %rcx
movq %rcx, -0x228(%rbp)
movq 0x18(%rax), %rax
movq %rax, -0x220(%rbp)
leaq 0x9fee(%rip), %rsi      # 0xecee
leaq -0x218(%rbp), %r8
leaq 0x9f7f(%rip), %rdx      # 0xec8d
leaq -0x238(%rbp), %rax
leaq 0x995d(%rip), %rcx      # 0xe679
movq (%r8), %r9
movq %r9, (%rsp)
movq 0x8(%r8), %r9
movq %r9, 0x8(%rsp)
movq 0x10(%r8), %r9
movq %r9, 0x10(%rsp)
movq 0x18(%r8), %r8
movq %r8, 0x18(%rsp)
movq (%rax), %r8
movq %r8, 0x20(%rsp)
movq 0x8(%rax), %r8
movq %r8, 0x28(%rsp)
movq 0x10(%rax), %r8
movq %r8, 0x30(%rsp)
movq 0x18(%rax), %rax
movq %rax, 0x38(%rsp)
callq 0xa9d0
addq $0x290, %rsp            # imm = 0x290
popq %rbp
retq
nop