LLM4Binary/decompile-bench-makefile huggingface dataset:
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/eval.c
// Function: do_op
long long do_op(int op, int lhs, int rhs, int trs) {
	switch (op) {
		case TOK_QMK:		return (lhs) ? rhs : trs;
		case TOK_NOT:		return !lhs;
		case TOK_TLD:		return ~lhs;
		case TOK_ASR:		return lhs * rhs;
		case TOK_DIV:		return lhs / rhs;
		case TOK_MOD:		return lhs % rhs;
		case TOK_ADD:		return lhs + rhs;
		case TOK_SUB:		return lhs - rhs;
		case TOK_LSHIFT:	return lhs << rhs;
		case TOK_RSHIFT:	return lhs >> rhs;
		case TOK_GTH:		return lhs > rhs;
		case TOK_LTH:		return lhs < rhs;
		case TOK_GEQ:		return lhs >= rhs;
		case TOK_LEQ:		return lhs <= rhs;
		case TOK_EQ: 		return lhs == rhs;
		case TOK_NEQ:		return lhs != rhs;
		case TOK_AND:		return lhs & rhs;
		case TOK_XOR:		return lhs ^ rhs;
		case TOK_OR:		return lhs | rhs;
		case TOK_LOGIC_AND:	return lhs && rhs;
		case TOK_LOGIC_OR:	return lhs || rhs;
		case TOK_CMM:		return lhs, rhs;
	}
	return -1;
}

