// File: /workspace/github_c_makefile_star2_O0/Ihsoh[P]ilang/compiler/frontend/irgen_llvmir.c
// Function: ir_expr_sub
static void _ir_expr_sub(
	IRGeneratorLlvmirContext *ctx,
	ResizableString *rstr,
	ResizableString *rstr_result_lhs_ptr,
	_ExprResult *expr_result,
	ParserASTNode *node
) {
	assert(ctx);
	assert(rstr);
	assert(expr_result);
	assert(node);
	assert(node->type == FE_NODE_EXPR_SUB
			|| node->type == FE_NODE_EXPR_SUB_ASSIGN);

	ParserSymbol *func_symbol = ctx->func_symbol;
	assert(func_symbol);

	uint8_t type1 = FE_EXPR_AST_NODE_GET_TYPE(node->childs[0]);
	uint8_t type2 = FE_EXPR_AST_NODE_GET_TYPE(node->childs[1]);

	if (fe_sem_is_pointer_type(type1) && fe_sem_is_integer_type(type2)) {
		ParserASTNode *node_lhs = node->childs[0];
		ParserASTNode *node_rhs = node->childs[1];

		_ExprResult result_lhs;
		_ExprResult result_rhs;

		_expr_result_init(&result_lhs);
		_expr_result_init(&result_rhs);

		_ir_expr(ctx, rstr, &result_lhs, node_lhs);
		rstr_append_with_rstr(rstr, &(result_lhs.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_lhs.rstr_for_result));

		if (rstr_result_lhs_ptr != NULL) {
			rstr_append_with_rstr(
				rstr_result_lhs_ptr,
				&(result_lhs.rstr_result_ptr)
			);
		}

		_ir_expr(ctx, rstr, &result_rhs, node_rhs);
		rstr_append_with_rstr(rstr, &(result_rhs.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_rhs.rstr_for_result));

		ParserASTNode *node_lhs_ptr_type = FE_EXPR_AST_NODE_GET_TYPE_NODE(node_lhs);
		assert(node_lhs_ptr_type->type == FE_NODE_TYPE_POINTER);
		ParserASTNode *node_lhs_type = node_lhs_ptr_type->childs[0];

		ResizableString rstr_lhs_type;
		rstr_init(&rstr_lhs_type);
		_ir_type(ctx, &rstr_lhs_type, node_lhs_type);

		ResizableString rstr_tmp_label_val;
		rstr_init(&rstr_tmp_label_val);
		_generate_func_tmp(ctx, func_symbol, &rstr_tmp_label_val);

		ResizableString rstr_tmp_label_val1;
		rstr_init(&rstr_tmp_label_val1);
		_generate_func_tmp(ctx, func_symbol, &rstr_tmp_label_val1);

		rstr_appendf(
			&(expr_result->rstr_for_result),
			"%s = sub %s 0, %s\n",
			RSTR_CSTR(&rstr_tmp_label_val),
			RSTR_CSTR(&(result_rhs.rstr_result_type)),
			RSTR_CSTR(&(result_rhs.rstr_result_val))
		);
		rstr_appendf(
			&(expr_result->rstr_for_result),
			"%s = getelementptr inbounds %s, %s, %s %s\n",
			RSTR_CSTR(&rstr_tmp_label_val1),
			RSTR_CSTR(&rstr_lhs_type),
			RSTR_CSTR(&(result_lhs.rstr_result)),
			RSTR_CSTR(&(result_rhs.rstr_result_type)),
			RSTR_CSTR(&rstr_tmp_label_val)
		);
		_expr_result_set_result(
			expr_result,
			RSTR_CSTR(&(result_lhs.rstr_result_type)),
			RSTR_CSTR(&rstr_tmp_label_val1)
		);

		_expr_result_free(&result_lhs);
		_expr_result_free(&result_rhs);
		rstr_free(&rstr_lhs_type);
		rstr_free(&rstr_tmp_label_val);
		rstr_free(&rstr_tmp_label_val1);
	} else if (fe_sem_is_number_type(type1) && fe_sem_is_number_type(type2)) {
		ParserASTNode *node_type = FE_EXPR_AST_NODE_GET_TYPE_NODE(node);
		uint8_t type = FE_EXPR_AST_NODE_GET_TYPE(node);

		ParserASTNode *node_lhs = node->childs[0];
		ParserASTNode *node_rhs = node->childs[1];

		_ExprResult result_lhs;
		_ExprResult result_rhs;
		_ExprResult result_lhs_casted;
		_ExprResult result_rhs_casted;

		_expr_result_init(&result_lhs);
		_expr_result_init(&result_rhs);
		_expr_result_init(&result_lhs_casted);
		_expr_result_init(&result_rhs_casted);

		_ir_expr(ctx, rstr, &result_lhs, node_lhs);
		rstr_append_with_rstr(rstr, &(result_lhs.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_lhs.rstr_for_result));

		if (rstr_result_lhs_ptr != NULL) {
			rstr_append_with_rstr(
				rstr_result_lhs_ptr,
				&(result_lhs.rstr_result_ptr)
			);
		}

		_ir_expr(ctx, rstr, &result_rhs, node_rhs);
		rstr_append_with_rstr(rstr, &(result_rhs.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_rhs.rstr_for_result));

		_expr_result_cast(
			ctx,
			&result_lhs_casted,
			node_type,
			&result_lhs,
			FE_EXPR_AST_NODE_GET_TYPE_NODE(node_lhs)
		);
		rstr_append_with_rstr(rstr, &(result_lhs_casted.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_lhs_casted.rstr_for_result));

		_expr_result_cast(
			ctx,
			&result_rhs_casted,
			node_type,
			&result_rhs,
			FE_EXPR_AST_NODE_GET_TYPE_NODE(node_rhs)
		);
		rstr_append_with_rstr(rstr, &(result_rhs_casted.rstr_for_result_ptr));
		rstr_append_with_rstr(rstr, &(result_rhs_casted.rstr_for_result));

		ResizableString rstr_tmp_label_val;
		rstr_init(&rstr_tmp_label_val);
		_generate_func_tmp(ctx, func_symbol, &rstr_tmp_label_val);

		if (fe_sem_is_signed_type(type)) {
			rstr_appendf(
				&(expr_result->rstr_for_result),
				"%s = sub nsw %s, %s\n",
				RSTR_CSTR(&rstr_tmp_label_val),
				RSTR_CSTR(&(result_lhs_casted.rstr_result)),
				RSTR_CSTR(&(result_rhs_casted.rstr_result_val))
			);
		} else if (fe_sem_is_unsigned_type(type)) {
			rstr_appendf(
				&(expr_result->rstr_for_result),
				"%s = sub %s, %s\n",
				RSTR_CSTR(&rstr_tmp_label_val),
				RSTR_CSTR(&(result_lhs_casted.rstr_result)),
				RSTR_CSTR(&(result_rhs_casted.rstr_result_val))
			);
		} else if (fe_sem_is_float_type(type)) {
			rstr_appendf(
				&(expr_result->rstr_for_result),
				"%s = fsub %s, %s\n",
				RSTR_CSTR(&rstr_tmp_label_val),
				RSTR_CSTR(&(result_lhs_casted.rstr_result)),
				RSTR_CSTR(&(result_rhs_casted.rstr_result_val))
			);
		} else {
			assert(0);
		}
		_expr_result_set_result(
			expr_result,
			RSTR_CSTR(&(result_lhs_casted.rstr_result_type)),
			RSTR_CSTR(&rstr_tmp_label_val)
		);

		_expr_result_free(&result_lhs);
		_expr_result_free(&result_rhs);
		_expr_result_free(&result_lhs_casted);
		_expr_result_free(&result_rhs_casted);
		rstr_free(&rstr_tmp_label_val);
	} else {
		assert(0);
	}
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x510, %rsp            # imm = 0x510
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
cmpq $0x0, -0x8(%rbp)
je 0x37a18
jmp 0x37a37
leaq 0x44b37(%rip), %rdi     # 0x7c556
leaq 0x406aa(%rip), %rsi     # 0x780d0
movl $0xd58, %edx            # imm = 0xD58
leaq 0x41676(%rip), %rcx     # 0x790a8
callq 0x30a0
cmpq $0x0, -0x10(%rbp)
je 0x37a40
jmp 0x37a5f
leaq 0x3b0c7(%rip), %rdi     # 0x72b0e
leaq 0x40682(%rip), %rsi     # 0x780d0
movl $0xd59, %edx            # imm = 0xD59
leaq 0x4164e(%rip), %rcx     # 0x790a8
callq 0x30a0
cmpq $0x0, -0x20(%rbp)
je 0x37a68
jmp 0x37a87
leaq 0x3d1a4(%rip), %rdi     # 0x74c13
leaq 0x4065a(%rip), %rsi     # 0x780d0
movl $0xd5a, %edx            # imm = 0xD5A
leaq 0x41626(%rip), %rcx     # 0x790a8
callq 0x30a0
cmpq $0x0, -0x28(%rbp)
je 0x37a90
jmp 0x37aaf
leaq 0x3e53c(%rip), %rdi     # 0x75fd3
leaq 0x40632(%rip), %rsi     # 0x780d0
movl $0xd5b, %edx            # imm = 0xD5B
leaq 0x415fe(%rip), %rcx     # 0x790a8
callq 0x30a0
movq -0x28(%rbp), %rax
cmpl $0xea1, (%rax)          # imm = 0xEA1
je 0x37ac7
movq -0x28(%rbp), %rax
cmpl $0xe12, (%rax)          # imm = 0xE12
jne 0x37ac9
jmp 0x37ae8
leaq 0x3dcf9(%rip), %rdi     # 0x757c9
leaq 0x405f9(%rip), %rsi     # 0x780d0
movl $0xd5d, %edx            # imm = 0xD5D
leaq 0x415c5(%rip), %rcx     # 0x790a8
callq 0x30a0
movq -0x8(%rbp), %rax
movq 0x40(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x37afd
jmp 0x37b1c
leaq 0x3e66f(%rip), %rdi     # 0x76173
leaq 0x405c5(%rip), %rsi     # 0x780d0
movl $0xd60, %edx            # imm = 0xD60
leaq 0x41591(%rip), %rcx     # 0x790a8
callq 0x30a0
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movb 0x60(%rax), %al
movb %al, -0x31(%rbp)
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movb 0x60(%rax), %al
movb %al, -0x32(%rbp)
movzbl -0x31(%rbp), %edi
callq 0x4d4a0
testb $0x1, %al
jne 0x37b51
jmp 0x37fb8
movzbl -0x32(%rbp), %edi
callq 0x4d3b0
testb $0x1, %al
jne 0x37b63
jmp 0x37fb8
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x48(%rbp)
leaq -0xc8(%rbp), %rdi
callq 0x2a260
leaq -0x148(%rbp), %rdi
callq 0x2a260
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x40(%rbp), %rcx
leaq -0xc8(%rbp), %rdx
callq 0x2d590
movq -0x10(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0x9100
cmpq $0x0, -0x18(%rbp)
je 0x37bf1
movq -0x18(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
addq $0x50, %rsi
callq 0x9100
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x48(%rbp), %rcx
leaq -0x148(%rbp), %rdx
callq 0x2d590
movq -0x10(%rbp), %rdi
leaq -0x148(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0x148(%rbp), %rsi
callq 0x9100
movq -0x40(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x150(%rbp)
movq -0x150(%rbp), %rax
cmpl $0x440, (%rax)          # imm = 0x440
jne 0x37c4d
jmp 0x37c6c
leaq 0x413ec(%rip), %rdi     # 0x79040
leaq 0x40475(%rip), %rsi     # 0x780d0
movl $0xd7f, %edx            # imm = 0xD7F
leaq 0x41441(%rip), %rcx     # 0x790a8
callq 0x30a0
movq -0x150(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x158(%rbp)
leaq -0x168(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x158(%rbp), %rdx
leaq -0x168(%rbp), %rsi
callq 0x299e0
leaq -0x178(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
leaq -0x178(%rbp), %rdx
callq 0x35980
leaq -0x188(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
leaq -0x188(%rbp), %rdx
callq 0x35980
movq -0x20(%rbp), %rax
movq %rax, -0x3c0(%rbp)
cmpq $0x0, -0x170(%rbp)
jne 0x37d09
leaq 0x3fbb5(%rip), %rax     # 0x778b5
movq %rax, -0x3c8(%rbp)
jmp 0x37d17
movq -0x170(%rbp), %rax
movq %rax, -0x3c8(%rbp)
movq -0x3c8(%rbp), %rax
movq %rax, -0x3d0(%rbp)
cmpq $0x0, -0x110(%rbp)
jne 0x37d3f
leaq 0x3fb7f(%rip), %rax     # 0x778b5
movq %rax, -0x3d8(%rbp)
jmp 0x37d4d
movq -0x110(%rbp), %rax
movq %rax, -0x3d8(%rbp)
movq -0x3d8(%rbp), %rax
movq %rax, -0x3e0(%rbp)
cmpq $0x0, -0x100(%rbp)
jne 0x37d75
leaq 0x3fb49(%rip), %rax     # 0x778b5
movq %rax, -0x3e8(%rbp)
jmp 0x37d83
movq -0x100(%rbp), %rax
movq %rax, -0x3e8(%rbp)
movq -0x3e0(%rbp), %rcx
movq -0x3d0(%rbp), %rdx
movq -0x3c0(%rbp), %rdi
movq -0x3e8(%rbp), %r8
leaq 0x40e98(%rip), %rsi     # 0x78c3e
movb $0x0, %al
callq 0x94d0
movq -0x20(%rbp), %rax
movq %rax, -0x3f0(%rbp)
cmpq $0x0, -0x180(%rbp)
jne 0x37dd2
leaq 0x3faec(%rip), %rax     # 0x778b5
movq %rax, -0x3f8(%rbp)
jmp 0x37de0
movq -0x180(%rbp), %rax
movq %rax, -0x3f8(%rbp)
movq -0x3f8(%rbp), %rax
movq %rax, -0x400(%rbp)
cmpq $0x0, -0x160(%rbp)
jne 0x37e08
leaq 0x3fab6(%rip), %rax     # 0x778b5
movq %rax, -0x408(%rbp)
jmp 0x37e16
movq -0x160(%rbp), %rax
movq %rax, -0x408(%rbp)
movq -0x408(%rbp), %rax
movq %rax, -0x410(%rbp)
cmpq $0x0, -0xa0(%rbp)
jne 0x37e3e
leaq 0x3fa80(%rip), %rax     # 0x778b5
movq %rax, -0x418(%rbp)
jmp 0x37e4c
movq -0xa0(%rbp), %rax
movq %rax, -0x418(%rbp)
movq -0x418(%rbp), %rax
movq %rax, -0x420(%rbp)
cmpq $0x0, -0x110(%rbp)
jne 0x37e74
leaq 0x3fa4a(%rip), %rax     # 0x778b5
movq %rax, -0x428(%rbp)
jmp 0x37e82
movq -0x110(%rbp), %rax
movq %rax, -0x428(%rbp)
movq -0x428(%rbp), %rax
movq %rax, -0x430(%rbp)
cmpq $0x0, -0x170(%rbp)
jne 0x37eaa
leaq 0x3fa14(%rip), %rax     # 0x778b5
movq %rax, -0x438(%rbp)
jmp 0x37eb8
movq -0x170(%rbp), %rax
movq %rax, -0x438(%rbp)
movq -0x430(%rbp), %r9
movq -0x420(%rbp), %r8
movq -0x410(%rbp), %rcx
movq -0x400(%rbp), %rdx
movq -0x3f0(%rbp), %rdi
movq -0x438(%rbp), %rax
leaq 0x41233(%rip), %rsi     # 0x7911c
movq %rax, (%rsp)
movb $0x0, %al
callq 0x94d0
movq -0x20(%rbp), %rax
movq %rax, -0x440(%rbp)
cmpq $0x0, -0x90(%rbp)
jne 0x37f19
leaq 0x3f9a5(%rip), %rax     # 0x778b5
movq %rax, -0x448(%rbp)
jmp 0x37f27
movq -0x90(%rbp), %rax
movq %rax, -0x448(%rbp)
movq -0x448(%rbp), %rax
movq %rax, -0x450(%rbp)
cmpq $0x0, -0x180(%rbp)
jne 0x37f4f
leaq 0x3f96f(%rip), %rax     # 0x778b5
movq %rax, -0x458(%rbp)
jmp 0x37f5d
movq -0x180(%rbp), %rax
movq %rax, -0x458(%rbp)
movq -0x450(%rbp), %rsi
movq -0x440(%rbp), %rdi
movq -0x458(%rbp), %rdx
callq 0x358a0
leaq -0xc8(%rbp), %rdi
callq 0x2c6a0
leaq -0x148(%rbp), %rdi
callq 0x2c6a0
leaq -0x168(%rbp), %rdi
callq 0x9310
leaq -0x178(%rbp), %rdi
callq 0x9310
leaq -0x188(%rbp), %rdi
callq 0x9310
jmp 0x3854b
movzbl -0x31(%rbp), %edi
callq 0x4d4e0
testb $0x1, %al
jne 0x37fca
jmp 0x3852a
movzbl -0x32(%rbp), %edi
callq 0x4d4e0
testb $0x1, %al
jne 0x37fdc
jmp 0x3852a
movq -0x28(%rbp), %rax
movq 0x68(%rax), %rax
movq %rax, -0x190(%rbp)
movq -0x28(%rbp), %rax
movb 0x60(%rax), %al
movb %al, -0x191(%rbp)
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq (%rax), %rax
movq %rax, -0x1a0(%rbp)
movq -0x28(%rbp), %rax
movq 0x48(%rax), %rax
movq 0x8(%rax), %rax
movq %rax, -0x1a8(%rbp)
leaq -0x228(%rbp), %rdi
callq 0x2a260
leaq -0x2a8(%rbp), %rdi
callq 0x2a260
leaq -0x328(%rbp), %rdi
callq 0x2a260
leaq -0x3a8(%rbp), %rdi
callq 0x2a260
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x1a0(%rbp), %rcx
leaq -0x228(%rbp), %rdx
callq 0x2d590
movq -0x10(%rbp), %rdi
leaq -0x228(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0x228(%rbp), %rsi
callq 0x9100
cmpq $0x0, -0x18(%rbp)
je 0x380a7
movq -0x18(%rbp), %rdi
leaq -0x228(%rbp), %rsi
addq $0x50, %rsi
callq 0x9100
movq -0x8(%rbp), %rdi
movq -0x10(%rbp), %rsi
movq -0x1a8(%rbp), %rcx
leaq -0x2a8(%rbp), %rdx
callq 0x2d590
movq -0x10(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0x2a8(%rbp), %rsi
callq 0x9100
movq -0x8(%rbp), %rdi
movq -0x190(%rbp), %rdx
movq -0x1a0(%rbp), %rax
movq 0x68(%rax), %r8
leaq -0x328(%rbp), %rsi
leaq -0x228(%rbp), %rcx
callq 0x2a360
movq -0x10(%rbp), %rdi
leaq -0x328(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0x328(%rbp), %rsi
callq 0x9100
movq -0x8(%rbp), %rdi
movq -0x190(%rbp), %rdx
movq -0x1a8(%rbp), %rax
movq 0x68(%rax), %r8
leaq -0x3a8(%rbp), %rsi
leaq -0x2a8(%rbp), %rcx
callq 0x2a360
movq -0x10(%rbp), %rdi
leaq -0x3a8(%rbp), %rsi
addq $0x10, %rsi
callq 0x9100
movq -0x10(%rbp), %rdi
leaq -0x3a8(%rbp), %rsi
callq 0x9100
leaq -0x3b8(%rbp), %rdi
callq 0x8c90
movq -0x8(%rbp), %rdi
movq -0x30(%rbp), %rsi
leaq -0x3b8(%rbp), %rdx
callq 0x35980
movzbl -0x191(%rbp), %edi
callq 0x4d310
testb $0x1, %al
jne 0x381b5
jmp 0x38283
movq -0x20(%rbp), %rax
movq %rax, -0x460(%rbp)
cmpq $0x0, -0x3b0(%rbp)
jne 0x381da
leaq 0x3f6e4(%rip), %rax     # 0x778b5
movq %rax, -0x468(%rbp)
jmp 0x381e8
movq -0x3b0(%rbp), %rax
movq %rax, -0x468(%rbp)
movq -0x468(%rbp), %rax
movq %rax, -0x470(%rbp)
cmpq $0x0, -0x300(%rbp)
jne 0x38210
leaq 0x3f6ae(%rip), %rax     # 0x778b5
movq %rax, -0x478(%rbp)
jmp 0x3821e
movq -0x300(%rbp), %rax
movq %rax, -0x478(%rbp)
movq -0x478(%rbp), %rax
movq %rax, -0x480(%rbp)
cmpq $0x0, -0x360(%rbp)
jne 0x38246
leaq 0x3f678(%rip), %rax     # 0x778b5
movq %rax, -0x488(%rbp)
jmp 0x38254
movq -0x360(%rbp), %rax
movq %rax, -0x488(%rbp)
movq -0x480(%rbp), %rcx
movq -0x470(%rbp), %rdx
movq -0x460(%rbp), %rdi
movq -0x488(%rbp), %r8
leaq 0x40ed0(%rip), %rsi     # 0x79147
movb $0x0, %al
callq 0x94d0
jmp 0x38469
movzbl -0x191(%rbp), %edi
callq 0x4d360
testb $0x1, %al
jne 0x38298
jmp 0x38366
movq -0x20(%rbp), %rax
movq %rax, -0x490(%rbp)
cmpq $0x0, -0x3b0(%rbp)
jne 0x382bd
leaq 0x3f601(%rip), %rax     # 0x778b5
movq %rax, -0x498(%rbp)
jmp 0x382cb
movq -0x3b0(%rbp), %rax
movq %rax, -0x498(%rbp)
movq -0x498(%rbp), %rax
movq %rax, -0x4a0(%rbp)
cmpq $0x0, -0x300(%rbp)
jne 0x382f3
leaq 0x3f5cb(%rip), %rax     # 0x778b5
movq %rax, -0x4a8(%rbp)
jmp 0x38301
movq -0x300(%rbp), %rax
movq %rax, -0x4a8(%rbp)
movq -0x4a8(%rbp), %rax
movq %rax, -0x4b0(%rbp)
cmpq $0x0, -0x360(%rbp)
jne 0x38329
leaq 0x3f595(%rip), %rax     # 0x778b5
movq %rax, -0x4b8(%rbp)
jmp 0x38337
movq -0x360(%rbp), %rax
movq %rax, -0x4b8(%rbp)
movq -0x4b0(%rbp), %rcx
movq -0x4a0(%rbp), %rdx
movq -0x490(%rbp), %rdi
movq -0x4b8(%rbp), %r8
leaq 0x40e02(%rip), %rsi     # 0x7915c
movb $0x0, %al
callq 0x94d0
jmp 0x38467
movzbl -0x191(%rbp), %edi
callq 0x4d400
testb $0x1, %al
jne 0x3837b
jmp 0x38446
movq -0x20(%rbp), %rax
movq %rax, -0x4c0(%rbp)
cmpq $0x0, -0x3b0(%rbp)
jne 0x383a0
leaq 0x3f51e(%rip), %rax     # 0x778b5
movq %rax, -0x4c8(%rbp)
jmp 0x383ae
movq -0x3b0(%rbp), %rax
movq %rax, -0x4c8(%rbp)
movq -0x4c8(%rbp), %rax
movq %rax, -0x4d0(%rbp)
cmpq $0x0, -0x300(%rbp)
jne 0x383d6
leaq 0x3f4e8(%rip), %rax     # 0x778b5
movq %rax, -0x4d8(%rbp)
jmp 0x383e4
movq -0x300(%rbp), %rax
movq %rax, -0x4d8(%rbp)
movq -0x4d8(%rbp), %rax
movq %rax, -0x4e0(%rbp)
cmpq $0x0, -0x360(%rbp)
jne 0x3840c
leaq 0x3f4b2(%rip), %rax     # 0x778b5
movq %rax, -0x4e8(%rbp)
jmp 0x3841a
movq -0x360(%rbp), %rax
movq %rax, -0x4e8(%rbp)
movq -0x4e0(%rbp), %rcx
movq -0x4d0(%rbp), %rdx
movq -0x4c0(%rbp), %rdi
movq -0x4e8(%rbp), %r8
leaq 0x40d30(%rip), %rsi     # 0x7916d
movb $0x0, %al
callq 0x94d0
jmp 0x38465
leaq 0x3a00e(%rip), %rdi     # 0x7245b
leaq 0x3fc7c(%rip), %rsi     # 0x780d0
movl $0xdfa, %edx            # imm = 0xDFA
leaq 0x40c48(%rip), %rcx     # 0x790a8
callq 0x30a0
jmp 0x38467
jmp 0x38469
movq -0x20(%rbp), %rax
movq %rax, -0x4f0(%rbp)
cmpq $0x0, -0x2f0(%rbp)
jne 0x3848e
leaq 0x3f430(%rip), %rax     # 0x778b5
movq %rax, -0x4f8(%rbp)
jmp 0x3849c
movq -0x2f0(%rbp), %rax
movq %rax, -0x4f8(%rbp)
movq -0x4f8(%rbp), %rax
movq %rax, -0x500(%rbp)
cmpq $0x0, -0x3b0(%rbp)
jne 0x384c4
leaq 0x3f3fa(%rip), %rax     # 0x778b5
movq %rax, -0x508(%rbp)
jmp 0x384d2
movq -0x3b0(%rbp), %rax
movq %rax, -0x508(%rbp)
movq -0x500(%rbp), %rsi
movq -0x4f0(%rbp), %rdi
movq -0x508(%rbp), %rdx
callq 0x358a0
leaq -0x228(%rbp), %rdi
callq 0x2c6a0
leaq -0x2a8(%rbp), %rdi
callq 0x2c6a0
leaq -0x328(%rbp), %rdi
callq 0x2c6a0
leaq -0x3a8(%rbp), %rdi
callq 0x2c6a0
leaq -0x3b8(%rbp), %rdi
callq 0x9310
jmp 0x38549
leaq 0x39f2a(%rip), %rdi     # 0x7245b
leaq 0x3fb98(%rip), %rsi     # 0x780d0
movl $0xe08, %edx            # imm = 0xE08
leaq 0x40b64(%rip), %rcx     # 0x790a8
callq 0x30a0
jmp 0x3854b
addq $0x510, %rsp            # imm = 0x510
popq %rbp
retq
nopw %cs:(%rax,%rax)