// File: /workspace/github_c_makefile_star2_O0/yutopp[P]cc/asm_x86_64.c
// Function: asm_x86_64_fprint
void asm_x86_64_fprint(FILE* fp, ASM_X86_64* a) {
	fprintf(fp, ".file	\"simple_00.c\"\n"); // TODO
	fprintf(fp, ".text\n");                  // TODO

    for(size_t i=0; i<vector_len(a->insts); ++i) {
        ASM_X86_64_Inst* inst = vector_at(a->insts, i);
        switch(inst->kind) {
        case ASM_X86_64_INST_KIND_SECTION:
            fprintf(fp, "\t");
            fprintf(fp, ".section\t%s\n", inst->value.section.name);
            break;

        case ASM_X86_64_INST_KIND_STRING:
            fprintf(fp, "\t");
            fprintf(fp, ".string\t\"%s\"\n", inst->value.string.s);
            break;

        case ASM_X86_64_INST_KIND_TEXT:
            fprintf(fp, "\t");
            fprintf(fp, ".text\n");
            break;

        case ASM_X86_64_INST_KIND_GLOBAL:
            fprintf(fp, "\t");
            fprintf(fp, ".globl\t%s\n", inst->value.global.name);
            break;

        case ASM_X86_64_INST_KIND_TYPE:
            fprintf(fp, "\t");
            fprintf(fp, ".type\t%s, %s\n", inst->value.type.name, inst->value.type.type);
            break;

        case ASM_X86_64_INST_KIND_LABEL:
            fprintf(fp, "%s:\n", inst->value.label.name);
            break;

        case ASM_X86_64_INST_KIND_OP:
        {
            fprintf(fp, "\t");
            ASM_X86_64_Value* args = inst->value.op.args;
            switch(inst->value.op.op) {
            case ASM_X86_64_OP_PUSHQ:
                fprint_inst_op(fp, "pushq", 1, &args[0]);
                break;

            case ASM_X86_64_OP_POPQ:
                fprint_inst_op(fp, "popq", 1, &args[0]);
                break;

            case ASM_X86_64_OP_MOVQ:
                fprint_inst_op(fp, "movq", 2, &args[1], &args[0]);
                break;

            case ASM_X86_64_OP_ADDQ:
                fprint_inst_op(fp, "addq", 2, &args[1], &args[0]);
                break;

            case ASM_X86_64_OP_SUBQ:
                fprint_inst_op(fp, "subq", 2, &args[1], &args[0]);
                break;

            case ASM_X86_64_OP_LEAQ:
                fprint_inst_op(fp, "leaq", 2, &args[1], &args[0]);
                break;

            case ASM_X86_64_OP_CALL:
                fprint_inst_op(fp, "call", 1, &args[0]);
                break;

            case ASM_X86_64_OP_CMPQ:
                fprint_inst_op(fp, "cmp", 2, &args[1], &args[0]);
                break;

            case ASM_X86_64_OP_JMP:
                fprint_inst_op(fp, "jmp", 1, &args[0]);
                break;

            case ASM_X86_64_OP_JE:
                fprint_inst_op(fp, "je", 1, &args[0]);
                break;

            case ASM_X86_64_OP_RET:
                fprint_inst_op(fp, "ret", 0);
                break;

            default:
                assert(0); // TODO: error handling...
            }
            break;
        }
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq -0x8(%rbp), %rdi
leaq 0x4835(%rip), %rsi      # 0xbb60
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
leaq 0x4838(%rip), %rsi      # 0xbb75
movb $0x0, %al
callq 0x10e0
movq $0x0, -0x18(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rdi
callq 0x4580
movq %rax, %rcx
movq -0x30(%rbp), %rax
cmpq %rcx, %rax
jae 0x76b0
movq -0x10(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x4530
movq %rax, -0x20(%rbp)
movq -0x20(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x38(%rbp)
subq $0x6, %rax
ja 0x769d
movq -0x38(%rbp), %rax
leaq 0x46f5(%rip), %rcx      # 0xba98
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
leaq 0x47c5(%rip), %rsi      # 0xbb7c
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x47ad(%rip), %rsi      # 0xbb7e
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
leaq 0x4794(%rip), %rsi      # 0xbb7c
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x4789(%rip), %rsi      # 0xbb8b
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
leaq 0x4763(%rip), %rsi      # 0xbb7c
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
leaq 0x474a(%rip), %rsi      # 0xbb75
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
leaq 0x473a(%rip), %rsi      # 0xbb7c
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x473d(%rip), %rsi      # 0xbb99
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
leaq 0x4709(%rip), %rsi      # 0xbb7c
movb $0x0, %al
callq 0x10e0
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rcx
leaq 0x470f(%rip), %rsi      # 0xbba4
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rdx
leaq 0x417e(%rip), %rsi      # 0xb632
movb $0x0, %al
callq 0x10e0
jmp 0x769d
movq -0x8(%rbp), %rdi
leaq 0x46b1(%rip), %rsi      # 0xbb7c
xorl %eax, %eax
callq 0x10e0
movq -0x20(%rbp), %rax
addq $0x10, %rax
movq %rax, -0x28(%rbp)
movq -0x20(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x40(%rbp)
subq $0xb, %rax
ja 0x767c
movq -0x40(%rbp), %rax
leaq 0x45b6(%rip), %rcx      # 0xbab4
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
leaq 0x469c(%rip), %rsi      # 0xbbb2
movl $0x1, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
leaq 0x4682(%rip), %rsi      # 0xbbb8
movl $0x1, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
addq $0x18, %rcx
movq -0x28(%rbp), %r8
leaq 0x465f(%rip), %rsi      # 0xbbbd
movl $0x2, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
addq $0x18, %rcx
movq -0x28(%rbp), %r8
leaq 0x463c(%rip), %rsi      # 0xbbc2
movl $0x2, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
addq $0x18, %rcx
movq -0x28(%rbp), %r8
leaq 0x4619(%rip), %rsi      # 0xbbc7
movl $0x2, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
addq $0x18, %rcx
movq -0x28(%rbp), %r8
leaq 0x45f6(%rip), %rsi      # 0xbbcc
movl $0x2, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
leaq 0x45db(%rip), %rsi      # 0xbbd1
movl $0x1, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
addq $0x18, %rcx
movq -0x28(%rbp), %r8
leaq 0x45b8(%rip), %rsi      # 0xbbd6
movl $0x2, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
leaq 0x459f(%rip), %rsi      # 0xbbda
movl $0x1, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
movq -0x28(%rbp), %rcx
leaq 0x4586(%rip), %rsi      # 0xbbde
movl $0x1, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
movq -0x8(%rbp), %rdi
leaq 0x4570(%rip), %rsi      # 0xbbe1
xorl %edx, %edx
movb $0x0, %al
callq 0x76c0
jmp 0x769b
leaq 0x42e3(%rip), %rdi      # 0xb966
leaq 0x455b(%rip), %rsi      # 0xbbe5
movl $0x14b, %edx            # imm = 0x14B
leaq 0x455c(%rip), %rcx      # 0xbbf2
callq 0x10b0
jmp 0x769d
jmp 0x769f
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
jmp 0x734c
addq $0x40, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)