// Assembly:
pushq $-0x1
popq %rax
addl $-0x3, %edi
cmpl $0x23, %edi
ja 0x3895
movl %edx, %r8d
leaq 0x88c0(%rip), %rdx      # 0xc0bc
movslq (%rdx,%rdi,4), %rdi
addq %rdx, %rdi
jmpq *%rdi
testl %esi, %esi
cmovel %ecx, %r8d
jmp 0x3892
testl %esi, %esi
setne %al
testl %r8d, %r8d
setne %cl
andb %al, %cl
movzbl %cl, %eax
retq
movl %r8d, %ecx
sarl %cl, %esi
jmp 0x38ab
xorl %eax, %eax
cmpl %r8d, %esi
setle %al
retq
notl %esi
jmp 0x38ab
xorl %eax, %eax
cmpl %r8d, %esi
setg %al
retq
xorl %eax, %eax
testl %esi, %esi
jmp 0x387b
addl %esi, %r8d
jmp 0x3892
movl %esi, %eax
cltd
idivl %r8d
cltq
retq
xorl %eax, %eax
cmpl %r8d, %esi
setl %al
retq
movl %esi, %eax
cltd
idivl %r8d
movslq %edx, %rax
retq
andl %esi, %r8d
jmp 0x3892
xorl %eax, %eax
cmpl %r8d, %esi
setge %al
retq
xorl %eax, %eax
cmpl %r8d, %esi
sete %al
retq
subl %r8d, %esi
jmp 0x38ab
imull %esi, %r8d
jmp 0x3892
xorl %esi, %r8d
jmp 0x3892
orl %esi, %r8d
movslq %r8d, %rax
retq
xorl %eax, %eax
orl %esi, %r8d
jmp 0x38a2
xorl %eax, %eax
cmpl %r8d, %esi
setne %al
retq
movl %r8d, %ecx
shll %cl, %esi
movslq %esi, %rax
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/eval.c
// Function: do_calc
void do_calc(vector *ops, vector *vals) {
	int op = (long long)vector_pop(ops);
	int trs = (op == TOK_QMK) ? (long long)vector_pop(vals) : 0;
	int rhs = (!is_unary(op)) ? (long long)vector_pop(vals) : 0;
	int lhs = (long long)vector_pop(vals);
	long long res = do_op(op, lhs, rhs, trs);
	vector_push(vals, (void*)res);
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, %rbx
callq 0xbf8b
movq %rax, %r14
xorl %r15d, %r15d
cmpl $0x32, %r14d
je 0x38f5
cmpl $0x18, %r14d
je 0x38f5
cmpl $0x21, %r14d
je 0x38f5
cmpl $0xf, %r14d
jne 0x38e8
movq %rbx, %rdi
callq 0xbf8b
movq %rax, %r15
movq %rbx, %rdi
callq 0xbf8b
movq %rax, %r12
jmp 0x38f8
xorl %r12d, %r12d
movq %rbx, %rdi
callq 0xbf8b
movl %r14d, %edi
movl %eax, %esi
movl %r12d, %edx
movl %r15d, %ecx
callq 0x37e3
movq %rbx, %rdi
movq %rax, %rsi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
jmp 0xbf86
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/eval.c
// Function: eval_constexpr_ast
int _eval_constexpr_ast(ast_n *node, int *err) {
	if (node == NULL) return 0;

	//Perform action
	s_pos *loc = &node->tok.loc;
	int l_res = _eval_constexpr_ast(node->dat.expr.left, err);
	int r_res = _eval_constexpr_ast(node->dat.expr.right, err);
	int t_res = 0;
	switch (node->dat.expr.kind) {
		case EXPR_COND: {
			ast_n *res = node->dat.expr.right;
			r_res = _eval_constexpr_ast(res->dat.expr.left, err);
			t_res = _eval_constexpr_ast(res->dat.expr.right, err);
			}
			return do_op(node->tok.type, l_res, r_res, t_res); 
		case EXPR_COND_RES:
			return 0;
		case EXPR_LOGIC_OR:
		case EXPR_LOGIC_AND:
		case EXPR_OR:
		case EXPR_XOR:
		case EXPR_AND:
		case EXPR_GTH:
		case EXPR_LTH:
		case EXPR_GEQ:
		case EXPR_LEQ:
		case EXPR_LSHIFT:
		case EXPR_RSHIFT:
		case EXPR_EQ:
		case EXPR_NEQ:
		case EXPR_ADD:
		case EXPR_SUB:
		case EXPR_MUL:
		case EXPR_DIV:
			return do_op(node->tok.type, l_res, r_res, 0);
		case EXPR_MOD:
		case EXPR_POS:
		case EXPR_NEG:
		case EXPR_NOT:
		case EXPR_LOGIC_NOT:
			return do_op(node->tok.type, l_res, 0, 0);
			break;
		case EXPR_CAST:
		case EXPR_REF:
		case EXPR_DEREF:
		case EXPR_INC_PRE:
		case EXPR_DEC_PRE:
		case EXPR_ARRAY:
		case EXPR_CALL:
		case EXPR_MEMB:
		case EXPR_PTR_MEMB:
		case EXPR_INC_POST:
		case EXPR_DEC_POST:
			c_error(loc, "Invalid operation in constant expression\n");
			return 0;
		case EXPR_IDENT:
			c_error(loc, "Identifier in constant expression\n");
			return 0;
		case EXPR_CONST:
			if (node->tok.dtype->kind == TYPE_FLOAT)
				c_error(loc, "Floating point value in constant expression\n");
			return node->tok.dat.ival;
		default:
			c_error(loc, "Invalid constant expression\n");
			break;
	}
	return -1;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
xorl %ebx, %ebx
testq %rdi, %rdi
je 0x3c9c
movq %rsi, %r12
movq %rdi, %r14
leaq 0x38(%rdi), %r15
movq 0x20(%rdi), %rdi
callq 0x3c1c
movl %eax, %ebp
movq 0x28(%r14), %rdi
movq %r12, %rsi
callq 0x3c1c
movl 0x8(%r14), %ecx
decl %ecx
cmpl $0x24, %ecx
ja 0x3cfa
leaq 0x84ea(%rip), %rdx      # 0xc14c
movslq (%rdx,%rcx,4), %rcx
addq %rdx, %rcx
jmpq *%rcx
movl 0x30(%r14), %edi
movl %ebp, %esi
movl %eax, %edx
jmp 0x3c92
leaq 0x869e(%rip), %rsi      # 0xc31a
xorl %ebx, %ebx
movq %r15, %rdi
xorl %eax, %eax
callq 0x35e4
jmp 0x3c9c
movl 0x30(%r14), %edi
movl %ebp, %esi
xorl %edx, %edx
xorl %ecx, %ecx
callq 0x37e3
movq %rax, %rbx
movl %ebx, %eax
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
movq 0x28(%r14), %r15
movq 0x20(%r15), %rdi
movq %r12, %rsi
callq 0x3c1c
movl %eax, %ebx
movq 0x28(%r15), %rdi
movq %r12, %rsi
callq 0x3c1c
movl 0x30(%r14), %edi
movl %ebp, %esi
movl %ebx, %edx
movl %eax, %ecx
jmp 0x3c94
leaq 0x871b(%rip), %rsi      # 0xc3f3
jmp 0x3c7c
movq 0x58(%r14), %rax
cmpl $0x7, (%rax)
jne 0x3cf4
leaq 0x85ba(%rip), %rsi      # 0xc2a4
movq %r15, %rdi
xorl %eax, %eax
callq 0x35e4
movl 0x50(%r14), %ebx
jmp 0x3c9c
leaq 0x8715(%rip), %rsi      # 0xc416
movq %r15, %rdi
xorl %eax, %eax
callq 0x35e4
pushq $-0x1
popq %rbx
jmp 0x3c9c
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/eval.c
// Function: eval_constexpr_ast
int eval_constexpr_ast(ast_n *root, int *err) {
	int eflag_prev = c_errflag;
	int res = _eval_constexpr_ast(root, err);
	*err = !eflag_prev && c_errflag;
	return res;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
movq %rsi, %rbx
leaq 0xf756(%rip), %r14      # 0x13474
cmpl $0x0, (%r14)
sete %bpl
callq 0x3c1c
cmpl $0x0, (%r14)
setne %cl
andb %bpl, %cl
movzbl %cl, %ecx
movl %ecx, (%rbx)
popq %rbx
popq %r14
popq %rbp
retq
nop
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_numlabel
char *gen_numlabel(asm_f *f) {
	//Generate a label and store it in the map
	int num = f->lnum++;
	char *buf = malloc(16);
	snprintf(buf, 16, ".L%i", num);
	map_insert(&f->labels, buf, buf);
	return buf;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl 0x28(%rdi), %r14d
leal 0x1(%r14), %eax
movl %eax, 0x28(%rdi)
pushq $0x10
popq %r15
movq %r15, %rdi
callq 0x3170
movq %rax, %r12
leaq 0x8788(%rip), %rdx      # 0xc4f4
movq %rax, %rdi
movq %r15, %rsi
movl %r14d, %ecx
xorl %eax, %eax
callq 0x30d0
addq $0x30, %rbx
movq %rbx, %rdi
movq %r12, %rsi
movq %r12, %rdx
callq 0xbd89
movq %r12, %rax
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_expr
void gen_expr(asm_f *f, ast_n *n) {
	switch (n->dat.expr.kind) {
		case EXPR_ASSIGN:
			break;
		case EXPR_LOGIC_AND:
		case EXPR_LOGIC_OR:
			gen_expr_logic_andor(f, n);
			break;
		case EXPR_LOGIC_NOT:
			break;
		case EXPR_EQ:
		case EXPR_NEQ:
		case EXPR_GTH:
		case EXPR_LTH:
		case EXPR_GEQ:
		case EXPR_LEQ:
			gen_expr_cmp(f, n);
			break;
		case EXPR_AND:
		case EXPR_OR:
		case EXPR_XOR:
			gen_expr_bitwise(f, n);
			break;
		case EXPR_NOT:
			gen_expr(f, n->dat.expr.left);
			asmf_add_inst(f, mk_inst(INST_NOT, 1,
				mk_oprd(OPRD_REG, EAX)
			));
			break;
		case EXPR_ADD:
		case EXPR_SUB:
		case EXPR_MUL:
		case EXPR_DIV:
		case EXPR_MOD:
		case EXPR_LSHIFT:
		case EXPR_RSHIFT:
			//gen_expr_arith(
			break;
		case EXPR_CAST:
		case EXPR_REF:
			gen_expr_ref(f, n);
			break;
		case EXPR_DEREF:
			gen_expr_deref(f, n);
			break;
		case EXPR_POS:
		case EXPR_NEG:
		case EXPR_INC_PRE:
		case EXPR_DEC_PRE:
		case EXPR_ARRAY:
			gen_expr_array(f, n);
			break;
		case EXPR_CALL:
			gen_expr_call(f, n);
			break;
		case EXPR_MEMB:
		case EXPR_PTR_MEMB:
		case EXPR_INC_POST:
		case EXPR_DEC_POST:
		case EXPR_IDENT:
			//gen_expr_var
			break;
		case EXPR_CONST:
		case EXPR_STR:
			gen_expr_immd(f, n);
			break;
	}

	return;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0x40, %rsp
movl 0x8(%rsi), %eax
decl %eax
cmpl $0x1e, %eax
ja 0x4167
movq %rdi, %rbx
leaq 0x835f(%rip), %rcx      # 0xc434
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x4190
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x455a
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x4385
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x3d9f
movq 0x20(%rsi), %rsi
movq %rbx, %rdi
callq 0x40b5
leaq 0x20(%rsp), %r14
pushq $0x1
popq %rbp
movq %r14, %rdi
xorl %esi, %esi
movl %ebp, %edx
callq 0x50d0
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x43
popq %rdi
movl %ebp, %esi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
retq
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x44d0
movq %rbx, %rdi
addq $0x40, %rsp
popq %rbx
popq %r14
popq %rbp
jmp 0x4680
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_expr_bitwise
void gen_expr_bitwise(asm_f *f, ast_n *n) {
	int bit_i = -1;
	switch (n->dat.expr.kind) {
		case EXPR_AND: bit_i = INST_AND; break;
		case EXPR_OR:  bit_i = INST_OR;  break;
		case EXPR_XOR: bit_i = INST_XOR; break;
	}

	//Perform bitwise operation
	gen_expr(f, n->dat.expr.left);
	asmf_add_inst(f, mk_inst(INST_PUSH, 1, mk_oprd(OPRD_REG, RAX)));
	gen_expr(f, n->dat.expr.right);
	asmf_add_inst(f, mk_inst(INST_POP, 1, mk_oprd(OPRD_REG, RBX)));
	asmf_add_inst(f, mk_inst(bit_i, 2, 
		mk_oprd(OPRD_REG, RAX),
		mk_oprd(OPRD_REG, RBX)
	));

	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc0, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movl 0x8(%rsi), %eax
addl $-0x5, %eax
cmpl $0x2, %eax
ja 0x43b3
movl %eax, %eax
leaq 0x813a(%rip), %rcx      # 0xc4e8
movl (%rcx,%rax,4), %ebp
jmp 0x43b6
pushq $-0x1
popq %rbp
movq 0x20(%r14), %rsi
movq %rbx, %rdi
callq 0x40b5
leaq 0xa0(%rsp), %r15
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x36
popq %rdi
pushq $0x1
popq %r15
movl %r15d, %esi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
movq 0x28(%r14), %rsi
movq %rbx, %rdi
callq 0x40b5
leaq 0x80(%rsp), %r12
pushq $0xf
popq %r14
movq %r12, %rdi
xorl %esi, %esi
movl %r14d, %edx
callq 0x50d0
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x37
popq %rdi
movl %r15d, %esi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
leaq 0x60(%rsp), %r15
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
leaq 0x40(%rsp), %r12
movq %r12, %rdi
xorl %esi, %esi
movl %r14d, %edx
callq 0x50d0
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x2
popq %rsi
movl %ebp, %edi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0xc0, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_expr_deref
void gen_expr_deref(asm_f *f, ast_n *n) {
	gen_expr(f, n->dat.expr.left);
	asmf_add_inst(f, mk_inst(INST_MOV, 2, 
		mk_oprd(OPRD_REG, RAX),
		mk_oprd_ex(OPRD_REG, RAX, DEREF, 0)
	));

	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
subq $0x80, %rsp
movq %rdi, %rbx
movq 0x20(%rsi), %rsi
callq 0x40b5
leaq 0x60(%rsp), %r14
movq %r14, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
leaq 0x40(%rsp), %r15
pushq $0x1
popq %rcx
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
xorl %r8d, %r8d
callq 0x50dd
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x3e
popq %rdi
pushq $0x2
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0x80, %rsp
popq %rbx
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_expr_array
void gen_expr_array(asm_f *f, ast_n *n) {
	gen_expr(f, n->dat.expr.left);
	asmf_add_inst(f, mk_inst(INST_MOV, 2, 
		mk_oprd(OPRD_REG, RBX),
		mk_oprd(OPRD_REG, RAX)
	));

	ast_n *ofs = n->dat.expr.right;
	if (ofs->dat.expr.kind == EXPR_CONST) {
		if (ofs->dat.expr.sym->type->kind != TYPE_INT) {
			c_error(NULL, "Array offset must be an integer\n");
			return;
		}
		asmf_add_inst(f, mk_inst(INST_MOV, 2, 
			mk_oprd(OPRD_REG, RAX),
			mk_oprd_ex(OPRD_REG, RAX, DEREF_IMM, 0) //placeholder
		));
	}

	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xc8, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq 0x20(%rsi), %rsi
callq 0x40b5
leaq 0xa8(%rsp), %r15
pushq $0xf
popq %rdx
movq %r15, %rdi
xorl %esi, %esi
callq 0x50d0
leaq 0x88(%rsp), %r12
movq %r12, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x3e
popq %rdi
pushq $0x2
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
movq 0x28(%r14), %rax
cmpl $0x25, 0x8(%rax)
jne 0x4671
movq 0x18(%rax), %rax
movq 0x8(%rax), %rax
cmpl $0x6, (%rax)
jne 0x4661
leaq 0x68(%rsp), %r14
movq %r14, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
leaq 0x48(%rsp), %r15
pushq $0x3
popq %rcx
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
xorl %r8d, %r8d
callq 0x50dd
movups (%r15), %xmm0
movups 0x10(%r15), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x3e
popq %rdi
pushq $0x2
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
jmp 0x4671
leaq 0x7e91(%rip), %rsi      # 0xc4f9
xorl %edi, %edi
xorl %eax, %eax
callq 0x35e4
addq $0xc8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_cmpd
void gen_stmt_cmpd(asm_f *f, ast_n *n) {
	ast_n *n_cur = n->next;
	while (n_cur != NULL) {
		switch (n_cur->kind) {
			case STMT: gen_stmt(f, n_cur); break;
			case DECL: gen_decl(f, n_cur); break;
		}
		n_cur = n_cur->next;
	}
	return;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
movq 0x60(%rbx), %rbx
testq %rbx, %rbx
je 0x481c
cmpl $0x2, (%rbx)
jne 0x4801
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4824
jmp 0x4801
addq $0x8, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt
void gen_stmt(asm_f *f, ast_n *n) {
	switch (n->dat.stmt.kind) {
		case STMT_EXPR:   gen_expr(f, n->dat.stmt.expr);break;
		case STMT_CMPD:   gen_stmt_cmpd(f, n); 		break;
		case STMT_IF: 	  gen_stmt_if(f, n);		break;
		case STMT_SWITCH: gen_stmt_switch(f, n);	break;
		case STMT_WHILE:
		case STMT_FOR:
		case STMT_DO_WHILE:
			gen_stmt_loop(f, n);
			break;
		case STMT_LABEL:
			gen_stmt_label(f, n);
			break;
		case STMT_CASE:
			c_error(NULL, "Case label not inside switch statement\n");
			break;
		case STMT_DEFAULT:
			c_error(NULL, "'default' label not inside switch statement\n");
			break;
		case STMT_GOTO: gen_stmt_goto(f, n);		break;
		case STMT_CONTINUE:
			if (f->cont_tgt == NULL) {
				c_error(NULL, "'continue' not inside loop\n");
				break;
			}
			asmf_add_inst(f, mk_inst(INST_JMP, 1,
				mk_oprd_label(f->cont_tgt)
			));
			break;
		case STMT_BREAK:
			if (f->break_tgt == NULL) {
				c_error(NULL, "'break' not inside loop or switch\n");
				break;
			}
			asmf_add_inst(f, mk_inst(INST_JMP, 1,
				mk_oprd_label(f->break_tgt)
			));
			break;
		case STMT_RETURN: 
			gen_stmt_return(f, n);
			break;
	}
	return;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x68, %rsp
movl 0x8(%rsi), %eax
cmpq $0xd, %rax
ja 0x48c1
movq %rdi, %rbx
leaq 0x7c6e(%rip), %rcx      # 0xc4b0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x4abd
movq 0x10(%rbx), %rsi
testq %rsi, %rsi
je 0x492a
leaq 0x48(%rsp), %r14
jmp 0x488f
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x4e12
movq 0x18(%rbx), %rsi
testq %rsi, %rsi
je 0x4933
leaq 0x28(%rsp), %r14
movq %r14, %rdi
callq 0x50ed
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x45
popq %rdi
pushq $0x1
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0x68, %rsp
popq %rbx
popq %r14
retq
movq 0x18(%rsi), %rsi
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x40b5
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x494a
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x47f7
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x4d13
leaq 0x7cb1(%rip), %rsi      # 0xc5c1
jmp 0x493a
movq %rbx, %rdi
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x4d92
leaq 0x7cc1(%rip), %rsi      # 0xc5e9
jmp 0x493a
leaq 0x7ce5(%rip), %rsi      # 0xc616
jmp 0x493a
leaq 0x7cf8(%rip), %rsi      # 0xc632
xorl %edi, %edi
xorl %eax, %eax
addq $0x68, %rsp
popq %rbx
popq %r14
jmp 0x35e4
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_if
void gen_stmt_if(asm_f *f, ast_n *n) {
	//Jump to end if not true
	char *lbl_end = gen_numlabel(f);
	gen_expr(f, n->dat.stmt.expr);
	asmf_add_inst(f, mk_inst(INST_TEST, 2,
		mk_oprd(OPRD_REG, RAX),
		mk_oprd(OPRD_REG, RAX)
	));
	asmf_add_inst(f, mk_inst(INST_JZ, 1, mk_oprd_label(lbl_end)));

	//Generate if body
	if (n->dat.stmt.body != NULL)
		gen_stmt(f, n->dat.stmt.body);

	//Generate else body
	if (n->dat.stmt.else_body != NULL) {
		//The main if will jump to here if the expression was false
		//Otherwise, jump past the else block
		char *lbl_else_end = gen_numlabel(f);
		asmf_add_inst(f, mk_inst(INST_JMP, 1,
			mk_oprd_label(lbl_else_end)
		));
		asmf_add_inst(f, mk_label(lbl_end));
		lbl_end = lbl_else_end;

		gen_stmt(f, n->dat.stmt.else_body);
	}
	asmf_add_inst(f, mk_label(lbl_end));
	
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0xc0, %rsp
movq %rsi, %r14
movq %rdi, %rbx
callq 0x3d40
movq %rax, %r15
movq 0x18(%r14), %rsi
movq %rbx, %rdi
callq 0x40b5
leaq 0xa0(%rsp), %r12
movq %r12, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
leaq 0x80(%rsp), %r13
movq %r13, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x50d0
movups (%r13), %xmm0
movups 0x10(%r13), %xmm1
movups %xmm1, 0x30(%rsp)
movups %xmm0, 0x20(%rsp)
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x3d
popq %rdi
pushq $0x2
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
leaq 0x60(%rsp), %r12
movq %r12, %rdi
movq %r15, %rsi
callq 0x50ed
movups (%r12), %xmm0
movups 0x10(%r12), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x39
popq %rdi
pushq $0x1
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
movq 0x20(%r14), %rsi
testq %rsi, %rsi
je 0x4a29
movq %rbx, %rdi
callq 0x4824
cmpq $0x0, 0x28(%r14)
je 0x4a98
movq %rbx, %rdi
callq 0x3d40
movq %rax, %r12
leaq 0x40(%rsp), %r13
movq %r13, %rdi
movq %rax, %rsi
callq 0x50ed
movups (%r13), %xmm0
movups 0x10(%r13), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x45
popq %rdi
pushq $0x1
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
movq %r15, %rdi
callq 0x51dd
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
movq 0x28(%r14), %rsi
movq %rbx, %rdi
callq 0x4824
movq %r12, %r15
movq %r15, %rdi
callq 0x51dd
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0xc0, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_label
void gen_stmt_label(asm_f *f, ast_n *n) {
	//Copy the symbol name to a new string
	char *lsrc = n->dat.stmt.lbl; //here

	//If the label isn't already in the map, store it
	char *lbl = map_get(&f->labels, lsrc);
	if (lbl == NULL) {
		int len = strlen(lsrc);
		char *str = malloc(len+1);
		strncpy(str, lsrc, len);
		str[len] = '\0';

		//Store the copy
		map_insert(&f->labels, str, str);
		lbl = str;
	}

	asmf_add_inst(f, mk_label(lbl));
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rdi, %rbx
movq 0x10(%rsi), %r15
leaq 0x30(%rdi), %r14
movq %r14, %rdi
movq %r15, %rsi
callq 0xbd22
movq %rax, %r12
testq %rax, %rax
jne 0x4d76
movq %r15, %rdi
callq 0x30b0
movq %rax, %r13
incl %eax
movslq %eax, %rdi
callq 0x3170
movq %rax, %r12
movslq %r13d, %r13
movq %rax, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0x3060
movb $0x0, (%r12,%r13)
movq %r14, %rdi
movq %r12, %rsi
movq %r12, %rdx
callq 0xbd89
movq %r12, %rdi
callq 0x51dd
movq %rbx, %rdi
movq %rax, %rsi
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
jmp 0x53ce
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_goto
void gen_stmt_goto(asm_f *f, ast_n *n) {
	//Verify label exists in function scope
	symbol *fsym = f->fsym;
	char *lbl = NULL;
	if ((lbl = map_get(&fsym->labels, n->dat.stmt.lbl)) == NULL) {
		c_error(NULL, "Label '%s' used but not defined\n",
			n->dat.stmt.lbl);
		return;
	}

	asmf_add_inst(f, mk_inst(INST_JMP, 1,
		mk_oprd_label(lbl)
	));
	return;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x48, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movq 0x20(%rdi), %rdi
addq $0x30, %rdi
movq 0x10(%rsi), %rsi
callq 0xbd22
testq %rax, %rax
je 0x4df7
leaq 0x28(%rsp), %r14
movq %r14, %rdi
movq %rax, %rsi
callq 0x50ed
movups (%r14), %xmm0
movups 0x10(%r14), %xmm1
movups %xmm1, 0x10(%rsp)
movups %xmm0, (%rsp)
pushq $0x45
popq %rdi
pushq $0x1
popq %rsi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
addq $0x48, %rsp
popq %rbx
popq %r14
retq
movq 0x10(%r14), %rdx
leaq 0x779e(%rip), %rsi      # 0xc5a0
xorl %edi, %edi
xorl %eax, %eax
addq $0x48, %rsp
popq %rbx
popq %r14
jmp 0x35e4
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_stmt_return
void gen_stmt_return(asm_f *f, ast_n *n) {
	//TODO: check for matching return type
	if (n->dat.stmt.expr != NULL) 
		gen_expr(f, n->dat.stmt.expr);
	asmf_add_inst(f, mk_inst(INST_LEAVE, 0));
	asmf_add_inst(f, mk_inst(INST_RET, 0));
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
movq 0x18(%rsi), %rsi
testq %rsi, %rsi
je 0x4e27
movq %rbx, %rdi
callq 0x40b5
pushq $0x42
popq %rdi
xorl %esi, %esi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
callq 0x53ce
pushq $0x41
popq %rdi
xorl %esi, %esi
xorl %eax, %eax
callq 0x50ff
movq %rbx, %rdi
movq %rax, %rsi
popq %rbx
jmp 0x53ce
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/gen.c
// Function: gen_text
void gen_text(asm_f *f, ast_n *n) {
	//Loop for each declaration and function definition
	ast_n *n_cur = n;
	while (n_cur != NULL) {
		if (n_cur->dat.decl.kind == DECL_STD) {
			gen_decl(f, n_cur);
		} else {
			gen_fdef(f, n_cur);
		}
		n_cur = n_cur->next;
	}
	return;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rsi, %rbx
movq %rdi, %r14
testq %rbx, %rbx
je 0x50c5
cmpl $0x0, 0x8(%rbx)
je 0x50bf
movq %r14, %rdi
movq %rbx, %rsi
callq 0x4e56
movq 0x60(%rbx), %rbx
jmp 0x50a9
addq $0x8, %rsp
popq %rbx
popq %r14
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/inst.c
// Function: mk_inst
inst_n *mk_inst(int op_id, int argc, ...) {
	inst_n *in = malloc(sizeof(struct INST));
	in->op = op_id;
	in->lbl = NULL;
	in->next = NULL;

	//Initialize operands
	va_list args;
	va_start(args, argc);
	for (int i=0; i<3; i++) {
		//Initialize other operands as blank
		if (i >= argc) {
			in->oprd[i].type = -1;
			continue;
		}
		in->oprd[i] = va_arg(args, oprd);
	}
	va_end(args);

	return in;
}

// Assembly:
pushq %rbp
pushq %r14
pushq %rbx
subq $0xd0, %rsp
movl %esi, %ebx
movl %edi, %ebp
leaq 0x20(%rsp), %r14
movq %rdx, 0x10(%r14)
movq %rcx, 0x18(%r14)
movq %r8, 0x20(%r14)
movq %r9, 0x28(%r14)
testb %al, %al
je 0x515e
movaps %xmm0, 0x50(%rsp)
movaps %xmm1, 0x60(%rsp)
movaps %xmm2, 0x70(%rsp)
movaps %xmm3, 0x80(%rsp)
movaps %xmm4, 0x90(%rsp)
movaps %xmm5, 0xa0(%rsp)
movaps %xmm6, 0xb0(%rsp)
movaps %xmm7, 0xc0(%rsp)
pushq $0x78
popq %rdi
callq 0x3170
movl %ebp, (%rax)
andq $0x0, 0x8(%rax)
andq $0x0, 0x70(%rax)
movq %r14, 0x10(%rsp)
leaq 0xf0(%rsp), %rcx
movq %rcx, 0x8(%rsp)
movabsq $0x3000000010, %rdx     # imm = 0x3000000010
movq %rdx, (%rsp)
movq %rax, %rdx
addq $0x10, %rdx
movslq %ebx, %rsi
xorl %edi, %edi
cmpq $0x3, %rdi
je 0x51d1
cmpq %rsi, %rdi
jge 0x51c5
leaq 0x20(%rcx), %r8
movq %r8, 0x8(%rsp)
movups (%rcx), %xmm0
movups 0x10(%rcx), %xmm1
movups %xmm1, 0x10(%rdx)
movups %xmm0, (%rdx)
movq %r8, %rcx
jmp 0x51c8
orl $-0x1, (%rdx)
incq %rdi
addq $0x20, %rdx
jmp 0x519e
addq $0xd0, %rsp
popq %rbx
popq %r14
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/inst.c
// Function: inst_str
void inst_str(inst_n *in) {
	//Print label
	if (in->lbl != NULL) {
		printf("%s:", in->lbl);
		if (in->next->lbl != NULL) printf("\n");
		return;
	}

	//Print operation
	printf("\t%s", x86_64_str[in->op]);

	//Print operands
	for (int i=0; i<3; i++) {
		oprd o = in->oprd[i];
		if (o.type < 0)
			break;

		if (i > 0) printf(", ");
		else printf("\t");
		if (o.deref != NODEREF)
			printf("[");
		if (o.type == OPRD_REG)
			printf("%s", x86_64_str[o.val.ival]);
		else if (o.type == OPRD_LBL)
			printf("%s", o.val.sval);
		else
			printf("%i", o.val.ival);

		//Dereferencing
		//TODO: DWORD PTR ...
		switch (o.deref) {
			case DEREF:	
				printf("]");
				break;
			case DEREF_REG:
				printf("+%s]", x86_64_str[o.deref_ofs.ival]);
				break;
			case DEREF_IMM: 
				printf("+%i]", o.deref_ofs.ival);
				break;
			case DEREF_LBL: 
				printf("+%s]", o.deref_ofs.sval);
				break;
		}
	}

	printf("\n");
	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rdi, %rbx
movq 0x8(%rdi), %rsi
testq %rsi, %rsi
je 0x5242
leaq 0x763c(%rip), %rdi      # 0xc852
xorl %eax, %eax
callq 0x30c0
movq 0x70(%rbx), %rax
cmpq $0x0, 0x8(%rax)
je 0x5356
pushq $0xa
popq %rdi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
jmp 0x3040
movslq (%rbx), %rax
leaq 0xdee4(%rip), %rcx      # 0x13130
movq (%rcx,%rax,8), %rsi
leaq 0x75ff(%rip), %rdi      # 0xc856
xorl %eax, %eax
callq 0x30c0
xorl %r15d, %r15d
cmpq $0x60, %r15
je 0x522c
movl 0x10(%rbx,%r15), %r13d
testl %r13d, %r13d
js 0x522c
movq 0x18(%rbx,%r15), %r12
movl 0x20(%rbx,%r15), %r14d
movq 0x28(%rbx,%r15), %rbp
testq %r15, %r15
je 0x5295
leaq 0x75ce(%rip), %rdi      # 0xc85a
xorl %eax, %eax
callq 0x30c0
jmp 0x529d
pushq $0x9
popq %rdi
callq 0x3040
testl %r14d, %r14d
je 0x52aa
pushq $0x5b
popq %rdi
callq 0x3040
cmpl $0x2, %r13d
je 0x52cc
testl %r13d, %r13d
jne 0x52df
movslq %r12d, %rax
leaq 0xde71(%rip), %rcx      # 0x13130
movq (%rcx,%rax,8), %rsi
leaq 0x758d(%rip), %rdi      # 0xc857
jmp 0x52d6
leaq 0x7584(%rip), %rdi      # 0xc857
movq %r12, %rsi
xorl %eax, %eax
callq 0x30c0
jmp 0x52f0
leaq 0x7210(%rip), %rdi      # 0xc4f6
movl %r12d, %esi
xorl %eax, %eax
callq 0x30c0
decl %r14d
cmpl $0x3, %r14d
ja 0x534d
leaq 0x73a0(%rip), %rcx      # 0xc6a0
movslq (%rcx,%r14,4), %rax
addq %rcx, %rax
jmpq *%rax
pushq $0x5d
popq %rdi
callq 0x3040
jmp 0x534d
leaq 0x7548(%rip), %rdi      # 0xc862
movl %ebp, %esi
xorl %eax, %eax
callq 0x30c0
jmp 0x534d
leaq 0x7531(%rip), %rdi      # 0xc85d
movq %rbp, %rsi
jmp 0x5346
movslq %ebp, %rax
leaq 0xddf5(%rip), %rcx      # 0x13130
movq (%rcx,%rax,8), %rsi
leaq 0x7517(%rip), %rdi      # 0xc85d
xorl %eax, %eax
callq 0x30c0
addq $0x20, %r15
jmp 0x5261
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/inst.c
// Function: asmf_close
void asmf_close(asm_f *f) {
	struct INST *cur = f->text;
	while (cur != NULL) {
		struct INST *next = cur->next;
		inst_del(cur);
		cur = next;
	}

	//Free labels
	for (int i=0; i<f->labels.max; i++) {
		if (f->labels.table[i] != NULL)
			free(f->labels.table[i]);
	}
	map_close(&f->labels);
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq (%rdi), %rdi
testq %rdi, %rdi
je 0x53a0
movq 0x70(%rdi), %r14
callq 0x3030
movq %r14, %rdi
jmp 0x538d
leaq 0x30(%rbx), %r14
xorl %r15d, %r15d
movslq 0x44(%rbx), %rax
cmpq %rax, %r15
jge 0x53c1
movq (%r14), %rax
movq (%rax,%r15,8), %rdi
callq 0x3030
incq %r15
jmp 0x53a7
movq %r14, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0xbbe6
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/inst.c
// Function: asmf_add_inst
void asmf_add_inst(asm_f *f, inst_n *in) {
	if (f->text == NULL) {
		f->text = in;
		f->text_cur = in;
	} else {
		f->text_cur->next = in;
		f->text_cur = in;
	}

	return;
}

// Assembly:
cmpq $0x0, (%rdi)
je 0x53e2
movq 0x8(%rdi), %rax
addq $0x8, %rdi
movq %rsi, 0x70(%rax)
jmp 0x53e9
movq %rsi, (%rdi)
addq $0x8, %rdi
movq %rsi, (%rdi)
retq
nopl (%rax)
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lexer_init
lexer *lexer_init(symtable *stb, char *fname) {
	lexer *lx = malloc(sizeof(struct LEXER));
	lx->tgt = NULL;
	lx->pre = NULL;
	lx->ahead = BLANK_TOKEN;
	vector_init(&lx->flist, VECTOR_EMPTY);
	vector_init(&lx->conds, VECTOR_EMPTY);
	lx->stb = stb;

	if (!lex_open_file(lx, fname)) {
		c_error(NULL, "Unable to open file '%s': ", fname);
		fflush(stderr);
		perror(NULL);
		free(lx);
		return NULL;
	}
	lx->m_exp = 1;
	lx->m_cexpr = 0;

	return lx;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %r14
movq %rdi, %r15
pushq $0x70
popq %rdi
callq 0x3170
movq %rax, %rbx
xorps %xmm0, %xmm0
movups %xmm0, (%rax)
movups 0xdd11(%rip), %xmm0     # 0x13438
movups %xmm0, 0x10(%rax)
movups 0xdd16(%rip), %xmm0     # 0x13448
movups %xmm0, 0x20(%rax)
movups 0xdd1b(%rip), %xmm0     # 0x13458
movups %xmm0, 0x30(%rax)
leaq 0x40(%rax), %rdi
xorl %esi, %esi
callq 0xbe8a
leaq 0x50(%rbx), %rdi
xorl %esi, %esi
callq 0xbe8a
movq %r15, 0x60(%rbx)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x57b0
testl %eax, %eax
je 0x577b
movq $0x1, 0x68(%rbx)
movq %rbx, %rax
popq %rbx
popq %r14
popq %r15
retq
leaq 0x74a2(%rip), %rsi      # 0xcc24
xorl %edi, %edi
movq %r14, %rdx
xorl %eax, %eax
callq 0x35e4
movq 0xd863(%rip), %rax      # 0x12ff8
movq (%rax), %rdi
callq 0x3180
xorl %edi, %edi
callq 0x31d0
movq %rbx, %rdi
callq 0x3030
xorl %ebx, %ebx
jmp 0x5772
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_open_file
int lex_open_file(lexer *lx, char *fname) {
	//Attempt to open file
	FILE *src_f = fopen(fname, "r");
	if (!src_f) return 0;

	//Read data from file
	//TODO: use sys/stat.h to get file size
	fseek(src_f, 0, SEEK_END);
	int len = ftell(src_f);
	char *buf = malloc(len+1);
	fseek(src_f, 0, SEEK_SET);
	fread(buf, len, 1, src_f);
	fclose(src_f);
	buf[len] = '\0';

	vector_add(&lx->flist, fname);
	lexer_tgt_open(lx, fname, TGT_FILE, buf);
	return 1;
}

// Assembly:
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x73ab(%rip), %rsi      # 0xcb71
movq %rbx, %rdi
callq 0x31c0
testq %rax, %rax
je 0x5849
movq %rax, %r15
pushq $0x2
popq %rdx
movq %rax, %rdi
xorl %esi, %esi
callq 0x3190
movq %r15, %rdi
callq 0x3140
movq %rax, %r13
incl %eax
movslq %eax, %rdi
callq 0x3170
movq %rax, %r12
movq %r15, %rdi
xorl %esi, %esi
xorl %edx, %edx
callq 0x3190
movslq %r13d, %r13
pushq $0x1
popq %rdx
movq %r12, %rdi
movq %r13, %rsi
movq %r15, %rcx
callq 0x3080
movq %r15, %rdi
callq 0x30a0
movb $0x0, (%r12,%r13)
leaq 0x40(%r14), %rdi
movq %rbx, %rsi
callq 0xbf10
movq %r14, %rdi
movq %rbx, %rsi
xorl %edx, %edx
movq %r12, %rcx
callq 0x5855
pushq $0x1
popq %rax
jmp 0x584b
xorl %eax, %eax
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lexer_tgt_open
void lexer_tgt_open(lexer *lx, char *name, int type, char *buf) {
	lex_target *n_tgt = malloc(sizeof(struct LEX_TARGET));
	n_tgt->name = name;
	n_tgt->type = type;
	n_tgt->buf = buf;
	n_tgt->pos = buf;
	n_tgt->cch = *buf;

	//Copy location for macro
	if (type == TGT_MACRO) {
		n_tgt->loc = lx->tgt->loc;
	} else {
		n_tgt->loc.line = 1;
		n_tgt->loc.col = 0;
		n_tgt->loc.fname = name;
	}

	vector_init(&n_tgt->mp_exp, VECTOR_EMPTY);
	n_tgt->prev = lx->tgt;
	lx->tgt = n_tgt;
	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
movq %rcx, %r12
movl %edx, %ebp
movq %rsi, %r15
movq %rdi, %rbx
pushq $0x58
popq %rdi
callq 0x3170
movq %rax, %r14
movq %r15, (%rax)
movl %ebp, 0x8(%rax)
movq %r12, 0x10(%rax)
movq %r12, 0x18(%rax)
movb (%r12), %al
movb %al, 0x20(%r14)
cmpl $0x1, %ebp
jne 0x58a6
leaq 0x28(%r14), %rax
movq (%rbx), %rcx
movq 0x38(%rcx), %rdx
movq %rdx, 0x10(%rax)
movups 0x28(%rcx), %xmm0
movups %xmm0, (%rax)
jmp 0x58b2
movq $0x1, 0x28(%r14)
movq %r15, 0x38(%r14)
movq %r14, %rdi
addq $0x40, %rdi
xorl %esi, %esi
callq 0xbe8a
movq (%rbx), %rax
movq %rax, 0x50(%r14)
movq %r14, (%rbx)
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lexer_close
void lexer_close(lexer *lx) {
	//Pop all targets if any remain
	while (lx->tgt != NULL)
		lexer_tgt_close(lx);

	//Free filenames
	for (int i=0; i<lx->flist.len; i++)
		free(lx->flist.table[i]);

	vector_close(&lx->flist);
	vector_close(&lx->conds);
	free(lx);
	return;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
cmpq $0x0, (%rbx)
je 0x58eb
movq %rbx, %rdi
callq 0x592a
jmp 0x58db
leaq 0x40(%rbx), %r14
xorl %r15d, %r15d
movslq 0x48(%rbx), %rax
cmpq %rax, %r15
jge 0x590c
movq (%r14), %rax
movq (%rax,%r15,8), %rdi
callq 0x3030
incq %r15
jmp 0x58f2
movq %r14, %rdi
callq 0xbecc
leaq 0x50(%rbx), %rdi
callq 0xbecc
movq %rbx, %rdi
popq %rbx
popq %r14
popq %r15
jmp 0x3030
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lexer_tgt_close
void lexer_tgt_close(lexer *lx) {
	lex_target *tgt = lx->tgt;
	if (tgt->type == TGT_FILE) {
		//Name is freed when lexer is closed
		free(tgt->buf);
	}
	lx->tgt = tgt->prev;
	vector_close(&tgt->mp_exp);

	free(tgt);
	return;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %r14
movq (%rdi), %rbx
cmpl $0x0, 0x8(%rbx)
jne 0x5943
movq 0x10(%rbx), %rdi
callq 0x3030
movq 0x50(%rbx), %rax
movq %rax, (%r14)
leaq 0x40(%rbx), %rdi
callq 0xbecc
movq %rbx, %rdi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0x3030
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lexer_add_cond
void lexer_add_cond(lexer *lx, int pass) {
	lex_cond *cond = malloc(sizeof(struct LEX_CONDITION));
	cond->is_true = pass;
	cond->was_true = 0;
	cond->has_else = 0;
	vector_push(&lx->conds, cond);
	return;
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movl %esi, %ebx
movq %rdi, %r14
pushq $0xc
popq %rdi
callq 0x3170
movl %ebx, (%rax)
andq $0x0, 0x4(%rax)
addq $0x50, %r14
movq %r14, %rdi
movq %rax, %rsi
addq $0x8, %rsp
popq %rbx
popq %r14
jmp 0xbf86
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_prcc
char lex_prcc(lexer *lx, char **cpos, char *cch, s_pos *cloc) {
	char *pos;
	char nchar;
	s_pos loc;
	if (cpos == NULL || cch == NULL || cloc == NULL) return '\0';

	/*
	 * Move to the next character
	 * If the current column is 0, the lexer is at the beginning of a file context
	 */
	int is_reset = (cloc->col == 0);
	pos = (is_reset) ? *cpos : *(cpos)+1;
	nchar = *pos;
	loc = *cloc;

	//Update location
	if (*cch == '\n') {
		loc.col = (is_reset) ? 1 : 0;
		loc.line++;
	}
	loc.col++;

	/*
	 * Perform trigraph conversion/newline splicing if needed
	 */
	for (;;) {
		//Process trigraphs
		if (*pos == '?' && *(pos+1) == '?') {
			int conv = 1;
			switch (*(pos+2)) {
				case '=': nchar = '#';  break;
				case '(': nchar = '[';  break;
				case '/': nchar = '\\'; break;
				case ')': nchar = ']';  break;
				case '\'': nchar = '^'; break;
				case '<': nchar = '{';  break;
				case '!': nchar = '|';  break;
				case '>': nchar = '}';  break;
				case '-': nchar = '~';  break;
				default: conv = 0; break;
			}

			//A conversion only takes place if the trigram was valid
			if (conv) {
				pos += 2;
				loc.col += 2;
			}
		}

		//Process newline splicing
		if (nchar == '\\' && *(pos+1) == '\n') {
			pos += 2;
			nchar = *pos;
			loc.col = 1;
			loc.line++;
		} else {
			//Stop looping if a line was not spliced
			break;
		}
	}

	*cpos = pos;
	*cch = nchar;
	*cloc = loc;
	return nchar;
}

// Assembly:
testq %rsi, %rsi
sete %al
testq %rdx, %rdx
sete %dil
orb %al, %dil
testq %rcx, %rcx
sete %al
orb %dil, %al
je 0x59c1
xorl %eax, %eax
retq
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
movl (%rcx), %eax
movl 0x4(%rcx), %r11d
xorl %edi, %edi
xorl %r9d, %r9d
testl %r11d, %r11d
sete %dil
setne %r9b
movq (%rsi), %r10
leaq (%r10,%r9), %r8
movb (%r10,%r9), %bpl
movups 0x8(%rcx), %xmm0
movaps %xmm0, -0x18(%rsp)
xorl %r10d, %r10d
cmpb $0xa, (%rdx)
leaq 0x8(%rcx), %r9
sete %r10b
cmovnel %r11d, %edi
addl %eax, %r10d
incl %edi
leaq 0x6e59(%rip), %r11      # 0xc868
movl $0x1, %ebx
cmpb $0x3f, %bpl
jne 0x5a82
movb $0x3f, %al
cmpb $0x3f, 0x1(%r8)
jne 0x5aa7
movzbl 0x2(%r8), %r14d
leal -0x21(%r14), %r15d
cmpl $0xe, %r15d
ja 0x5a45
movslq (%r11,%r15,4), %r14
addq %r11, %r14
jmpq *%r14
movb $0x7c, %bpl
jmp 0x5a7b
cmpl $0x3c, %r14d
je 0x5a78
movb $0x23, %bpl
cmpl $0x3d, %r14d
je 0x5a7b
cmpl $0x3e, %r14d
jne 0x5aa7
movb $0x7d, %bpl
jmp 0x5a7b
movb $0x5c, %bpl
jmp 0x5a7b
movb $0x7e, %bpl
jmp 0x5a7b
movb $0x5d, %bpl
jmp 0x5a7b
movb $0x5b, %bpl
jmp 0x5a7b
movb $0x5e, %bpl
jmp 0x5a7b
movb $0x7b, %bpl
addq $0x2, %r8
addl $0x2, %edi
cmpb $0x5c, %bpl
jne 0x5aa1
cmpb $0xa, 0x1(%r8)
jne 0x5aa5
movb 0x2(%r8), %bpl
addq $0x2, %r8
incl %r10d
movl %ebx, %edi
jmp 0x5a14
movl %ebp, %eax
jmp 0x5aa7
movb $0x5c, %al
movq %r8, (%rsi)
movb %al, (%rdx)
movl %r10d, (%rcx)
movl %edi, 0x4(%rcx)
movaps -0x18(%rsp), %xmm0
movups %xmm0, (%r9)
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_advc
char lex_advc(lexer *lx) {
	int len; s_pos loc;
	char nc = lex_nchar(lx, &len, &loc, 0);
	if (nc == '\0') return nc;

	lx->tgt->cch = nc;
	lx->tgt->pos += len;
	lx->tgt->loc = loc;
	return lx->tgt->cch;
}

// Assembly:
pushq %rbp
pushq %rbx
subq $0x28, %rsp
movq %rdi, %rbx
leaq 0xc(%rsp), %rsi
leaq 0x10(%rsp), %rdx
xorl %ebp, %ebp
xorl %ecx, %ecx
callq 0x5ac2
testb %al, %al
je 0x64f5
movq (%rbx), %rcx
movb %al, 0x20(%rcx)
movslq 0xc(%rsp), %rax
addq %rax, 0x18(%rcx)
movq 0x20(%rsp), %rax
movq %rax, 0x38(%rcx)
movups 0x10(%rsp), %xmm0
movups %xmm0, 0x28(%rcx)
movq (%rbx), %rax
movb 0x20(%rax), %bpl
movl %ebp, %eax
addq $0x28, %rsp
popq %rbx
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_ident
void lex_ident(lexer *lx, token *t) {
	int len = 0;
	int bsize = 256;
	char cur = lex_cur(lx);
	char *buf = malloc(bsize);
	while (isalnum(cur) || cur == '_') {
		//Resize if needed
		if (len+2 == bsize) {
			bsize *= 2;
			buf = realloc(buf, bsize);
		}

		//Copy character to buffer
		buf[len++] = cur;
		cur = lex_advc(lx);
	}
	buf[len] = '\0';
	t->dat.sval = buf;
	t->type = TOK_IDENT;
	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
pushq %rax
movq %rsi, (%rsp)
movq %rdi, %r14
callq 0x6493
movl %eax, %ebp
movl $0x100, %edi            # imm = 0x100
callq 0x3170
movq %rax, %r15
movl $0x100, %ebx            # imm = 0x100
xorl %r13d, %r13d
callq 0x3230
movq %rax, %r12
cmpb $0x5f, %bpl
je 0x6557
movq (%r12), %rax
movsbq %bpl, %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x8, %eax
je 0x6585
leaq 0x2(%r13), %rax
movl %ebx, %ecx
cmpq %rcx, %rax
jne 0x6572
addl %ebx, %ebx
movslq %ebx, %rsi
movq %r15, %rdi
callq 0x31a0
movq %rax, %r15
movb %bpl, (%r15,%r13)
incq %r13
movq %r14, %rdi
callq 0x64ad
movl %eax, %ebp
jmp 0x6540
movl %r13d, %eax
movb $0x0, (%r15,%rax)
movq (%rsp), %rax
movq %r15, 0x20(%rax)
movl $0x35, (%rax)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_str
void lex_str(lexer *lx, token *t) {
	int len = 0;
	int bsize = 256;
	char cur = lex_advc(lx);
	char *buf = malloc(bsize);
	for (;;) {
		//Resize if needed
		if (len+2 == bsize) {
			bsize *= 2;
			buf = realloc(buf, bsize);
		}

		//Get character
		char c = cur;
		if (cur == '"') {
			lex_advc(lx);
			//Check for whitespace concatenation
			while (isspace(lex_cur(lx))) lex_advc(lx);
			if (lex_cur(lx) != '"') break;
			cur = lex_advc(lx);
			continue;
		} else if (cur == '\\') {
			//Escape sequence
			lex_advc(lx);
			buf[len++] = lex_eschar(lx);
			cur = lex_cur(lx);
			continue;
		}

		//Copy character to buffer
		buf[len++] = c;
		cur = lex_advc(lx);
	}
	buf[len] = '\0';
	t->dat.sval = buf;
	t->type = TOK_STR;
	return;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x18, %rsp
movq %rsi, 0x10(%rsp)
movq %rdi, %r14
callq 0x64ad
movl %eax, %ebp
movl $0x100, %edi            # imm = 0x100
callq 0x3170
movq %rax, (%rsp)
xorl %r15d, %r15d
movl $0x100, %ebx            # imm = 0x100
leal 0x2(%r15), %eax
movl %eax, 0xc(%rsp)
cmpl %ebx, 0xc(%rsp)
jne 0x6cea
addl %ebx, %ebx
movslq %ebx, %rsi
movq (%rsp), %rdi
callq 0x31a0
movq %rax, (%rsp)
movslq %r15d, %r13
cmpb $0x22, %bpl
jne 0x6d3c
movq %r14, %rdi
callq 0x64ad
callq 0x3230
movq %rax, %r12
movq (%r12), %rbp
movq %r14, %rdi
callq 0x6493
movsbq %al, %rax
testb $0x20, 0x1(%rbp,%rax,2)
je 0x6d24
movq %r14, %rdi
callq 0x64ad
jmp 0x6d03
movq %r14, %rdi
callq 0x6493
cmpb $0x22, %al
jne 0x6d81
movq %r14, %rdi
callq 0x64ad
movl %eax, %ebp
jmp 0x6cd2
movzbl %bpl, %eax
cmpl $0x5c, %eax
jne 0x6d67
movq %r14, %rdi
callq 0x64ad
movq %r14, %rdi
callq 0x6a27
movq (%rsp), %rcx
movb %al, (%rcx,%r13)
movq %r14, %rdi
callq 0x6493
jmp 0x6d77
movq (%rsp), %rax
movb %bpl, (%rax,%r13)
movq %r14, %rdi
callq 0x64ad
movl %eax, %ebp
incl %r15d
jmp 0x6cca
movq (%rsp), %rcx
movb $0x0, (%rcx,%r13)
movq 0x10(%rsp), %rax
movq %rcx, 0x20(%rax)
movl $0x34, (%rax)
addq $0x18, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_wspace
int lex_wspace(lexer *lx) {
	int nline = 0;
	char cur = lex_cur(lx);
	for (;;) {
		//Handle whitespace checks at end of lexer context
		if (cur == '\0' && lx->m_exp) {
			if (lx->tgt->prev != NULL) {
				//lexer_tgt_close(lx);
				lex_advc(lx);
				cur = lex_cur(lx);
			} else {
				break;
			}
			continue;
		}
		
		//Check for newline and skip whitespace
		if (!isspace(cur)) break;
		if (cur == '\n') nline = 1;
		cur = lex_advc(lx);
	}
	return nline;
}

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %rbx
pushq %rax
movq %rdi, %rbx
callq 0x6493
movl %eax, %r14d
xorl %ebp, %ebp
pushq $0x1
popq %r15
testb %r14b, %r14b
jne 0x73b2
cmpl $0x0, 0x68(%rbx)
je 0x73b2
movq (%rbx), %rax
cmpq $0x0, 0x50(%rax)
je 0x73da
movq %rbx, %rdi
callq 0x64ad
movq %rbx, %rdi
callq 0x6493
movl %eax, %r14d
jmp 0x7388
callq 0x3230
movq (%rax), %rax
movsbq %r14b, %rcx
testb $0x20, 0x1(%rax,%rcx,2)
je 0x73da
cmpb $0xa, %r14b
cmovel %r15d, %ebp
movq %rbx, %rdi
callq 0x64ad
movl %eax, %r14d
jmp 0x7388
movl %ebp, %eax
addq $0x8, %rsp
popq %rbx
popq %r14
popq %r15
popq %rbp
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_ppd
void lex_ppd(lexer *lx) {
	//Read directive
	token ppd = lex_peek(lx);
	switch (ppd.type) {
		case TOK_KW_DEFINE:	ppd_define(lx);			break;
		case TOK_KW_ELIF:	ppd_elif(lx);			break;
		case TOK_KW_ELSE:	ppd_else(lx);			break;
		case TOK_KW_ENDIF:   	ppd_endif(lx);			break;
		case TOK_KW_ERROR:	ppd_error(lx, 0);		break;
		case TOK_KW_IF:		ppd_if(lx);			break;
		case TOK_KW_IFDEF:	ppd_ifdef(lx);			break;
		case TOK_KW_IFNDEF:	ppd_ifndef(lx);			break;
		case TOK_KW_INCLUDE:	ppd_include(lx);		break;
		case TOK_KW_LINE:					break;
		case TOK_KW_PRAGMA:					break;
		case TOK_KW_UNDEF:	ppd_undef(lx);			break;
		case TOK_KW_WARNING:	ppd_error(lx, 1);		break;
		default:
			c_error(&ppd.loc, "Invalid preprocessor directive\n");
			break;
	}

	return;
}

// Assembly:
pushq %r14
pushq %rbx
subq $0x38, %rsp
movq %rdi, %rbx
leaq 0x8(%rsp), %r14
movq %r14, %rdi
movq %rbx, %rsi
callq 0x74e5
movl (%r14), %eax
leal -0x55(%rax), %ecx
cmpl $0xa, %ecx
ja 0x742b
leaq 0x56b1(%rip), %rax      # 0xcac4
movslq (%rax,%rcx,4), %rcx
addq %rax, %rcx
jmpq *%rcx
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xab8a
cmpl $0x36, %eax
je 0x748b
cmpl $0x37, %eax
jne 0x74ca
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb31e
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb36b
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xafff
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb2c8
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb269
movq %rbx, %rdi
xorl %esi, %esi
jmp 0x74af
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb1df
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xb20a
pushq $0x1
popq %rsi
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xad41
movq %rbx, %rdi
addq $0x38, %rsp
popq %rbx
popq %r14
jmp 0xae1f
leaq 0x10(%rsp), %rdi
leaq 0x59cd(%rip), %rsi      # 0xcea3
xorl %eax, %eax
callq 0x35e4
addq $0x38, %rsp
popq %rbx
popq %r14
retq
// File: /workspace/github_c_makefile_star2_O2/Yamsman[P]scc/src/lex.c
// Function: lex_adv
void lex_adv(lexer *lx) {
reset:	if (lx->ahead.type == TOK_END) return;
	lex_condskip(lx);
	lex_next(lx);
	if (lx->ahead.type == TOK_SNS) {
		lx->m_exp = 0; //Temporarily disable macro expansion
		lex_next(lx);
		lex_ppd(lx);
		lx->m_exp = 1;
		goto reset;
	}
	return;
}

// Assembly:
pushq %rbx
movq %rdi, %rbx
cmpl $0x0, 0x10(%rbx)
je 0x755f
movq %rbx, %rdi
callq 0x7580
movq %rbx, %rdi
callq 0x6da8
cmpl $0xd, 0x10(%rbx)
jne 0x755f
andl $0x0, 0x68(%rbx)
movq %rbx, %rdi
callq 0x6da8
movq %rbx, %rdi
callq 0x73e7
movl $0x1, 0x68(%rbx)
jmp 0x7526
popq %rbx
retq