// File: /workspace/github_cpp_makefile_star2_O2/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), %ecx
cmpq $0xb, %rcx
ja 0x300c
leaq 0x10(%rbp), %rax
leaq 0x52f5(%rip), %rdx      # 0x80dc
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movq 0x10(%rax), %rsi
addq $0x40, %rsp
popq %rbp
jmp 0x178c
cmpb $0x1, 0x10(%rax)
jne 0x3012
leaq 0x55c1(%rip), %rsi      # 0x83d0
jmp 0x3019
movl 0x10(%rax), %edx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5bad(%rip), %rsi      # 0x89df
leaq 0x5b6a(%rip), %rcx      # 0x89a3
leaq 0x5615(%rip), %r8       # 0x8455
callq 0x6014
jmp 0x300c
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5b70(%rip), %rsi      # 0x89ea
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5b37(%rip), %rsi      # 0x89e6
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5b17(%rip), %rsi      # 0x89fb
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5ad9(%rip), %rsi      # 0x89f2
jmp 0x2ff9
movq 0x10(%rax), %rsi
movq 0x18(%rax), %rdx
addq $0x40, %rsp
popq %rbp
jmp 0x12c0
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5a9f(%rip), %rsi      # 0x89ff
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5a59(%rip), %rsi      # 0x89ee
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x5a3d(%rip), %rsi      # 0x8a04
jmp 0x2ff9
movq 0x10(%rax), %rcx
movq 0x18(%rax), %rax
movups (%rax), %xmm0
movups 0x10(%rax), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x59fd(%rip), %rsi      # 0x89f6
leaq 0x59a3(%rip), %rdx      # 0x89a3
leaq 0x544e(%rip), %rcx      # 0x8455
callq 0x607a
addq $0x40, %rsp
popq %rbp
retq
leaq 0x53bc(%rip), %rsi      # 0x83d5
addq $0x40, %rsp
popq %rbp
jmp 0x16f9