// File: /workspace/github_cpp_makefile_star2_O3/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 $0x40, %rsp
movl 0x10(%rbp), %edx
cmpq $0xb, %rdx
ja 0x36a3
movq %rdi, %rax
leaq 0x10(%rbp), %rcx
leaq 0x5d2e(%rip), %rsi      # 0x9190
movslq (%rsi,%rdx,4), %rdx
addq %rsi, %rdx
jmpq *%rdx
movq 0x10(%rcx), %rdx
leaq 0x5f5b(%rip), %rsi      # 0x93d1
movq %rax, %rdi
xorl %eax, %eax
addq $0x40, %rsp
popq %rbp
jmp 0x1120
cmpb $0x1, 0x10(%rcx)
jne 0x36a9
leaq 0x5f46(%rip), %rdi      # 0x93dc
movl $0x1, %esi
movl $0x4, %edx
jmp 0x36ba
movl 0x10(%rcx), %edx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x6528(%rip), %rsi      # 0x99eb
leaq 0x64e5(%rip), %rcx      # 0x99af
leaq 0x5f90(%rip), %r8       # 0x9461
movq %rax, %rdi
callq 0x71f9
jmp 0x36a3
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x64e8(%rip), %rsi      # 0x99f6
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x64af(%rip), %rsi      # 0x99f2
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x648f(%rip), %rsi      # 0x9a07
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x6451(%rip), %rsi      # 0x99fe
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rdi
movl $0x1, %esi
jmp 0x36ba
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x6417(%rip), %rsi      # 0x9a0b
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x63d1(%rip), %rsi      # 0x99fa
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x63b5(%rip), %rsi      # 0x9a10
jmp 0x368d
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rdx), %xmm0
movups 0x10(%rdx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x6375(%rip), %rsi      # 0x9a02
leaq 0x631b(%rip), %rdx      # 0x99af
leaq 0x5dc6(%rip), %rcx      # 0x9461
movq %rax, %rdi
callq 0x729c
addq $0x40, %rsp
popq %rbp
retq
leaq 0x5d31(%rip), %rdi      # 0x93e1
movl $0x1, %esi
movl $0x5, %edx
movq %rax, %rcx
addq $0x40, %rsp
popq %rbp
jmp 0x1190