// File: /workspace/github_cpp_makefile_star2_O1/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 0x3667
movq %rdi, %rax
leaq 0x10(%rbp), %rcx
leaq 0x6d56(%rip), %rsi      # 0xa17c
movslq (%rsi,%rdx,4), %rdx
addq %rsi, %rdx
jmpq *%rdx
movq 0x10(%rcx), %rdx
leaq 0x6f77(%rip), %rsi      # 0xa3b1
movq %rax, %rdi
xorl %eax, %eax
addq $0x40, %rsp
popq %rbp
jmp 0x1120
cmpb $0x1, 0x10(%rcx)
jne 0x366d
leaq 0x6f62(%rip), %rdi      # 0xa3bc
movl $0x1, %esi
movl $0x4, %edx
jmp 0x367e
movl 0x10(%rcx), %edx
movq 0x18(%rcx), %rcx
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
leaq 0x7544(%rip), %rsi      # 0xa9cb
leaq 0x7501(%rip), %rcx      # 0xa98f
leaq 0x6fac(%rip), %r8       # 0xa441
movq %rax, %rdi
callq 0x7495
jmp 0x3667
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 0x7504(%rip), %rsi      # 0xa9d6
jmp 0x3651
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 0x74cb(%rip), %rsi      # 0xa9d2
jmp 0x3651
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 0x74ab(%rip), %rsi      # 0xa9e7
jmp 0x3651
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 0x746d(%rip), %rsi      # 0xa9de
jmp 0x3651
movq 0x10(%rcx), %rdx
movq 0x18(%rcx), %rdi
movl $0x1, %esi
jmp 0x367e
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 0x7433(%rip), %rsi      # 0xa9eb
jmp 0x3651
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 0x73ed(%rip), %rsi      # 0xa9da
jmp 0x3651
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 0x73d1(%rip), %rsi      # 0xa9f0
jmp 0x3651
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 0x7391(%rip), %rsi      # 0xa9e2
leaq 0x7337(%rip), %rdx      # 0xa98f
leaq 0x6de2(%rip), %rcx      # 0xa441
movq %rax, %rdi
callq 0x7538
addq $0x40, %rsp
popq %rbp
retq
leaq 0x6d4d(%rip), %rdi      # 0xa3c1
movl $0x1, %esi
movl $0x5, %edx
movq %rax, %rcx
addq $0x40, %rsp
popq %rbp
jmp 0x1190